summaryrefslogtreecommitdiff
path: root/graphics/pbmtopk
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/pbmtopk
Initial commit
Diffstat (limited to 'graphics/pbmtopk')
-rw-r--r--graphics/pbmtopk/README8
-rw-r--r--graphics/pbmtopk/doc/Makefile23
-rw-r--r--graphics/pbmtopk/doc/beast3_300.pbm.Z.btoa198
-rw-r--r--graphics/pbmtopk/doc/examplf.opt10
-rw-r--r--graphics/pbmtopk/doc/examplf300.opt10
-rw-r--r--graphics/pbmtopk/doc/name300.pbm.Z.btoa18
-rw-r--r--graphics/pbmtopk/doc/pbmtopk.ps724
-rw-r--r--graphics/pbmtopk/doc/pbmtopk.tex179
-rw-r--r--graphics/pbmtopk/doc/smiley300.pbm.Z.btoa6
-rw-r--r--graphics/pbmtopk/pbmtopk/Makefile28
-rw-r--r--graphics/pbmtopk/pbmtopk/face.pbm66
-rw-r--r--graphics/pbmtopk/pbmtopk/pbmtopk.173
-rw-r--r--graphics/pbmtopk/pbmtopk/pbmtopk.c1050
-rw-r--r--graphics/pbmtopk/pbmtopk/pktopbm.117
-rw-r--r--graphics/pbmtopk/pbmtopk/pktopbm.c381
-rw-r--r--graphics/pbmtopk/pbmtopk/sign.pbm302
-rw-r--r--graphics/pbmtopk/pbmtopk/test.opt8
-rw-r--r--graphics/pbmtopk/pbmtopk/test.tex11
18 files changed, 3112 insertions, 0 deletions
diff --git a/graphics/pbmtopk/README b/graphics/pbmtopk/README
new file mode 100644
index 0000000000..b646f98d01
--- /dev/null
+++ b/graphics/pbmtopk/README
@@ -0,0 +1,8 @@
+This directory contains the PBMtoPK and PKtoPBM programs. The PBM libraries
+required to compile these programs are available from expo.lcs.mit.edu in the
+directory contrib/.
+The PBM library is the work of Jef Poskanzer (jef@well.sf.ca.us), and PBMtoPK
+and PKtoPBM are the work of Angus Duggan (ajcd@lfcs.ed.ac.uk), based on
+programs by Tom Rokicki.
+
+AJCD 30/10/91
diff --git a/graphics/pbmtopk/doc/Makefile b/graphics/pbmtopk/doc/Makefile
new file mode 100644
index 0000000000..033ef04ca0
--- /dev/null
+++ b/graphics/pbmtopk/doc/Makefile
@@ -0,0 +1,23 @@
+# noddy Makefile for pbmtopk documentation
+
+all: pbmtopk.dvi examplf.tfm examplf.300pk
+
+pbmtopk.dvi: examplf.tfm pbmtopk.aux pbmtopk.tex
+ latex pbmtopk.tex
+
+pbmtopk.aux: pbmtopk.tex
+ latex pbmtopk.tex
+
+examplf.tfm examplf.300pk: examplf300.opt\
+ beast3_300.pbm smiley300.pbm name300.pbm
+ pbmtopk examplf.300pk examplf.tfm 300 -s 20 -f examplf300.opt
+
+beast3_300.pbm: beast3_300.pbm.Z.btoa
+ atob <beast3_300.pbm.Z.btoa | zcat >beast3_300.pbm
+
+name300.pbm: name300.pbm.Z.btoa
+ atob <name300.pbm.Z.btoa | zcat >name300.pbm
+
+smiley300.pbm: smiley300.pbm.Z.btoa
+ atob <smiley300.pbm.Z.btoa | zcat >smiley300.pbm
+
diff --git a/graphics/pbmtopk/doc/beast3_300.pbm.Z.btoa b/graphics/pbmtopk/doc/beast3_300.pbm.Z.btoa
new file mode 100644
index 0000000000..3853c3f404
--- /dev/null
+++ b/graphics/pbmtopk/doc/beast3_300.pbm.Z.btoa
@@ -0,0 +1,198 @@
+xbtoa Begin
++.\Ki@OS_u6O&>a2/4Oi_6BWNLCb\&S4KoZ_hAj^C>?<2,KGif5C*`0Z=Ln9-<$3uWNmg?Q7cZJKIO
+5S7%+ZsfPHCcVp1eAJbk<SF=9q[87<3,\ru=)V+s<CNV\h'c\sT#>0T$LX$r^f]i#7h<[-5&2pnWfX
+0s2+[S#L:PoEV7f"5'nBN=r</QfT,!D=.YP&OF=)Z0(oS<u%_MKg@9/uoiV?cOrWB@]2M11eb%6(8U
+;P&smKP#I;3]_\\nLTJ2/hE'EVdaWOo^V754D==-"-Spu\qfgi?]k^PH*gO:bT"'K(rp?4ioqY%H7O
+6jGpuUSn_c)%%]tEe'keUK9M`S=inRLPH^5eGl;30i1CUYnq[Jd#>m6qV6n"ghhJc>=T)FjQ\kh^@f
+P4kMDpdqC8K*,RR@>(k)#hjqnJU#_!%d#^?J,ge'+FFW=6sto;`M]G`*ce\cM)_6>iJaLf=AsqM\Yu
+2q4qd)uNuur/R6Wdl=C@*ZM-&\,09->"BLpjU,\'t+d%lluD<Y/b7$76eDBKC6<0k>)M&D^6_.h>'?
+@M,]G%*3Rk?;JlW*5WNY'FSmDN:,4?'3ZOkFF:r=f@p?k%(0I<]V_jTJSh^QXkt+)J#TLC22C\qiNi
+%7V^5&BnrDq[V&49U<9I5N:+2jP3A0GC6_bq3gcDAWbUe&9?p/1M>&#O.Z8%^(D<pgL3b;R/%-p.FI
+aJ2-E,JOWo])^l7-M@Oi"\@YU#n]R'g.`QYi_UEgs&;RK6!_Zf?cJm:#W.f<:n7;O-.OjFWkr]KIb1
+W^HY%S>s*2qDtac#Q>*F^ekQ"Y=)_AN2spRfmE2-$qkDKT=L)bm]R:J9C9BHkuT7*;qh(g_?N>3El4
+f`(EKRTY$;g`E!a36RW$^rU;DL"h9jURURZ8PlYYtVc+FYU(Xl-eQun6-IgbhQ:hNn298QOUE6Bq6l
+o(S(p'%nLDn#*haV"R>':h2!H0!TcCV:CVMToF@h)Jbu2q3c/`+711Z^j),@`*&jD^p1H[,C*V$9@,
+Uc\\@/P@FoDdp+,o2pe;&^A7#D3SdfoC7eapeKTKJ1$/)*^:3E2Vds,>S54oSj$n;7ETO(hmW\27"-
+7`idMiM+C`FW`\:ZRr'RK+q4286!>n;E'op6cg1?,ltSoKVCHZ/K+aH7RMmkL@RI-Z9:h>?laRE2#_
+7hQdjl=eM->l3*m^ii_=Fo;,ASFB$5H6MTt#3=>/MAADL0s?./Gp!5_,/OWfO?[P:TAqQF[jq&F0&N
+oUfjKTOr[CZ72P_8t(YCW"XY>M=ldX2m\2t6#O,!H\iUhf$4VK$%K/rO3oP@VU+j.!3SL`\05A3!,V
+=0-uI%g5)=MZD.XG5#`::@<]`R`PbLdZpV:fR3Z&iNT`1(;rU*nMYo9'9!GEfV'\fK;/`/rr60itCa
+X89:>@3Np7,_$l+5rW1GjR%0ic]3)Wr-LZk8/>*-dLe.$'7ZqDSU=GbKaLqQcMI;C<-Y:C6,nd5@"Q
+\#V]0i$ooeD<+;kr_F8]Y,%OtO%eMut$05=Q-g9Y5rhBMpY.$arHE,i[(,C`1#jNmEg]o-,nV8[Akh
+&tGD4$uW)ebqP.k3.eML1!b&;(fIT.ceN'7nd/#G/k2E"9&i":ff21$Z(4\=-P&;\aZ2,?T$D-s*mp
+rW`+Vhs#`YdCp]`d]N09Oa4=!?mpV'_SNeum\k:F@s(n$5=NXd(37i=83&N5l3%/o!P48:@Up9U?p,
+YWh#83<HDE^(d'WDR$#:n001WIE'&8-QNQM69gRQFl?M1E%U)8M$_;]@oeMl-B@sPc+DCkYK6Vba<g
+9W!@b7ICNE[-T:XR5cna"eU#iI8Th.:%4>QG#1pB9F`9YMCF2@$=-h\WY<"hJ1%C+6BI:)<[5)Dm'c
+Yj$M6aEc9kRj&]2u^)QE#E<lsjaT/]2;2UT$uKj/CSSdgA":s,=$i-Q>P8iAQU-Tk'L_"k3$Va"suC
+A8!L9<dVi.\%L84=de"!TU#bNi$thGTI\148[i)t[;-pUb?XV\9!2k#CNrjj>/u@/]-PhmG*CZZS_X
+L_oSlmnEsbpg*d,0=9WMl-b?q0u;Lc6>Y?1>mh&"p,:]T).E_0G8hZ@l1r&QK`-2^sT^DFTjL)<tqS
+DNYCE5UoiZ%;l.?@550S7W]oHOJ&,j$(gQJM]*-I?r'U'_ep1m4W7/ls^j5=N;gjDMR'Ci?.ASRmS*
+mJCWA=&W8Th.ir_sVekE=kKUU#-*'!opn/U&NOt+nE.a@U?\jHIXT7/HdkpFH$8]5gA1hp]Oh=m,@l
+Zo&?0%L@]O[5OQt%fKd63&-i"C?[c^QeoT?#^EgtJ($1tJro'7EdOG+$-6`bJE4Be!0NMlUM,FJTlB
+jqcj_\qXe&D)n_3bMm6[L;)%1:+bQN*nkF]DNgVWqqGBU)M)iKG&:7BAFJ?;f>^:'X=^DeZ)SVaXj4
+;#6d9+DHSa3FhQj)&X1]YWM9gCa.'8<*mR^@Oc^Kmg[PdDg(e^@FYdX0OD/&F$+e%;;_H/kO\L;:K<
+86Hqp:nEa@+<b3an]PV:#MM)k4+D[rk>jEq04TG2fm=e(Uq:rXlaW:)W\a6Da)^iTGLKG[F1>i)Aeo
+!I)C<f2-0L?QS#1iM]C3O9t/9X3q?m8CYC\J&B!-kiCfNheNi"OYt][fW'<H/B4^m#onR(HbNt*l(G
+hm"??NR&m`rG]\\*?N91;=<itA.5]']-mWHj3Z?<4\pffjEe++<Thf/]26b%iLoHJq2_9U"bEnS@]?
+llW]_e&U`keM@'YOr$42;gPIVR/-3,pF1<V`-AM)*okhs[bs"rGr]+%nsDB5e_ABqQR95r^7Mr)"j4
+N!)=6uZN+'['/plKN*VQaFIBlNC<VBf+a%t!ImNkRM!udfVg-TQ2q%!1uLY^D":]A[QY>OBJk=bsJD
+!n3,IdRO7_V+D+p&dPYaZmLu,aYC6;$d)u#q)<1KO<("1SRB`H(c8S7k;L90Z&TcqDMNB=)3SXF7mS
+"&YrC;Z8##c@n<L9[:=`,7=3Z40b'Lqb@a?X3$S1==Moo;.$\FL79j0ID,.B&M_]oYGCc\_K(J/RCI
+`l6G9/95InM\B05,%G[T.M@9>;9h)74kcV)1K:C'UYa2RckmG83J9KIpkjmADag6X91`FJtO<o*%>[
+nmWMnJQ,R"`Fj`gQ@^9cKj<hl&m&V7kAh-2'0(PnAJck1kUEjCL7_s2DJ4_I7tFBj.-gP]-YS9A2h4
+oiH$mV\Su+G,_AZQjLcn:XMPt7JB1Ir;Lagr(A8!.L-WRX"G%X?aX)o`17<7O4L_]]@NtmQF22\edK
+oR!aeX(it[#1_>E.3NmUdn7\ogbNcDkC^#p6UDtPBsp0Ld1*V(e8gtO]2=*L2-C=eoud%-[2R\Kr"K
+oS0Wl',`Uo1LV(We`.X-!ZVA@d=aTq'N3m:P-YuQPN71m-\<p=XfT)fLIAc:B+..MM#ALm6MF5?IQe
+6<IQ;!jjO$&)U^_D(mBTC%:Of3gGY[MnHF+bS.2&ccIGfPcnk_ZTUOV\msbt*p]3.20K11rA"kSJg?
+U5j\6ND^H`&rDdsW-SEQ:K8g))Q@dOfTAdO+hAMH4-l(@+^t`@NkZuJ2\LQ!pl[B-9gab)=dbEe\Rb
+s=>t`j;=QsXf.$%>A-SG453d,,6GV97g0L_t+500"2fNj(!P7n.U=lq0=dN3#;:<jZ*3N84DLlWM:M
+f;`II(>;eq*-Dj7?D/Hlpu]J&stH-R"j:^<CCbOq0&u">e%+R`.ok,M*@#8M]!s`A#Y=dk>Im3S%S<
+"&%@kEdQ`dqR<BH-?+F^_$'p\k7lo%]noJ-IM+Y-HRro$s'=W3H[$ruZPKT,X%_8%@\;n:gPbkg#d(
+,[QfplZQEXd;ai^o[jBdhQ3QU$D!@>S(*fpsFW6/WWPD&J4IWJt7&PcX[(^Nj\`\WuSs9&(kfo8/4p
+fpQunT#mBU>+qSOR7-"WG9nUTYGE$1,b=fmTZE?iLrPPKR@jmhR1-*W0En-eq-9O-MZX`3qD_2$oP)
+C&7:5YYD98D(`$dOr7dDCqJ9aLT"ZGc!2bLQQ,'c1*.Y8d(Mie^KQmGaF+cbhtJf%+K/>P0,F=`+0U
+UJ[-SE6HAG:EJK3">/IE`7]j31Y]`Uqu_*@?IEJ7&=bCRD=WT=JVcu$E!]#J9lMY-V9mog6\Q@L@P)
+6S=uH.l:aROUb9eu?!("kA=t#jTUD1FL"^9Ef;BfYV#=AfC<Da_aHh=!-<83cXlZF;M/&QWTb.V[gL
+I(5=>erLJ<jq]0YsZ+qCIBQWWbDW!=G1X'<%%;J.!5ta-!;WP@CkeO)R*llLB@dW1Z9Y20:j\91acn
+=f[Mh5oA`VJ%-PPfe[8UT+bA)Z0A6sb,d95;2E>111m#d$EOBKW_fRp;Wpc,)Bb8JWV23>.;3f[=KO
+O9X+r.&*%@uZkc+.<@YTbQD'lID)QaJ3<nLlbff+!'$>B;TU0K`Kkd[bD=%rc)Z1<,n[1fB#Zn5N11
+0hkeYc28Za'_P2*6]n/oMhoq>-Sj$V\_jh)iL@0l`jY2?LDGI-p(&X$EtsOYc/mQ/8MT>qQdc68eBU
+U*@QG1HSme+I#,A?2]+U#LQ+F>SB1PC6b@\1M_.dC>?T^bpSY5p8KK[dWE8soio22'#TZn*AFU!`<j
+oGNla:)oMn"OeP<,X2/$/tAL\!m6%Ot&L$FiQ*A[^3r<r8#SQ]E,sE(3Hf<b7-UaL#?_V2^eCJigLA
+#AhaVZAC*3).srupIs*R[BM\[4pJ<ZgM(9-R4AM&!ZSU$4&GeU+tMlR(C*R%gDT:VK;O",PtG%oR?3
+>/\&7gER9R*'[&_gCE3)]hKc>G:n[E(.U"g$UBIg7?jGVi0D"ctp=6;3M>)D$j'jHR/Zo_7496V:)W
+>\+%l>"#O\W,3`Tm5cW]^*671UC9n]e&2X"M8A'#I_]H1:\a7`[-2r$`Z9I^Sk#E7L#G*/>Np&1&%`
+/rHlCg`k-_!Qi_Z)%7[jCFs?ga_/60e-+^$07Ptcn=M(;8*1Xn0ep!a4Nu75R4BYXQe\QZlXmm4EO*
+b?.p/VSQ]eW8[S#K(Pl;923>rZLfj>"R'QkiO$']N?8o)$5j1bN((_b_mRH5J^8!IHA+\%sQ1E<iNP
+N4<@J]E.3+Qp_V+pm-F(0U_eT/DS8ZkWiq=;m/i:!.#<mU:7X*4<2G^b`mlmplJ6RLito#ULq:;(i@
+03a#f1!k`r'\$Z(gX3fOQh>)Zfsl7:#u'u.8G<,?(3.[[\]<+?oinXH*=CWX5JaT>>&B3`/oLRgWP<
+4I7f3pajlHci;2[a-=pk,E+WVT#Sea:#L!n["uFb8t;Bc&U"9LDW^!=,.$WahqAoREWZaBmdt6c@WX
+>[Z[V0=j#WSYEKs5\K&:_9Mhd[Y,2'01b$4>e]!0J`LQ8&X!U@T)jgZm]olkh48cWeA%q?3D@UO&1m
+c)h?-`_F,5=8Lk/>C>]WHIj[+G/f?;/Y!g:J2uY6"T?g1[CoQAqVKSo*55%@DS//C2.ZckK.r2E[%E
+RY5FN*-l75MUaMggW@=rFs=Md:`MXQ4NEF3Prfl0d!O6IlFnK)^/O#=e;HqA'RrA[IS`+)bL<WV;:6
+C7dNK&Bdfn8i9uu%t>sDPt6O_F8G%)"/[X4sr?N$0<qSb.jU*r@=s7]/LROVLCZ:fRV8DD_#QHgKk\
+quBi_-F..>TXo5_?YA!01%]nXOat`RCCD]9/kKp/Xi]PfY3[(YKP;AbL1\FOg!!6itY7QmAQg#W`_s
+</<)St44h5>e(?D/dc\E4MqXn`YiR@e=A@Od6-,a*e!b..f8SIT^"K$+^Z38;H[3"d%Ecr&cmE%Fr`
+b(`,h(r1@i*]R5&@ajm+FWTD!]E:36^+34XZCBhQ@=7[%3<8?+B1%fq[iXE/U2C>dq>Y`Ad16HgBOh
+S"b&LUGk3D/Qk_#4O:,mKsuGIe,A2<.>cY^iafX'!tNdf/Y<G78<OsFY)C<Z%DZFtd3d7];I-3`qf\
+$tge]ub)==LY=?[o-f(j1@cgA2DCRC,#*(BkT!D_Rdio2WZdP64*$U3QL8Ba#AMI3@Cp"7_BVLb6he
+4#_JMc;i8h8ZBCP)Zok?/=SsSEEXqig9N!G95TEma>2Ii!cd@:#>!h^#0e)I:mD.&/.FMA[t3k6Y"t
+iG`EDUcJap'?A6jnOR&0SmH4<%+\E3n',o9N(Pp4M@SUgeq]gi(>!omei7-$,\o$RJrT,"h_gEKBN%
+Se%'9$tWkt,c&NfDqiT#%=Ek'm9C@%?N:4OtRQkD$/+08dVS:;d1ahTbKR[gp%Ulqe$YC@\LVP83Fg
+%53uJUL0TOiVUiBC>j$NkErBQ^tHs6*USJSj`nMl((>mlM)MVf,i"uZjV44Krf2m15)kA+KIu@%_hR
+^\fS>aJ:!L3Z[bX>h`3?ARiYU!Ta[B.Cmk&tLeUHH.?HiQoR]9J9jLr2MT&XVCn*Z'cRnVLp<9b'Vm
+\NXZH2PuFDlisY[XpLpbLl$Amd,60m3iM;@En<Ec@bG<IfC]>]BYdm)j)oe(MOQ0RcC-(ZU"othVS8
+';0h]hQQ>RU[>$h!WdSZk0'EHqng$H=\]sF9^>;h=fIYp>ZSg\i52HR[ohS1-MENm[L"p-ejOAY&Y3
+4GNs5Yu:nP%g)`q8tDs7@W[kRP&\JA01tUX`[Gk;5!J?G"q7?H-ugH^KhM[ENon*Q]&Oo1>F'a51>f
+%E;2XnPF/4#1%nISu<r^.[>";bO![?D4h!Ons!/5LRF$)"Vs3QdH1=p*LLiV)L>m:nT"U#qei1W9?*
+#Dl9S52h4FGYs5C-lIC,:,YC5LN,5PV?[$=-$A,lFMs'gJ/k3W#c#as@e#?q?sj]0[I+49=m]g\Hi*
+dpNR[bQ%F@f0$dnLnEar0BjNbB_t0DumQZ\FS>n]8?t;Dt?s\0rFfu(MrUNbpJp6/XLP9gn2^36FLT
+rm&:^JjQr7lJ:Ld9b2p/K1li3m"WV+u:e/Skg]RG`MlsjHOmY-p^CiNU171g0JPe#Afs)=fq:OI'[!
+)uKP9iGT\+-3N$`eFJa2g!K?<8&.Md1O=?u-*$5;H=,@MJgbHTKOO/MM`SK.Iklo7G$n[Fi%02h`S]
+F1PfVX^RbWe#)qM$k`\]?=p'[^-a4MA_>0u7[K*=3@HkS"#3A(qb]qCOrXh)"[(Y7.8+l2Xco`N4m2
+luOS@LGi:$*14Abh=pn57"F=sM^nN^*pjG)Uk+YfFhooZRY(WCp[+Ui65d&CFrE/4&keKh[nJ[!K9'
+iLt;4drd*=NtgB1lU#;o.45tA/n.E563YL)"?=Dn]HFfd-g-bYIEao%?R>`VG7eb"rJV0@,WJtG;N-
+PQ*2J:h%EX?*)H"FPBB.]B*J%g1/)"EBbudq\T^K2P#O2h?Rkg?Zp<aY6/$MXK`n@1aZO_P@Q[U^Rs
+8bR'rEZ?[K8U"*3=`PbEr%BB@u)OPS<XV.Lm?4_2Eil7cL'#G?X<P?,%I:D'1#H*./jqJCVFlQ.!<N
+'!m<981-.-0W"qN@6`gk`D+Fe`/p8V/lPAYIj0tsr&>Pr@"]+(XF1LlfXX;Z("BP/NJU^M/I?;`93-
+&$a?C7a5d;D3_@:`'/)NCHF&13)'r:]FFp=$cMi)gV'RghL<hrF=>"!K9LFY]SblC[=*4bBlAEYCm6
+f"R"b26QbM+7$1BJ7Le#\d[a3e]h2l34W02mIZN55ZElE>URO65WOf@Or4J)\*_)\(hZ-]hU<kMIB7
+5-:YW<)!MH>R#LkNp2)@tZmeN[,0P1TEG>6`pX(<K>]%,4>%RO>7N$3*<$MsJ-Mi\SnN;&>E+BhCqh
+l2,JCuA$kQLFK0Y<"#YQ$&LV8j$HiZFDET*1b@]Gj>q!i'd@NhM$`!5oQ';1.#;HoYhZGWEeA8;F"q
+14aZ)1"OaW[5TO&ephLA=c<Dg_[%"Nn<7)'MYRf6]#W2(r(*J_P]VTk3pI)Z3!hrMbaWDY;>\l^UZ`
+?2,BE@6/s5Z-O5lVn8tu_2LiX%_V*tE_(H`(ZFEN-b4A*EK8.i=k4OI:n:'u#4U\CZiRu`eDT<ZcXS
+L"O;r#^J`?uD+^1b[I)(C=Pi8p2U<$8""KanX)L6p*BJb0f.ZcT$N,,_!sZGjTR24aG*qM$/YLI+U,
+%o#!"m"o6O5PEPhN(`ko'W8"92W,j<:Mqe:r\2-d"gqhH&h_BcfY6!k<#fUqVGRG!?iYcu3^j[:Q1P
+!tC,BbQieE87!1VAm[YfRV&*f5g=TQr&P1QadS1")m3l(^C8IF^-VJMK?2WZWU34GWLqcFM#6aOmA#
+^!h@,7MEa)'61=<,3^&2Ua]tB3"`M@-Y25C-BIQ%+V..9cbQ57CQ#@ba`%UA(_)\ii@0k..70a]_+5
+J_hQ#UkA*G8Ca'kr0J;&Y<;Z=j5@Q99((&\XXjE\#R>;8KMQ5J.Y3L#F`nBiO-[&<=;j@,T"^f!4:X
+oq9B^E0d^:$_,.\B>N9pE$/c*,U,i.u(QcnebN^^=7b!;Ol:T.gR*?(oIEu"Ojpg24FjXl(3U=%VO-
+W5*to](agZIr/R)JCCM>874`'T12N.1lCAqd2X&<E=b@]O,-]7-Z%?+10uk5LC&O$cm2HWtG<R?GTp
+\L8>SKQE`:r?C_o/":&:PHPWX404fpiD;&'>4'8Rko$MT?]`<Omn[JPDie-uGD@,]-(#;,#5D-oWNN
+\Up'bBV!A\ALSZ(V_DVF5t=[<c/YNV4lh2$Ol+S:?:@:a!EWlk<$H\XZ=,9mdKF9AEu9A1OBt@8A=8
+/VQ)g'V`=HVGYJ\KZBFgVhJs4$9jYPa</"%C;1isO0&R%qUL[H'`=O`,WC"#M>N5cjE@c%fh1,!*g_
+$1Z@6=/V5Je'<m"\k\i!83e)UNI0Li#0i7B-k#'3J8.fOh,PP3CsZW9H1m;II_LNc-GK28Z/.JEgbq
+qA^/`eoCC?0Z'm]=5Zo$uG;E607PfEI:;+&039`)7S6^N!Z896(5>=&D''Ab,H7I$]R6']2/k4Ooj.
+1e-7XiH@ff615:8E;0;%3lZX%!9uh2"+b;Q%OBW4,@^+K,BjTZFHFWR(lr%r3KgUj!]`meJR<fLci"
+bWB>gbZ_P2&um-!?b5TqG-h#276]BB=kWYIEE\QTr^n`O.72q`6p:c0S1Q6`F;TL@-4CG0FG/)Z''_
+f5?_Z5DGEI]EYPRfX;b@Ip7=PuER5$8B.G*.f</FiO*I8FNKd/s`&A:dfZ\ZcM:N8jnAn/c+Q>jOAW
+&Ep1UZ`FE:),P5QpsMe7j7$/16B/OmE)_T(`^/GQcl+Z'PC1hQGM.h&5oPYRY[(ade5+2]oXLnH%>4
+a'g(rA7QobEo9So8q2*KP8i!4T>U5XC7(tZ:j]FM)B!6KTS`l-)7W&k?k>NZ99oNi=;2IOC-P6WY"/
+I6$LLI!3#RaM%"q535MMXs;N:f#ogO!t7_oWTQT6tl9AL*TKOEa_ZQA]Oi94QYpOJ&RfPbucEfnp9=
+3Gjp9oU,b:*NBQqe"gfX^(-nuPS9CfG\&q9BpV2=$G1i":[-q;,^,bYPql-7Bkt<&RSo=q"\aA)NJ8
+@rUUF*?o+Q-;22$"W][PTAC?t>EH;bu>9KO_8Tkb).,<f'FKI(`<*ta>(@YR(`^dh5SPQ(c&VmMKDe
+B<M?$`\0'OT3gjm`:N:'KB8e9Q[,1+@T5Q2MdeJH9$??;eA&<,/eOpe^9S8F*)d,"HXo$r*mq#W_X.
+[4sq$kBAV-am%9qfTJff`MPI=h?KIKN/tSdHmF'Kr):ELr;"0*hP0\CnDqA9CT1ei6NRN!lTl`p@Pq
+>r"3FS#(LJ:pMq$<T1P":VDlG0(L>uK4N;,sgNeG\t>s/JkbW_d\mfX]e*9kWJH)g+J&Q,(VV'EdB/
+nJ\Hh.L_bGppj>P.TLm_+>Th49k86JSKZ`d5buqaq9-!W>dMXh-*,lY[D#\oH;Z8M=M[c]1hsk7fOl
+Li,JSi"rW?4gesU8Y:"(l:IDcm"`2Vc(9u$#B%'T'H>*dU@qDCR03\5C/<2Y2>lPa#<.=7V^RFUo:<
+lg(tmAU?eFOj>AW`T*ELG5.XRBZ/-c`Ira$],G]A]5s(`QDm/.!K#K-dEY`,AelM9E^1Q9kF;IBTEm
+o6GrM3;aW*8?)(Km^[=o#lP3@\;`q=7:K)ko`L._5du@mrk-^V[$Y<INkNeps;Ya83$J$Y9('*:r!h
+F1Eg]a[9_C6-45Flp6p;l7G!UF&tl'%A\[DC!@21uh?qQ#CjZBAmBf"XVZ/&B]4j;73'MK7=9`*qbl
+G?qLE"oV0KAX1WZirF4](6StZ00OX\RN<4`;I"7d`g]0HROIDi"\0W!^61oK"&CL#as8>.mnKMqQ3h
+N/iac#q$C/W:ejruU##&)%Dm)(?KgHK#@g=?Zh$sF=dFQ-EKgXo/Ak]G/(;%H(S7Yr6_f'k/!/Z]g#
+IXs>ALZ4uLIsGCL)s6+AS3Q^D6b7e<s%(`e.iL*:(:LP2D0lK2u5V2D'!g9A[\Zu:oE#K\a?h2YaO(
+[QG)Pe1)\lWm16-qEh/hs8r_=1V:A>NOG^nZ.Eb2oD,00$51+UI2C3o+6g8,m[s[Ar=sb_7D-\Wljg
+Ag(A3O7V]82o8`&4KXQ-Z=3iS&%+9^9Q^/B[FP6VpomD='F\\5/Bn7bj+fCeL+Fh6-:V]8k.m(L9+-
+WcY[)=$R't*s?Z>m7g$"nlF+,Trc:UB;T8\-q1VNp=l!nD1Sfr7Cl6Yj;)!J'I=?/DCgR<,jGlqoL*
+h'D7?(:Zt<RVf+SIb]'`nTU]j\RLu#ZgF]6T@-+hW)XQnT!HV=%pVd-PlpZJhe\iY)]WP>:?Hl),(>
+_&5eQQd+?PAbZ:KitBfFu*X)?+Z4X+G/C7>=7/:\n/KqAp/&XWb$,K(ZITi0p`g7?,J`epMBZK\O7m
+=`hpR&FTgb8>J22Hn.OR+CO+;[a_@_JealD\Y%qj)*9-h!',U6Y?)EL++`?%S]dZkDK&5qIDLemg_k
+&rdq$(-\)aSbQoIVYo(/&Du^+4%:b;9X7!"\4+hl0h)LXZ)?8B_J<i_nE%I^^9*UV4cenugE`qgF[3
+RGGC>QhsCX^e4@@n*6[,<`Pf-S34EFhQQ'9]lr$)dbh@PAfRlCID(W\pfcS1-@1T8!tN%fpAobOadR
+F9Pm-$Y(3KXn?j3'4o^D",^]`9hIU3!_Ig,?"+i**EpI<f<]7SXOr_p=dC'6'E&BoN1Y`3Ka34RrH;
+u0Ptl(5l3Rt*0+?Jb^oGu^mWG-]??"P6un4<sTiMhS-TdpQc%+\[S5YR%t[fiEP+<ZS/JbHLF6_YD_
+r`a(`#L1bH?<kW2!l7Q6l>R43rQF1^`pTGGnUaKlC0,HObR(!PEi"F7h)/ftU^HZrQn"YM[>.9eAY.
+9#T$s29Mat+nS)nr[@GiYu3g)D\lS"B;a+LqAVi9n467HtZr2kLp$qbp!Ygd2Ap7[C>^"u"st*._<K
+%bA*\jr:$BDX,onLhT"nla%$&gbOhEbO?fq]P@4_M-Au0/SUe%4tZ;fFQR%=r.(9A*R;<sfEO.3pGI
+qW:cm-H:p`)8?l<0GnZFi@_<:G.UY\-bUJ.:ci`!oLloNus&musM&6?d>f_sr@:/$`7nXX7)0$k]3:
+O?SDPAIs%`J9fd7q@bJMrh//>u?=j-CnX*-Q.I^5OQSkQl/QXJ%U+YEqk?TH)mADh+,QM3\m"C_1,*
+!lX4U8KMD$s*MdEuPlVq8r-blSVM*(J:F>gCR`pJ>ncWRCd`fr[A=a4JHud!>^(6V9GN4f:Osr0d4j
+$=KYTfZ693Hi(omO[!O98G234t+\niOk/2S&EkAU6pe*X,KFI/F,p\]&T8@*NXMG/p]Z.`Yp^V(JG0
+?eLMdDV#H:YUWe7nm8cJ7<p#fidr_;nq>NXaZcPVL:VK:N=ds<`lmmS1&p6jl)T[o4q<rV2B*UaPan
+&EY-:X5LA;*2Agme&2mOTt>i_/(6^Q;]Ko'gof$"nTB-,IO$l?[!b6,t`)$]*_PO+9Q0fYcGB6g=G.
+Gg#l>&jY<[R"pbCY)'mQ8,^20$P+i$Qm\Hd@5@;]M,!i9fe'jDd8eeEMfGSBfO/m<T`('5B9Z/P8s5
+V.G8lLSa1@bc-*#1*cnHPj&uQE?*eMU);-:ei4KiQZQ:aFW-LA[jSkp5%ErHC@`!4%.b7OW:bT/'0$
+DjL0<=5lUR#mpSFb#pn:GgAX@Je[13ke*`n<TjA-@=(P?W6AL%T1.2VQ<tU1^cCG/am#6_e>d*.?YC
+\J2b#E(GlLkrb43EWF,*"Vr!qks3^g7;lt[NW-%J0Bj[OS2IR+Y0Ap%o/<orS.$pEI#c>a\ggeG]:>
+:oZbXi(GN`0BU:b)IAuhKYbSN;_@q_d?U)3Eg5"u,WH`CT@=eAaeN`OSPqDOi-GDi?gFGP[#/t,rUB
+F7J0an1"AdqJPLVroM"VVgu6Mp>p5Q*On7S>D3dN?66_fg7pg;9bQl-)*#/E67p<BKo4jOgB2-dlH,
+=-Y[_#VQX&fSR/<W"Qj;Vc)ZnIR?l>-qG5RT(Cg<UDJbQ]S%:5%C963iH*gOoe8r3&cP$`=KIZ#0,I
+(+7<<m7nrMm!hTVg,RHE@cpFnZO;.C,Pkj4R@dCJ]G(^NG1;bu5ug<QgDiOWbs[dam7.=-IB;%BT(W
+Ua@@%R\'%>aIB4ZZbPAKqDqeMlMPInQaJj_f`*`A3lAV/X5PnPVTp"48i(:,]rpCt9FH_9Y[5)TH[W
++52T@Z.)LGLDm#J1SWO9MGc71i=Aa>L2Xf6EVm`#.Y:>bC?b[Fb"`t^jJ=XpRh/FBZ#oY4/S*L9nOm
+>/;"jP#aF(N,RKcfeZ*Y\Q/(k1:QA=aOY"b8f^,'b$7VH":DKU<U!'G/g],3SS#<m.lgVPZ@F`,c!#
+.09Mr&[Tg/<?JC=i>o-roS>YsO_Rk$N&h\gu0:cOf[G=m;B01%0D5r#i"*E$NA;'>=$Z>g<WS)6]<n
+gYZEG+[Vghm4laYhVL,691Q<CiI/p#/*^V`R>flKg'E-V\%+dVsR,VI7hX\om_pG1F'+:bQ]8I?kC:
+K^mL3men9K<OJd;dcG)r2Z$QoDR2L(qhuEZ[,H*GDDFFhYaK^t^>%6Y8*b"@XF+[j,Rgt.Q>,&ZN-_
+W-p!1;*<I8/TClYWT]f0<W."Lu'O3oWHAnng>hU\VEJ#i#)XfU=lRebg#'gUO1TH-XPe]LYCc5L#=j
+5\Cr0lmDZ[3p3>O7-O>Td/q/:>UgHH`QV2S\H3?B'_+YX0,IJ*'C<5.f7fS$+sCgB`?8US^@NEFf*]
+"HI`?(@u75QcJXKtDsQiQ?+1",5W!;j[40Gkj8tp`Fp$(H3BVXAnC;raA^:I>D<XtU6WAgJMG:V30&
+&PeHu&0CIDs7p%o7g;=+!M5PC#;Ap]X1FNB;RKC`Yd>FmfuNIFFH+f2bF)")[fBfAT;+N?dgWXhefB
+$[9MK2**g$\R!VLp`3Gql5G5WnD1dNh=u_USa^5&J(j/cY^l!:f&D)tK>VF>hOh\?Vh*n</dX+2X=1
+,hE<f"nV]:IFEDGAhOY`Q1N*o&tIF?fN:^fAHf&LFKP@JG^cFGg<)M7'98n&<OqFs^93R,S*\6G6eD
+apn)=#)X#R^IOoqAM4pamj*]8*,RIKeII)I`\XsV7+sAeO_[A(Q1ZPGT&g0\pT/%EH?$(_^=dBVQne
+qP4K$Pa`G!U:Ze.:R?qrp;`etOV.n#FQ&pcB,C[^rGs042]:=LdF1_q,B-VCjPOBI8e8Rm:]^PY^^Z
+aBUT<iDg%\m7k)hI3NFTblhlYY#%\OFj.h#*O<kAU>ZZ(MdA\5d=?PB:nqdSkET:[&%2V13OnkoXV"
+j9;n5\Vk6ErN+(;0*?.Rep44b@=[c[Q&IH4k/of?(Mt^Oe=3uXNl>oKC(FQXn^Q;Q-9(/p?(Fc"RkC
+VD]%dAO:#2f'nnoN!br7OViDk;u4/+Y?]LV]h?*Zb%W./rq?IDoc7W79eaK2"iNVU2qOI?!R8H#[&o
+sSbfR5gn37T^\5!U22;.b;14=6r>'W8$OG^<r-#)igIO41&(4bHB:B3DC%MCRga;FOO"%QS*h>m.I5
+`U['/MfFPK(#M#=bYZiID$F<'=20S4>IC7]!KoXhF]43eTG<1!*Xk"oS7ltG"jej,ooC^V9d&$S0hF
+,(.<;K[ip"V&YC1lqO*NgLYGFbQPb0+AaqcLC2n\pO/V`T.\imjU5,P#/eSGl?+`OM]hY7(*n*o?"j
+=C9)9]t`=jqa=e9X#BD7R=27PpC*&1U&00iitVDK;Kh4Egb4"k5N)rU]X.0ND;FI&-\"+2*S!>s!5I
+IHq_E*ZhHd]GiXZRB6G/\NlQj3^hf`V&gIJn/2UDE8`@#-uDqd(\J#D`#4M^Q4ifiEi=/]E.V4GY:p
+u7=ga8=^GlC$$Dog])oelBAAp[O5k_hVqLmt+Y>C1<T'?EZ/11!ecX4&e0/Ql+VWGu?`bXo+60n0m,
+:>Bhu3+k?Jmc\=TOXjd(K5NWJtNCWD=50D2<iMUJ[URUH<(S8k.F?-PfkBicG;A9$;`[<&PWiNe/kO
+NUV^*EJ;T2<mB+7@!NCd'?-5>U.6HF>-m:O^;^1*G;ZB/-'pUeMB]3dL.Aj0q%D:\&@ofZ6I+>4P)'
+0m'o/\C('D'(>%jr*Qr'$@Mb<gA^4!Xe*C^AT'cVpMq\>jL%*Q0(tTT_Y1g]ApC[DY)W.c*n-&E'7]
+=h3h4gME)o;S;Zs&ipn6`?p&1B6ds-,p_QimVqg-_rWr>Ibq<kB`)%ZK&?ISZD4s+7eEghq#Y`:gaD
+gL<_!PX:Qp4/amf55HUO:crY=*BCj_h7hR5Ock/^gHYhIbI_J6/JuXMJor]W1MQfqhL6lBfi5*h['q
+DRZP%]9j@ICkP-2"jj/:'c[sJk2SX2BZK+gL3?7imI_8bT@E%H^H[.:8J\FJe'KsgRMKnt;no+N(&,
+8G^fFRih&$8GN@df4-2VflLL>U-nrm$;oV;C&6lXeE91%P&IqEGD?S,I&^oVjn)fD(hAjoXN2S9D.e
+gh5AS*o#k*_12/_IU]MW4a_]ocenX!ehl#"q`Na@DgbjinJ+4GVu,2=^2I4u:D146dVno%5O%)(/[+
+iB]9kr?j3[%ke.dE*YIqe<oqVQ@:]A#aSX06?0h/'Ja%(TYYOh^?m/QgR5O\nS,ZYVqe;K[kdCo3kr
+(NaU>sI>@o5N;*'lict:Z]=]Vu=`pY8_qk*p<jD@4T]b3"d*%h7iHHs0u_;jkdgHH`PJ[,[eonjOXA
+/S,^pOa2^7>?iRumM_]1W*rk]D_k6tm?fd(=]mdhi.g"O\C^$KXkPY"%U>PD5XSmY$hmWdLD.1lCn(
+70iJ$>OI#a#:?cl[^\pj#IP@.rd`EI`Afk?%@_IiVlc`VR]+&Kh:F!2=>bhZR'\[=HM-`:s2CJ.Q)q
+R*[^?!+6=."+GRO*s($o/V'0p",QZIHJP4T#6L?@0&R<)"6tE:(B=F8
+xbtoa End N 12209 2fb1 E f4 S 18d252 R 5e4b7d96
diff --git a/graphics/pbmtopk/doc/examplf.opt b/graphics/pbmtopk/doc/examplf.opt
new file mode 100644
index 0000000000..e025fe73f6
--- /dev/null
+++ b/graphics/pbmtopk/doc/examplf.opt
@@ -0,0 +1,10 @@
+% pbmtopk option file for the examplf font.
+% invoke with: pbmtopk examplf.300pk examplf.tfm 300 -s 20 -f examplf.opt
+= 65
+% character 'A': "angus" signature
+name300.pbm * 46
+% character 'B': beasty from Irish fiver
+beast3_300.pbm
+= 83
+% character 'S': big smiley face
+smiley300.pbm
diff --git a/graphics/pbmtopk/doc/examplf300.opt b/graphics/pbmtopk/doc/examplf300.opt
new file mode 100644
index 0000000000..fba9d66148
--- /dev/null
+++ b/graphics/pbmtopk/doc/examplf300.opt
@@ -0,0 +1,10 @@
+% pbmtopk option file for the examplf font.
+% invoke with: pbmtopk examplf.300pk examplf.tfm 300 -s 20 -f examplf300.opt
+= 65
+% character 'A': "angus" signature
+name300.pbm * 46
+% character 'B': beasty from Irish fiver
+beast3_300.pbm
+= 83
+% character 'S': big smiley face
+smiley300.pbm
diff --git a/graphics/pbmtopk/doc/name300.pbm.Z.btoa b/graphics/pbmtopk/doc/name300.pbm.Z.btoa
new file mode 100644
index 0000000000..34e09da979
--- /dev/null
+++ b/graphics/pbmtopk/doc/name300.pbm.Z.btoa
@@ -0,0 +1,18 @@
+xbtoa Begin
++.\Ki@OR$uUBZMo!b!K^aKV@*KeXc8S4Kno70OG_C>?n8+\%2.4$nlsP,-0_%RZsqamu,t(b[b4S2m
+oea-\c+ML:8E,0c`+F_9thZm\A7)hCU\C31ZIVGJ!Oc1ob#c);#B@Pp3S@TA=fZ"i)E[-PW514tH1b
+8-sFX'q3\>haG&=b^Zg`oUCUmb>'h=6=?\[dVAN,:0eR>Lmam`%V6GQ<^f$j.1\i;AQoJVrc)Amgcc
+dg,!EV+>nB*X;LVEe#=.LT%ppJlc-1SY@]fLk3(J81\^%FS)nSH:B(eO?5khDj3!;G?%2Qo9;IM<;b
+),gH>]^nS**3*gcOZJgI79\D>nq6n1gB7ce5upG3LC;qegnHBDRWR&]UGi;Z4X5J?B?[d=($%QJHZj
+LA$paE]j\6?1@sJi-0'9R$NHk`E1rJ*n$igB&Ir*Q$sWD<#CE#RFi^/;lSsqM^5k>(K390k`A[u%A_
+WH2XZBnC`15p;G9?m-tA'-$CN'"70;U]@^XUZ;NpWRLa-#!"r1%$<ZVQSP%P-O-%\alp*H(u8LYjHA
+q#!cP<[1bjH$Y7adSN)WjZ>b=2pLQRhIO=Vh68:l'@uU1,gVWM?0QOFGaC-iKAc#3N8RAVTIqrPHMC
+YFGH<<':E3JBk`d*meJ3"EH]L&JR%'sC9"o:(i,q:I\l1i7eYF!Z,/DV/:t+/pnaQX/M!U'VFEu=ZG
+2ug-&g4!MX@k%7]L:7biVNq[NG_kXLXpsKd`LPDHj!MjF0.+UO%W\URNC_$Z(l^epCo9mJ/a$]9FA;
+X1s]b37OREedL]'%PJ*-W9]2+jG;[CLTkrsU<0Z_h>&NB;ik"<,,j`%`M(F'c'Y3%#rW3u9/E1:03]
+m_Cbr2bK%BP<QBap\GsD3(T!SG<boV+%a6`/QQOODq=N*;6hoel473.fpXW2K3D)/fr@q'Z<,H-?"X
+`Ccc_q0(c8e^k>fJh4FZe]VnfpCG.pI$1])ZfB2i-"nPQJiE"IWhH=5Kn9+O?['^j[bI1go?4SbHp%
+nQUtlRgjsp^Q%(E(qV.sDME-*c#;5l:I9/B'hQoRPHg/"pY&!<50s720^q78OfZ0?GqWGPahE(&J-]
+^CI]?;4Bm"Y\EHh:,Zhu12J?f+!3g'>eafouT`[eS:3NO=t4#<0B`AoH=Bk2*RsH*;>s5N$GelQ>g=
+kIOgH9QS8mfi"gT4-0FB
+xbtoa End N 951 3b7 E 5a S 1fe12 R f16c2fe9
diff --git a/graphics/pbmtopk/doc/pbmtopk.ps b/graphics/pbmtopk/doc/pbmtopk.ps
new file mode 100644
index 0000000000..532f0a4038
--- /dev/null
+++ b/graphics/pbmtopk/doc/pbmtopk.ps
@@ -0,0 +1,724 @@
+%!PS-Adobe-2.0
+%%Creator: This is dvips, version 5.33 (C) 1986-90 Radical Eye Software
+%%Title: pbmtopk.dvi
+%%Pages: 3 1
+%%BoundingBox: 0 0 595 842
+%%EndComments
+/SafetyEnclosure save def
+%%BeginDocument: texc.pro
+/TeXDict 200 dict def TeXDict begin /bdf{bind def}def /islandscape false def
+/vsize 10 def /hsize 8.5 def /@rigin{islandscape{[0 1 -1 0 0 0]concat}if 72
+Resolution div 72 VResolution div neg scale Resolution VResolution islandscape
+{1}{1 vsize sub}ifelse mul translate}bdf /@paper{/islandscape exch def /vsize
+exch def /hsize exch def}bdf /@manualfeed{statusdict /manualfeed true put}bdf
+/@copies{/#copies exch def}bdf /@FontMatrix[1 0 0 -1 0 0]def /@FontBBox[0 0 0
+0]def /dmystr(ZZf@@@)def /newname{dmystr cvn}bdf /df{/scalefactor 1 def /fntrx
+@FontMatrix def df-tail}bdf /dfs{div /scalefactor exch def /fntrx[scalefactor
+0 0 scalefactor neg 0 0]def df-tail}bdf /df-tail{/maxcc exch def /numcc exch
+def /fontname exch def dmystr 2 fontname cvx(@@@@)cvs putinterval newname 8
+dict def newname load begin /FontType 3 def /FontMatrix fntrx def /FontBBox
+@FontBBox def /BitMaps numcc array def /base maxcc string def /BuildChar{
+CharBuilder}def /Encoding IdentityEncoding def end fontname{/foo setfont}2
+array copy cvx def fontname load 0 dmystr 6 string copy cvn cvx put /ctr 0 def
+}bdf /dfe{newname dup load definefont setfont}bdf /ch-image{ch-data 0 get dup
+type /stringtype ne{ctr get /ctr ctr 1 add def}if}bdf /ch-width{ch-data 1 get}
+bdf /ch-height{ch-data 2 get}bdf /ch-xoff{ch-data 3 get}bdf /ch-yoff{ch-data 4
+get}bdf /ch-dx{ch-data 5 get}bdf /ctr 0 def /CharBuilder{save 3 1 roll exch
+dup /base get 2 index get exch /BitMaps get exch get /ch-data exch def pop
+/ctr 0 def ch-data null ne{ch-dx 0 ch-xoff ch-yoff neg ch-xoff ch-width add
+ch-height ch-yoff sub setcachedevice ch-width ch-height true[1 0 0 -1 -.1
+ch-xoff sub ch-height ch-yoff sub .1 add]/id ch-image def /rw ch-width 7 add 8
+idiv string def /rc 0 def /gp 0 def /cp 0 def{rc 0 ne{rc 1 sub /rc exch def rw
+}{G}ifelse}imagemask}if restore}bdf /G{{id gp get /gp gp 1 add def dup 18 mod
+exch 18 idiv pl exch get exec}loop}bdf /adv{cp add /cp exch def}bdf /chg{rw cp
+id gp 4 index getinterval putinterval dup gp add /gp exch def adv}bdf /nd{/cp
+0 def rw exit}bdf /lsh{rw cp 2 copy get dup 0 eq{pop 1}{dup 255 eq{pop 254}{
+dup dup add 255 and exch 1 and or}ifelse}ifelse put 1 adv}bdf /rsh{rw cp 2
+copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2 idiv exch 128 and or}
+ifelse}ifelse put 1 adv}bdf /clr{rw cp 2 index string putinterval adv}bdf /set
+{rw cp fillstr 0 4 index getinterval putinterval adv}bdf /fillstr 18 string 0
+1 17{2 copy 255 put pop}for def /pl[{adv 1 chg}bind{adv 1 chg nd}bind{1 add
+chg}bind{1 add chg nd}bind{adv lsh}bind{adv lsh nd}bind{adv rsh}bind{adv rsh
+nd}bind{1 add adv}bind{/rc exch def nd}bind{1 add set}bind{1 add clr}bind{adv
+2 chg}bind{adv 2 chg nd}bind{pop nd}bind]def /dc{newname load dup /base get 3
+2 roll ctr put /BitMaps get exch ctr exch dup dup 5 get scalefactor div 5 exch
+put put /ctr ctr 1 add def}bdf /bop{userdict /bop-hook known{bop-hook}if
+/SaveImage save def @rigin 0 0 moveto}bdf /eop{clear SaveImage restore
+userdict /eop-hook known{eop-hook}if showpage}bdf /@start{userdict /start-hook
+known{start-hook}if /VResolution exch def /Resolution exch def 1000 div
+/DVImag exch def clear /IdentityEncoding 256 array def 0 1 255{
+IdentityEncoding exch 1 string dup 0 3 index put cvn put}for}bdf /p{show}bdf
+/RuleMatrix[1 0 0 -1 -.1 -.1]def /BlackDots 8 string def /v{gsave currentpoint
+translate false RuleMatrix{BlackDots}imagemask grestore}bdf /a{moveto}bdf
+/delta 0 def /tail{dup /delta exch def 0 rmoveto}bdf /b{exch show tail}bdf /c{
+show delta 4 sub tail}bdf /d{show delta 3 sub tail}bdf /e{show delta 2 sub
+tail}bdf /f{show delta 1 sub tail}bdf /g{show delta 0 rmoveto}bdf /h{show
+delta 1 add tail}bdf /i{show delta 2 add tail}bdf /j{show delta 3 add tail}
+bdf /k{show delta 4 add tail}bdf /l{show -4 0 rmoveto}bdf /m{show -3 0 rmoveto
+}bdf /n{show -2 0 rmoveto}bdf /o{show -1 0 rmoveto}bdf /q{show 1 0 rmoveto}
+bdf /r{show 2 0 rmoveto}bdf /s{show 3 0 rmoveto}bdf /t{show 4 0 rmoveto}bdf /w
+{0 rmoveto}bdf /x{0 exch rmoveto}bdf /y{3 2 roll show moveto}bdf /bos{
+/section save def}bdf /eos{clear section restore}bdf end
+%%EndDocument
+TeXDict begin 3 1 1000 300 300 @start /fa 6 117 df[<EB01FCEB0703130CEB1C071403
+EB18001338A45B3807FFFC3800701CA3EBE038A41470EA01C0A314E2A3380380E4146414381400
+90C7FC5A120612C612E412CC1270>24 37 -1 8 23]12 dc[<EA01E0EA0710120CEA1808EA3810
+12701360EA7F80EAE000A51308EA60101320EA30C0EA1F00>13 18 5 0 19]101 dc[<EA1F8012
+03A2EA0700A4120EA45AA45AA45AA412E4A412681238>9 29 4 0 11]108 dc[<EA3C3CEA26C2
+EA4687EA4707EA8E061300120EA25AA45AA45A1230>16 18 4 0 18]114 dc[<EA01F0EA060812
+0C131CEA1818EA1C00121F13C0EA0FF01207EA00781338EA603012E012C0EA8060EA60C0EA1F00
+>14 18 3 0 17]115 dc[<13C01201A3EA0380A4EAFFE0EA0700A3120EA45AA4EA3840A31380EA
+1900120E>11 26 3 0 14]116 dc dfe /fb 26 121 df[<B51280A3>17 3 2 -11 22]45 dc[<
+127012F8A31270>5 5 8 0 22]46 dc[<EA03E0EA0FF8487EEA1E3CEA380EEA780FEA7007A238
+E00380A8EAF00700701300A2EA780FEA3C1E6C5AEA1FFC6C5AEA03E0>17 25 2 0 22]48 dc[<
+EA01801203A21207120F127F12FF12731203AEEA7FF813FC13F8>14 25 4 0 22]49 dc[<EA07
+E0EA1FF8487EEA781E130712301200A2130E133EEA07FC13F013FCEA001E13077F1480A2126012
+F038E00700EA781EEA3FFC6C5AEA07E0>17 25 2 0 22]51 dc[<EA7FF8EAFFFE6C7E381C0F80
+130314C01301A313031480130F381FFF005B13F8001CC7FCA7127F487E6CC7FC>18 25 1 0 22]
+80 dc[<EAFFF0A3EAE000B3A8EAFFF0A3>12 32 8 3 22]91 dc[<EAFFF0A3EA0070B3A8EAFFF0
+A3>12 32 1 3 22]93 dc[<EA1FE0487E487EEA783CEA300E1200A2EA03FE121FEA3E0E127012
+E0A3EA783E387FFFE0EA3FE7EA0F83>19 18 2 0 22]97 dc[<EA03F8EA0FFCEA1FFEEA3C1EEA
+780CEA70005AA57EEA70071278EA3E0EEA1FFCEA0FF8EA03F0>16 18 3 0 22]99 dc[<EA03E0
+EA0FF8EA1FFCEA3C1EEA780EEA700712E0B5FCA3EAE000A2EA70071278EA3C0FEA1FFEEA0FFCEA
+03F0>16 18 3 0 22]101 dc[<131FEB7F8013FFEA01E7EBC30013C0A2EA7FFFB5FCA2EA01C0AC
+EA3FFE487E6C5A>17 25 1 0 22]102 dc[<127E12FE127E120EA4133C13FEEA0FFFEB87801303
+120EAA387FC7F038FFE7F8387FC7F0>21 25 0 0 22]104 dc[<EA0180EA03C0A2EA0180C7FCA4
+EA7FC0A31201ACEA7FFFB5FC7E>16 26 3 0 22]105 dc[<127E12FE127E120EA4EB7FE0A3EB0F
+00131E5B5B5B120F7F13BC131EEA0E0E7F1480387F87F0EAFFCFEA7F87>20 25 0 0 22]107 dc
+[<EAFFC0A31201B3B51280A3>17 25 2 0 22]108 dc[<38F9C38038FFEFC0EBFFE0EA3C78A2EA
+3870AA38FE7CF8A2EB3C78>21 18 0 0 22]109 dc[<EA03E0EA0FF8487EEA3C1E487EEA700738
+E00380A5EAF00700701300EA780FEA3C1EEA1FFC6C5AEA03E0>17 18 2 0 22]111 dc[<EA7E3E
+EAFEFF007F1380380F83C0EB00E0120E1470A614E0EA0F01EB83C0EBFF80000E1300133C90C7FC
+A6EA7FC0487E6C5A>20 27 0 9 22]112 dc[<38FF0FC0EB3FE0137F3807F040EBC0005BA290C7
+FCA8EAFFFCA3>19 18 1 0 22]114 dc[<EA0FECEA3FFC127FEAF03CEAE01CA2EA7000EA7F80EA
+1FF0EA07F8EA003CEA600E12E012F0EAF81EEAFFFC13F8EAC7E0>15 18 3 0 22]115 dc[<1203
+5AA4EA7FFFB5FCA20007C7FCA75BEB0380A3EB8700EA03FE6C5A6C5A>17 23 1 0 22]116 dc[<
+387E1F80EAFE3FEA7E1FEA0E03AB130F380FFFF03807FBF83803E3F0>21 18 0 0 22]117 dc[<
+387F1FC000FF13E0007F13C0381C0700EA1E0FEA0E0EA36C5AA4EA03B8A3EA01F0A26C5A>19 18
+1 0 22]118 dc[<38FF1FE013BF131F38380380A413E33819F300A213B3EA1DB7A4EA0F1EA3>
+19 18 1 0 22]119 dc[<387F1FC0133F131F380F1C00EA073CEA03B813F012016C5A12017FEA
+03B8EA073C131CEA0E0E387F1FC038FF3FE0387F1FC0>19 18 1 0 22]120 dc dfe /fc 3 69
+df[<EC01C0EC0FF8EC3FFF91B57E01036D7E903907F007E090390FE001F090393F8000F849C712
+7801F0147C163C4848143E49141E1203484880120F90C8FC121EA25A5E127C00784B7EA448157F
+A21278043F0808EB0380081804F814F6710278011F010115FF6C972701FFE00316FE4D9026C07C
+0F4B7F003E942A01F0FC3FFDF0076E7F001E031F9227FEFF80F882001FDD03F1B5D8007C49141F
+6C6C05E101FC4A4814076C6C92380007F36C6C4A49B502FE161F00014B013FDAFFBF011F92B5FC
+D800FC902607FF81B8496C0103EB9F8090267FC03F90B6003F4B6C90387FC00F6DB500CFDAFC1F
+DBFFFEEBFF806D028F9527FFF3FFE113000103D9FE03D98FF09027C7C07FF190B5131F90300017
+0001F807E007C0003FE07F153F91C949C8D9C01F913881FF0095CAD98003ECFFFE9CC7001F5B0B
+7F03035B0BFF9238007FE0526D92C8FCF403E71DC7F4078399380F03E01C1EF41C010A387FF478
+000A707F641E781B0152137C0903143C1E3E641E1E0907141FA299C77EA27680A21E071B03A3F3
+01E0757E880A78130F880A3F49CBFC99381FC03F99380FFFFE0A035B9938007FF0F50DC0>145
+91 0 44 145]65 dc[<A1A1A12302A1A1A12306A1A1A1FB0FE8A1A1A159B47EA1A1A17D7FA1A1
+D803FEA19E3807E3F0A1A1003FA1FB80FCA11107B5A1FA001EA1111F02F0A12207A1596EA1E51F
+876D7EA1A1DAF980A10DFFEB00E0A15902FFA17B1370A158B7A15581A15870A19B267C3FC0130C
+A158A1A1001F80A1101F04F0A10D0F80A158A1A16C6C6D7EA158A1E93C03EC00E0A1A14BA10C1C
+6D1470A157B86CA1E41E01903803807CA157028F6EA10EF8EBE01FA15749C66CA19D270E00FC01
+EB07C0A1596DA10E1FD9FE00903801EFE4A15701C0010FA17A903C3E01F00007FF80A158C70003
+A19E26801F819138003FE0A10F3F4DA19B2707C00FFFED007EA1A16DA10E0F6D01C0ED1FC0A1E7
+FFFC6E6DA1786C6C49ED07F0A110C0037FA10D036D90C838038078A1584CA19C26F0007892381F
+E07CA10E0390C949A1786C90C938FFF81EA1A16E6CA1786C4CEBFF0EA156A1A16E4C80A10E3F4D
+48A1E53F98F08780A10FF0043FA1E61FFC4B1483A157A1A14A4B90381FC3C0A1A14A48A1E407FF
+93261FF0075BA10E7F7148A15494383FE1C3A1E6FF80A1A1007F499339E3E3E3C0A155A1A149B5
+93387FC7F1A19ECA007FA10C0F18FFA1554871D7D14B4A02E113F8A15548A1A14807C313E7A156
+4DA10C7F9639E1C1C7FCA10D1F067EA19BB6489339E0018FFFA10EE04DA10B07D9FC7F92270007
+F00780A156057CA10DF06D923B01F81E1FE7C0A1556CA159963B007FFC3FC3F0A155CB48A15301
+E0DE0FF0EB8078A10DFE4D48A15397C738FF001CA10C014FA1E37FFC01FFDE03FE130FA155A1A1
+D8FFF8017FDE07DC6D7EA154480503A10B0301F1083FC71201A10C074FA15201E1506E7EA15448
+4D48A1520183F101F8A155050FA19A261FFE074ADC0780EB0C01A1E43FC0051FA10B3F033F057E
+C7FCA1544895D7D000FF010C6EDB01F891380E0380A1A1013EA10CFC01F0DD07C0DA0787CCFCA1
+A1013CA1529027E018701F047EC86CB4FCA10CFECB007CA10A07D9C010DD01F881A153484EA1E4
+80306EDA0780ED00F8A1544EA152D90070010F033ECA1230A1E307F0A1A148D960386D02F81738
+A10B0F0601A1A1EB03C0A10B1F07C0A15248496C6C6C4A5FA10CC00503A1E37FF0018093280783
+FFF8B0495AA1A14848A10C0103FF4A90B5EA9C1FA153CBA1E4FFE0DA0C03902880060FE18F90B5
+FCA153060FA1529226000E0101E091C76C5CA1A1001CD7CFDA8003D93E009026F0000E903A040F
+E7FE40A10BFC0618A152047F6DB491283FFFC0611ECDFCA1530638A15201004A6DDA0F7FEBFC70
+A1E203F04EA15248D906036D6C92B6D8F03E1730A1534EA153010E9027F1C007FE02EF03789238
+1001F0A152480501A1534890273E0670E049D907E701FB0170ED7FFFA10A0F4E48A1524890273C
+1C60704902E301FD01F092B67EA1534D48A19B2901EC1840780FDA00F303C0020781A10A1ECB48
+D7D000FF902A03CC30C0381FF0027F9026FFF1804A15F0A10A3E060EA1E4E007902661803CD9FB
+C0047B4B14C9A159A15291261F0FC190271E3FFFE86DD9FE3FC8B5D8E180C7FCA10AF84EA152D9
+C01C01816DB500DC49021E0203EBFE01A152A1A1D98038D90300DAFE1E90B5011C4A4A7EA10903
+4FA1529126F00E07013FD9E00F96261F83FC5BA1524EA152902703E00C06017B01C001A14AC802
+F890C8FCA1524D48A10C070100D901F190270007FFE7057EC7FCA151480503A19A271FFE1E70D9
+0C03496D01E34903F05CA11007A1E57C38DA0731020001E74C48EB07C7A1091ECB000ED7D0267F
+FFE0DA180E6DDA7F8F6D0203EC5FFFA1093E061EA10DC092261C71FEDA080F4CC7B512C0A1093C
+0678A19AB5D88018D93038DC001F4C010F80A1097C0670A10A0FD9F800912720F061FC0203B500
+F0020C491430A151A1A1DD61C0041FDD1C03B500FCC8FCA1514EA1520563D921FE9726781F4F01
+981315A150484D48A151B548DBC7D09026FF38CFB648913D701C0FFE1804FFE0A1E70780A15195
+26EFFFFB90B8912A07E00007F8107F13F8A1E00F8095D7CF000F0507BC484A903803F018A10F0E
+A10A3FD9FE60023F51494890C7003FB5FCA198CB48A1514801800239BD92C94814E0A150063CA1
+51B50000023F0C1E93B5EAF0C0A157A10BFC7A494B14E0A1083C4EA1090F4B54017C4BEBFCC005
+600910524D48A1093F494B09F8C748DB071F1300057C06E0D901FCE103F84D48DB03F0A106380D
+E04A903C07FFCE0FF00180932607FFE1DC03FCD907FF58C9260FFF80A1912701FFFE3092BD4849
+48011F9038FC0700049FD9FF80922707FF803F6D0F0E043FA1DEF8705748017F91C7EA0300030F
+B66C05E002E00F1E4CA19528F06001800199C7000791B500F0140F4F05E3B56CD9018405079AB5
+023C0E064BD9E0E00CE04B03C05C037F071F01C16ED91BFE068805704B04FEE203E5B726FE0307
+D980C00F1FC7008F90C73802FF804AB7C9486DDC1FFF021CDA0F804D4BDB03FF52BA0087902601
+80034908F8C8003EDA07FE020713E04A7005E14BB526C001FF023FCA00014C4B6D087FBC00FE03
+0009C04BDA03F8021F13F8020F018F01FEDEE3FC01FC040701C0013CDD0380DB0FF7021F90C7D8
+3FC094BD26FC0300530378DA00380103B512FE9227E0023FFCC9B6017F01114B03380507DC1FC3
+01C0520AF8021F09D0C90430010F14FF91271F80000F05F9DA801F011B028002F80178050F043F
+4A486D017F94BED8F00690263E01814ECA00E04B90B6123F02FF962601F07F912703F80FE76D48
+4949051CC9007F4A4890260003FF4CE3E004D9EE03DEFE06DC03C0912703C00397140E92C7D803
+F84C6C03F001E0D9E07F6D494DDC7C0349B5071F9B270C038E07DBFC1F0138CA000792270F001E
+07EBE304490300932803C01FFC009026F80E2049B5D8F001067804F803F14A6D037F0BC0902706
+0C0F01D9F800D9F7184D48D901FE013CECE200D90FFE036003079426F03E00902680FE07010306
+E0DB01F002034B6D023FB928FE780300BF902680181C496C49D91DE34EC701E6D9600390C7FC02
+F892C9D81F000307017EDBF80349484C484C6C902707F07F806E4A9426F9F870C7000F01009026
+70183F4A90263FC338050EDA030401C0EBFC044948073E4948902603E078D93FC36D4848480403
+0403DC803F4901C091B827FE003060DA071E902731E038E6D9FE60D97783E20C01903800F00C49
+48073C017F4A484803FC92CA90C9000F92289F003E003F49010F05E00170040C9027338031C601
+7CDAE70206789127071C07801340017F087C4A010F92267E03E04A05060500029E4B90C74804FC
+C70140DA061890277E00330C9029384001C7001805F8DA063090C81230DAC20EDD01F001FF03C1
+03230103013E051E4C902603F87C017E4D048003C0057C01769226C0038FDE01E091260E6206EC
+35E09026FFC7FF0503010705C0023F902607C03C4D043E01070138D97C01B56C90B8C800604B48
+01F0D97C18DB070E060792260C67FEEC7FF0000390B506E0DCFF0302FED90003017C0570043CDA
+C07890297803F07E000704E003E14E01F891267080060880DA7CFF9039823FFFF87093260FC00F
+01C0DDFFDF03FC05F0047C037001F84C0480DBC180021C494801F002E090260E0C02051FDA01FC
+D9FFE7B512FE023F6D05804DC701CEDAC1F04C4804F0010F49912607E078017F03F8C900C3DB18
+2090298001E03001C1011C0103053CC70007B6D8E27F7F496C6D93271F003FC7DAFC0F902601F8
+0ED907034E0781030F92B700E0030190C80160C70180010302380738DA1F0FDAE00F1480001F6D
+061E0207DAF80E0107011E494848DC07804B4890281F01C001E001804E0483031092C728600703
+0070D906104CDA7C1F0280EC800001FF6E4CD9FF0F073890260E1FC094C949932903C00E007003
+03FCC94848DB30E0DC400EDA600E01304B48DAF03F6F90C7FC496C01C0932BF803FE1E0001F01E
+D90FC04C4C040391263C0380D9801ED9600F03F0050E4CDCC01C02C04F902603E07FED03FC01FC
+06010127013E0103013E017F49011E063F4C489029380700070038494803C00407982801803802
+01DF0780D90781B548C7123C000F6F030390263FFFFC03380360013C063E4CC70070D9801FD9F8
+01017F92CAD8060CDB61809426700003033893C7D81E0F1738001F6DDD07C001F091260780786D
+C648D9787F0578080F011E6E48B600F89F2700E004070106050EDA7C1F4A1478D83FF895280F80
+FFE078013F01F8D97E01902601F8FCCA484C902801800E001C01E001014BDD0E0803C1932B0301
+C00C0F8007044B484A484A5CDA07E8C9010301F091291FC3E001FC03D903FC4D48041E0103011E
+D97E01021F03C0050C04C39329060300080C00DD03F8D907F0B648130101F090CAD81E43D9CFF0
+D91C07048001EFDD03804CDA001C90267403C04DDD1C1893C9010FD91818DA0C304BD90FC31703
+91CBD87E6301C791277C038003D9070001C305074D010690263C01E04904FCCB4DDC0C1E4A0320
+DA0FE0020703FC011FC8FCE07C136D48D9FC07D907E0020701F0041F070E01784D4ADE18300201
+6D0438494801030160023FC7D81C0F92B512FC942A01C003FC1FF9E79127F00FC00F0106D90F8F
+051CCA00F80118D9F007010FC74802E09926038FF04B48DAC080027002FCDAF83FDAFE3C13E0B4
+48DB6FF89028C03FF86780061ED90E0F053C05E00110DBC00E49B600804E48DB8E7E4C90262180
+C00108DA07E0010190B600F8010EC9FC007F04FFDCC03F010F011FDA001C011E49514890267001
+E0D9800C010792CC94260E0780DA3FC0D963000218DA1F8002F1DBF030CAFC9529FC3FE1FF801F
+0200021E49D9180705F04C489027E003F01F013804F8DF70E092261F00C04B016601404A01FCC7
+D803C3EDC070DF3E21DB000E9026FF007E03F86D4B4807C0DA3C00021F4A500206D98018027EC7
+004E0160DB07F8DA079FED8060DB07E19028FF7E01FC0004F801784B484803030507010102C002
+30494A07E093271DF00D80017C02FC91280730C00FC0DA1E3FED91C06C6CD97FC1DAFE0F047E49
+01F80160021FDC078093270F0007804A0170494A07E19327181E00C0494AD930069026E03F8002
+7CEEFF809027E019FFC002F84B0178D9E007902601E00391C948CA003F91270007807001C090B6
+48DFC18091280C3803801C494A922631C1FEC8D8787F93CBFC267FC01F6D6C05F8D9F803902703
+C000C04948041E053C010E90270F81F001494ACD00C393293001F00F81E049480118902671EFE0
+03F8B712F6E07FF0D9F007DAC0070101D90780051C05FC4D4848484ADF0183031C9028003E00E3
+804A020ED9FFC0DA01C703FCCCFCD83FE002C002F049DD800F49484848486C03784D49DA01C04A
+02F0E41860902603803F4A4890270C0C63FEC8D803875DDCE01701C00207D92FC091281F800700
+3E01FCC9484D01789127070007004B98C8922601F00792C7902618E3FC040715C06D48D9F00102
+FF92267F8007013F0338050305014A011E4A011F0280DF038703389127003C01E090C8DAE7F8DB
+060F02F8CDFC01F89226007F810180902B80FFC01E007E000F01786DE2E001030E010C0A100206
+DB30C091260F0078942630FFC0DB1E1F5C020F070FDAE01C49010CD9F80105C04D4848D93E3E01
+1C4949CA2703FFFC07972603C01E056149DB3E3F5C007F6FD9FF83DA7F034C01389026F003F04B
+4804030107DA387C49D9FF83063F90B5000E03209227007C03E0922608E1FCC9484891CEFC0503
+0103027E9026FE60FE04014ECA4948480278499026FC007E0407B7000CDB618092261F00709226
+09C3F804F1B512FC6C486CD9C00F49D9E07802034948D9700F061E073F9129307C01F001F8011E
+4C04CC972603C01E92260F83F0DB0FC314F0DA02434B9026FFF8079128F80FE003E090268007C0
+4B050F04E002E09026F0080F09F8DBC1C0922700FC07C0DB1FE04B485C2B1FF80001E01FE00703
+3F031F02C04948489A261FE00101F89029C003C1FC07807404F093273E00E078D90C3FC9485A6D
+90C7D83FC003C0D9FF0FD90FC009FEDD1E0003E193268FFFC375DBC3FC932A07807FFFA0007C92
+2601F81F91CFFC486C03FF013F9026FE000FDA984F90260F001F91C900F0051CD9BF00912AE007
+80070F83E175912701830F80922601F03F01FE49922603C03F13F86C6C04E04A92288F007F801E
+4901FEDB18E0053C01FED907839127000E1F006DDC1C7F03E091268603F0922A003C7801FFF1F0
+DB0701B55A486D0103D9801F01F003FF6E48017E051DDE780191270F87F03FD93E3C017194260C
+7C0F02F8912687007C932907E00007FFE0DB0F075C02E07001C04901F8DAF7F8037CDB0FC09426
+F803FC9027DF07C03ED93C300138051C01036E90280307800F80922901C03F007F80DB1C1F5C6C
+01F8D907F86D037F49DAFFF003FCE2780102FE0538D918E0030EDA007FD9FF8090270FF001E093
+2781FF803FC9D8387F91D0FC6C6D90263FF00001FCC7002349932701FE03F80AF06D91260FE1FE
+017C0170090F02E090270CF800FE0483D9F07E0471B55A6C9026FF087FDA0318020190C7B54C03
+1FDD01E093261FF1F09027F83C7808050C02039127F806185FD90F809128030783FEFC04E114F8
+000191B591CA00FA93C74A0AC09026FF03FC01FFDB3FFC0160031E6F02FE912703E001F0912807
+0F003FF0ED018305800620DEFFF7DC3E60040302FE4948020190261F9C0C051C6E6CD9FF0C9027
+0038003E031E6D48DB030F5C6C6C02FC96C8D83FF349D9FF80037E08FC01E0DA8003D9001C077E
+021F02CC91270F800F80021CD900C0ED061F6D4ACFD81FE093C948CA0180D9FE7F922600077807
+0E0407DAFC30902701F800C0010392C9000E5D010F4A0A0EC86E4B942607000302F0DB06380370
+04186F0370D9003E90C70238DD1C7F1480041899C94D48050E91B5009001FC011EE5007F01FE92
+2707C001C0D91E3C4DB6FC010301FAD401FCC8499926801FF8D91C3CDA186005FE010C011F6D48
+912700FC00FCD98FFC1711010001E0580307061E49D9F80001800138E01E38020E01036E031E01
+0F6E1783DA7C400F1F71057C4B0102C7D8303ED97838766E9229006001E383EEDC018702F8D1FC
+91D6D8074004809626007FE090C827701FE1F0756C6C6C01FF93283C003FC00EEE0307A190CA00
+0F067891CB29600FFFE070E0DC30FF02E06D02C0030F01074E485CA1063F06704F486C902680F0
+C0031C7001076E9228038001F03EEE0F3FA1063ECB00780703902701FC00E0043EDB03FC6D6E92
+C8D83CFCDC0C7F91D2FCA10DF850C7D801C1053101806D04FC932701C03FF804185CA14EDD01E0
+97C8000349DB3C716E6CD9063F01FF932700F037E04CB5FCA14E4D484FDB0783DC7C6193268018
+0F02E0DC1FC0CA00E114F8A10C070806DB0F03DC78E19326F0380702F87048DC01E35CA14D484E
+4FDB1E07C99228C000E07C1003FE04074D485CA14E4DCD001CDB3C0EDC70E3047E02BF6D6C030E
+CAD8070F1480A1A14BDB781EDCE0C36D9028F00FB0030F02F04BDD1E1F91D3FCA105034E9A2601
+F01CE203F0018702FC0370DD383F13FCA10507061E0830912607C038922801E1C7FDF00201496C
+02FF912601F038DB01F0B512E0A10680053E5091261F8078DEF9F8912800381F803F02F8010F01
+FC16E1A1050F063808E04A4848DB03C16E484890261E3E0092B600F904034AD4FCA14D6C05789A
+26FC03E09328838FF0FE03DA0FFC0103DDFF9E4B485BA10CF84F48902703F807C0030792267F87
+C0D903C00100DE0F80DA1F1F5BA1053CCA48484F4890270FE00F809329871FF807FF8090C9DDF0
+01033C01FCD5FCA1A194263F807FDC0F07496C90CB000F04E06D903901F03FE0A1057C4E070791
+267E00FEC9D81F0EDA0010060303F6C70070903907E07F80A105FE4D4897C7007849DC1E0C4990
+CD03E0021E90263F807CD6FCA10B0F081EDB1FF893261C1C3F0A2F02800207B5D7C6FCA14D4EE3
+7FF0043C0C0101F8C913E4A1DC01F00E1C04C0932678387FE20006CAEA0180A104034ECDDBF87E
+CA27F878FFC099D7CEFCA10B1E083C0101017C1870A105C04D0838033CEFF0F1A104070F789726
+01E0E15BA10B3808700103953803C1C1A1040F4E0A07F187C7A14C6C4D50033E0407018790D7D7
+C7FCA14D100FDE1F0780A194CA48484F48027C051E5BA14CA0261FFC1C93271F0E1FFED7D7C7FC
+A1714C480A3F011EEE3E1EA194CA48CD4848D9383CEF7C3CA14C6C4C50C70078011C9338F8383F
+A14CCA0D7C933901E0787FA14C051CE3F03C9538F8FFFCA103014E0D3C922603C1F05BA1A1011E
+037C93260781E17FA152992601E03C4C485AA10A60081C043892261E07875BA1030706E0992703
+E1F87892263C0F8F5BA15148083C028194387C1F1FA15250F2F81EA1030305030B0702F89226F0
+3E3F5BA151CEDB00F0DB01E0495BA1090E09706F48912603C0F0B5FCA1704C0B0E01F092260780
+F180A109780DF192260F01E15CA1A101F0DBE1E091261E03E35CA1714B9A261C01E39238380787
+A14BDC03E051DBC3C09138F00F0FA16F6D4A480801DB07C70201D91E1F91D7D7C8FCA1714A4874
+48013C01874B485AA171027F09010238D98F8090270780787F5BA17102FCCE040FEE00F0A16F90
+27FC6007F809039126301F0FC7260E01E0B5FCA16F9027FFF8FFE052D9700F92383803C1A195B5
+4899C726601E1E9138780783A1A103E0013E4948485AA14FCF486CDA1C3C9126E03C0F14F8A170
+4A52C701F8913903807C1FA193B6E501C04990390700F03FA14B03C00A0E912680F0F890270E01
+E07F14E0A16F4B0C034AD93C0390B6FCA104E701FCD0922601E1E09038780780A1040301C80B3E
+DA03C39126F00E035DA106800B3C903D070783C001E01C07A1DC0020D1001C0106903B878003C0
+380FA194D2912B0E0F8F000781F01F5DA1A1DB3E1F90390E01E03FA1A148DA7C3E90391E03C07F
+A1A1007890260FF878494848B7D7D7C9FCA1A1007C90261FE0F89038780E07A1A191263FC1F049
+48485DA1A10078DACFC09038E07C1FA1A10070913AFF8001C0FCA1A100F002CFD903814915F8A1
+1101913B7FCE000783C0A1A148017391380F0780A1A1DD1E0F495DA15948D9E7C6D91C1F7FA111
+0702C791383C3E00A1A1010101CE017860A1A102CFDAF0FC7FA1A12680038FECE1F0A1E90F0001
+8701015DA1E40380078CD9C1C01780A1E4FFFE033ED9079FD903836E92D7D7CAFCA153973ABF8E
+078780A19A260FE07F033C4DC75AA19A271F000FC093270E1F0C0F4B5CA10B3E01034B011E9026
+1C1E1E6E5CA15301014BD93FFFD91C1C80A1536E70033C83A15301004A4890393E3F183CA1E203
+C0DF383ED938786E5CA1530260D907C0017090263870F85FA159D9781ED960F05FA10A0FC892C7
+D8F03C4A80A10A0E051F02E014E1A1101E02C00130495FA1101C010190387C71C3A10A0C4D0103
+85A10A1C03E0499226786187C8FCA10A184B0160D9078013E3A10A3802014948DA01F1018F60A1
+9D26800780D90F81D9C70F60A10D0718E1A1554848C7D81F014A81A10D1E011C0303EB8E3CA10A
+784A49023801C35FA10A3802F801F0DA7007D99C3895D7D7CBFCA10A1890271FE001E002F0DAFC
+7081A19B273F0007C09127E01F01F85EA10C7C49C70001011ED9F0F05FA10A1C013C01FE020349
+C76C5DA19B261E01F84A484862A10A0C90260FDFE091260F01E049484B5BA10A0E6DB44891261E
+03C0063F7FA10A06D901F8C8003C4C5FA10A0790CA4848C71203A1766C932601F80F5DA177DDE0
+0702075EA10A01DD03C06D4A5FA1766CDC0F8090C790C95CA10B70DC3E0088A17704784C82A10B
+1E4C49140EA1776CDA03E0517FA1E307E0023FC75AA1E301F8D903FC6E87A1E3007F01DF030E85
+A178B500C066A10C0F01F8C8003C61A19BCB003887A1A164A1A100F01406A1A1030793B57EA111
+0107035CA1594803C083A1110103034B80A1A14F1487A1A14C4A1403A1A1486D6C6C16FEA11109
+0101716E7EA1A0261DE03F9539FE060060A1110C017F01004C6C1370A11100D9FF026DEF8030A1
+A16C010F933A07C601C010A1A1007890261F8060913A018200E01CA1A1261FFE3F01700383EB70
+3CA1A1000702C09226038180137EA1A100010280933AC0C0F87F80A1A1DB81F0020082A1A1DA1F
+83DDE1FC5BA1A10000028716C1A1A100016FDB63E0EB3FF0A1A101F2F1F0FEA1A1280383FF07FC
+181FA1A10187755AA1A12600861F490323017E7FA1A101000103933911F83E07A1A1E019FC6D7E
+A1A1DA338393380FFF3FA1A1023171EBFF83A1A1DA01C3DC03F713C7A1A1912600E3F0923900E0
+0FFEA1A1037F9439C007F878A1A1030F050013C0A1A16F48F00070A1A103011A60A1A14C94C7FC
+A1A19BD7D7CAFCA1A14B5AA1A193D7D7D2FCA1A11506>712 355 0 0 712]66 dc[<EB3FFCA239
+03C003C0A2000CC71230A20030140CA439C0F00F03A490C7FCA6EBC003A23930300C0CA2EB0FF0
+A2000CC71230A23903C003C0A239003FFC00A2>32 32 0 0 32]68 dc dfe /fd 40 126 df[<
+EAFFFEA3>15 3 2 -10 20]45 dc[<127012F8A31270>5 5 7 0 20]46 dc[<EA07C0EA0FE0EA
+1C70EA3838EA3018EA701CA2EAE00EA9EA701CA2EA3838A2EA1C70EA0FE0EA07C0>15 23 2 0
+20]48 dc[<1203A25A5A123F12F712471207AEEA7FF0A2>12 23 4 0 20]49 dc[<EA0FC0EA1F
+F0EA3838EA701CA212201200A213381370EA07E013F0EA0038131C130EA2124012E0A2EA701CEA
+7838EA3FF0EA0FC0>15 23 2 0 20]51 dc[<EA3FFC127FEA7000A7EA77C0EA7FF0EA7838EA20
+1CEA000C130EA2124012E0131C1260EA7878EA3FF0EA0FC0>15 23 2 0 20]53 dc[<EA01F0EA
+07F8EA0E1C121C1238EA30001270A25AEAE7C0EAEFF0EAF838EAF01C130CEAE00EA21260127013
+0CEA381CEA1C38EA0FF0EA07C0>15 23 2 0 20]54 dc[<B51280A27EC8FCA3387FFF80B5FCA2>
+17 9 1 -7 20]61 dc[<EA01C0487EA21360A2EA0770A4EA0630EA0E38A5EA1FFCA2EA1C1CA2EA
+3C1EEA380E38FE3F80A2>17 23 1 0 20]65 dc[<EAFFF013FCEA381E130E1307A4130E131EEA
+3FFCA2EA381E130E1307A5130E131EEAFFFC13F8>16 23 1 0 20]66 dc[<EAFE7FA2EA381C13
+381378137013E0123913C0EA3B80EA3FC0A213E0123CA2EA3870A21338A2131CA2EAFE3FA2>16
+23 1 0 20]75 dc[<38FE0FE0A2003E1380EA3B1BA413BBA2EA39B3A313F3EA38E3A21303A638
+FE0FE0A2>19 23 0 0 20]77 dc[<EAFFF013FCEA381E130E1307A5130E131EEA3FFC13F0EA38
+00A812FEA2>16 23 1 0 20]80 dc[<EAFFE0A2EAE000B3A7EAFFE0A2>11 29 7 3 20]91 dc[<
+12C07EA21270A27EA27EA27EA27EA2EA0380A3EA01C0A2EA00E0A21370A21338A2131CA2130EA2
+1306>15 29 2 3 20]92 dc[<EAFFE0A21200B3A712FFA2>11 29 1 3 20]93 dc[<EA1FC0EA7F
+F0EA7078EA2018EA001CA2EA07FC121FEA3C1C127012E0A3EA707C383FFF80EA0F8F>17 16 2 0
+20]97 dc[<12FCA2121CA513F8EA1DFEEA1F07EA1E03001C1380EB01C0A6EB0380001E1300EA1F
+0EEA1DFCEA0CF8>18 23 0 0 20]98 dc[<EA03F8EA0FFCEA1C1CEA3808EA7000126012E0A412
+601270EA380EEA1C1EEA0FFCEA03F0>15 16 2 0 20]99 dc[<137EA2130EA5EA07CEEA0FFEEA
+1C3EEA301EEA700E12E0A61270EA301EEA383E381FEFC0EA07CF>18 23 1 0 20]100 dc[<EA07
+E0EA0FF0EA1C38EA301CEA700CEAE00EA2EAFFFEA2EAE00012601270EA380EEA1C1EEA0FFCEA03
+F0>15 16 2 0 20]101 dc[<137C13FEEA01CEEA03841380A3EA7FFE12FFEA0380ACEA7FFCA2>
+15 23 1 0 20]102 dc[<EA07CF381FFF80EA383B38301800EA701CA3EA3018EA3838EA3FF0EA
+37C00070C7FCA2EA3FF86C7E487EEA700F38E00380A438700700EA3C1EEA1FFCEA07F0>17 25 1
+9 20]103 dc[<12FCA2121CA51378EA1DFEEA1F86EA1E07121CAA38FF8FE0A2>19 23 0 0 20]
+104 dc[<1203EA0780A2EA0300C7FCA4EA7F80A21203ACEAFFFCA2>14 24 3 0 20]105 dc[<12
+FCA2121CA5381DFF80A2381C3C005B5BEA1DE0EA1FC0A27FEA1EF0EA1C707FA27F38FE3F80A2>
+17 23 1 0 20]107 dc[<EAFF80A21203B3EAFFFEA2>15 23 2 0 20]108 dc[<EAFB8EEAFFDF
+383CF380A2EA38E3AA38FEFBE01379>19 16 0 0 20]109 dc[<EAFC78EAFDFEEA1F86EA1E0712
+1CAA38FF8FE0A2>19 16 0 0 20]110 dc[<EA07C0EA1FF0EA3C78EA701CA2EAE00EA6EA701CEA
+783CEA3C78EA1FF0EA07C0>15 16 2 0 20]111 dc[<EAFCF8EAFDFEEA1F07EA1E03001C1380EB
+01C0A6EB0380001E1300EA1F0EEA1DFCEA1CF890C7FCA6B47EA2>18 24 0 8 20]112 dc[<EAFE
+1FEB7F80EA0EE3380F810090C7FCA2120EA8EAFFF0A2>17 16 1 0 20]114 dc[<EA0FD8EA3FF8
+EA603812C0A2EAF000EA7F80EA3FF0EA07F8EA001CEA600612E012F0EAF81CEAFFF8EACFE0>15
+16 2 0 20]115 dc[<12035AA4EA7FFC12FFEA0700A8130EA3130CEA03FCEA00F0>15 21 1 0
+20]116 dc[<EAFC3FA2EA1C07AB131F380FFFE0EA03E7>19 16 0 0 20]117 dc[<38FE3F80A2
+381C1C00A46C5AA3EA0630EA0770A36C5AA3>17 16 1 0 20]118 dc[<EA7E3FA2EA1E38EA0E78
+EA07705B12036C5A12037FEA0770EA0E781338487E38FE3F80A2>17 16 1 0 20]120 dc[<38FE
+3F80A2381C1C00A3120E5BA212071330A2EA0370A26C5AA35BA3485A12730077C7FC127E123C>
+17 24 1 8 20]121 dc[<133E13FEEA01E0EA0380AAEA7F0012FE127FEA0380AAEA01E0EA00FE
+133E>15 29 2 3 20]123 dc[<127812FE120FEA0380AAEA01FCEA00FEEA01FCEA0380AAEA0F00
+12FE1278>15 29 2 3 20]125 dc dfe /fe 68 125 df[<EB7E1F3901C1B180390303E3C00007
+13C3000EEBC180903801C000A6B512FC380E01C0B0387F87FC>26 29 0 0 24]11 dc[<137E38
+01C180EA0301380703C0120EEB018090C7FCA5B512C0EA0E01B0387F87F8>21 29 0 0 23]12
+dc[<EB7FC0EA01C1EA03031207EA0E01A7B5FCEA0E01B0387FCFF8>21 29 0 0 23]13 dc[<EA
+6060EAF0F0EAF8F8EA6868EA0808A3EA1010A2EA2020EA4040EA8080>13 12 1 -17 21]34 dc[
+<126012F012F812681208A31210A2122012401280>5 12 4 -17 12]39 dc[<13401380EA0100
+120212065AA25AA25AA212701260A312E0AC1260A312701230A27EA27EA27E12027EEA00801340
+>10 42 3 11 16]40 dc[<7E12407E7E12187EA27EA27EA213801201A313C0AC1380A312031300
+A21206A25AA25A12105A5A5A>10 42 2 11 16]41 dc[<126012F0A212701210A41220A2124012
+80>4 12 4 8 12]44 dc[<EAFFE0A2>11 2 0 -8 14]45 dc[<126012F0A21260>4 4 4 0 12]
+46 dc[<EA03C0EA0C30EA1818EA300CA2EA700EEA6006A2EAE007ADEA6006A2EA700EEA300CA2
+EA1818EA0C30EA07E0>16 29 2 1 21]48 dc[<12035A123F12C71207B3A4EA0F80EAFFF8>13
+28 4 0 21]49 dc[<EA07C0EA1830EA201CEA400C130EEAF00F12F81307A21270EA000F130EA2
+131CA213381370136013C0EA0180EA0300EA0601120C1218EA1002EA3FFE127F12FF>16 28 2 0
+21]50 dc[<EA07E0EA1830EA201CA2EA781E130E131E1238EA001CA2131813301360EA07E0EA00
+30131CA2130E130FA2127012F8A3EAF00EEA401C1220EA1830EA07E0>16 29 2 1 21]51 dc[<
+130CA2131C133CA2135C13DC139CEA011C120312021204120C1208121012301220124012C0B512
+C038001C00A73801FFC0>18 28 1 0 21]52 dc[<EA300CEA3FF813F013C0EA2000A6EA23E0EA
+2430EA2818EA301CEA200E1200130FA3126012F0A3EA800EEA401E131CEA2038EA1870EA07C0>
+16 29 2 1 21]53 dc[<13F0EA030CEA0604EA0C0EEA181E1230130CEA7000A21260EAE3E0EAE4
+30EAE818EAF00C130EEAE0061307A51260A2EA7006EA300E130CEA1818EA0C30EA03E0>16 29 2
+1 21]54 dc[<126012F0A212601200AA126012F0A21260>4 18 4 0 12]58 dc[<126012F0A212
+601200AA126012F0A212701210A41220A212401280>4 26 4 8 12]59 dc[<1306A3130FA3EB17
+80A3EB23C0A3EB41E0A3EB80F0A200017FEB0078EBFFF83803007C0002133CA20006133E000413
+1EA2000C131F121E39FF80FFF0>28 29 1 0 31]65 dc[<B512C0380F00F01438143C141C141E
+A4141C143C1478EB01F0EBFFE0EB0078143C141E140E140FA5141EA2143C1478B512E0>24 28 2
+0 29]66 dc[<90381F8080EBE0613801801938070007000E13035A14015A00781300A2127000F0
+1400A8007014801278A212386CEB0100A26C13026C5B380180083800E030EB1FC0>25 30 2 1
+30]67 dc[<B512C0380F00F0143C140E80A2EC038015C01401A215E0A815C0A214031580140715
+00140E5C1470B512C0>27 28 2 0 32]68 dc[<B512FC380F003C140C1404A214061402A21302
+1400A3130613FE13061302A3140113001402A31406A2140C143CB512FC>24 28 2 0 28]69 dc[
+<B512F8380F007814181408A2140C1404A213021400A3130613FE13061302A490C7FCA77FEAFF
+F8>22 28 2 0 27]70 dc[<90381F8080EBE0613801801938070007000E13035A14015A007813
+00A2127000F01400A6ECFFF0EC0F80007013071278A212387EA27E6C130B380180113800E06090
+381F8000>28 30 2 1 33]71 dc[<EAFFF0EA0F00B3A8EAFFF0>12 28 1 0 15]73 dc[<EA1FFF
+EA00F81378B3127012F8A3EAF0F0EA40E0EA21C0EA1F00>16 29 1 1 21]74 dc[<39FFF03FE0
+390F000F00140C14085C5C5C5C49C7FC13025B130E131F132FEB27801347EB83C0EB01E0A26D7E
+80147880A280141F158039FFF07FF0>28 28 2 0 32]75 dc[<EAFFF8EA0F8090C7FCB01408A3
+1418A2141014301470EB01F0B5FC>21 28 2 0 26]76 dc[<B46CEBFF80000FECF800A2390BC0
+0178A33809E002A23808F004A3EB7808A3EB3C10A3EB1E20A3EB0F40A2EB0780A3EB0300121C3A
+FF8307FF80>33 28 2 0 38]77 dc[<EB3F80EBE0E03803803848487E000E7F487F003C148000
+381303007814C0A20070130100F014E0A8007014C000781303A200381480003C1307001C14006C
+130E6C5B6C6C5A3800E0E0EB3F80>27 30 2 1 32]79 dc[<B51280380F00E01478143C141C14
+1EA5141C143C147814E0EBFF8090C7FCACEAFFF0>23 28 2 0 28]80 dc[<B5FC380F01E0EB00
+7880141C141EA4141C143C5CEB01E001FFC7FCEB03C0EB00E0801478A61510A21438EC3C2038FF
+F01CC7EA07C0>28 29 2 1 31]82 dc[<3807E080EA1C19EA3005EA7003EA600112E01300A36C
+13007E127CEA7FC0EA3FF8EA1FFEEA07FFC61380130FEB07C0130313011280A300C01380A238E0
+0300EAD002EACC0CEA83F8>18 30 2 1 23]83 dc[<007FB512C038700F010060130000401440
+A200C014201280A300001400B1497E3803FFFC>27 28 1 0 30]84 dc[<39FFF07FC0390F000E
+001404B3A26C5B138000035B12016C6C5AEB70C0011FC7FC>26 29 2 1 31]85 dc[<39FFE00F
+F0391F0003C06CEB018015006D5A00071302A26C6C5AA36C6C5AA213F000005BA2EBF830EB7820
+A26D5AA36D5AA2131F6DC7FCA21306A3>28 29 1 1 31]86 dc[<3AFFE0FFE0FF3A1F001F003C
+001E011E13186C011F1310A3D807801420EC2780A2D803C01440EC43C0A213E00001903881E080
+A33A00F100F100A3017913FA017A137AA2013E137C013C133CA301181318A3>40 29 1 1 43]
+87 dc[<397FF0FFC0390FC03E0038078018EA03C0EBE01000015BEBF06000001340EB7880137D
+013DC7FC7F131F7F80A2EB13C0EB23E01321EB41F0EBC0F8EB80783801007C48133C00027F0006
+131F001FEB3F8039FFC0FFF0>28 28 1 0 31]88 dc[<EA0808EA1010EA2020EA4040A2EA8080
+A3EAB0B0EAF8F8EA7878EA3030>13 12 6 -17 21]92 dc[<EA1FC0EA3070EA78387F12301200
+A2EA01FCEA0F1C12381270126000E01340A3EA603C38304E80381F8700>18 18 2 0 21]97 dc[
+<12FC121CAA137CEA1D86EA1E03381C018014C0130014E0A614C013011480381E0300EA1906EA
+10F8>19 29 1 0 23]98 dc[<EA07E0EA0C30EA18781230EA7030EA600012E0A61260EA700412
+30EA1808EA0C30EA07C0>14 18 2 0 18]99 dc[<133F1307AAEA03E7EA0C17EA180F487E1270
+126012E0A61260127012306C5AEA0C373807C7E0>19 29 2 0 23]100 dc[<EA03E0EA0C30EA18
+18EA300CEA700EEA600612E0EAFFFEEAE000A41260EA70021230EA1804EA0C18EA03E0>15 18 1
+0 18]101 dc[<13F8EA018CEA071E1206EA0E0C1300A6EAFFE0EA0E00B0EA7FE0>15 29 0 0 13
+]102 dc[<EB03803803C4C0EA0C38001C138038181800EA381CA4EA1818EA1C38EA0C30EA13C0
+0010C7FC12307EEA1FF813FF1480EA3003386001C0EAC000A33860018038300300EA1C0EEA07F8
+>18 28 1 9 21]103 dc[<12FC121CAA137C1387EA1D03001E1380121CAD38FF9FF0>20 29 1 0
+23]104 dc[<1218123CA21218C7FCA712FC121CB0EAFF80>9 29 1 0 12]105 dc[<13C0EA01E0
+A2EA00C01300A7EA0FE01200B3A21260EAF0C012F1EA6180EA3E00>11 37 -3 8 13]106 dc[<
+12FC121CAAEB3FC0EB0F00130C13085B5B5B13E0121DEA1E70EA1C781338133C131C7F130F1480
+38FF9FE0>19 29 1 0 22]107 dc[<12FC121CB3A9EAFF80>9 29 1 0 12]108 dc[<39FC7E07
+E0391C838838391D019018001EEBE01C001C13C0AD3AFF8FF8FF80>33 18 1 0 36]109 dc[<EA
+FC7CEA1C87EA1D03001E1380121CAD38FF9FF0>20 18 1 0 23]110 dc[<EA03F0EA0E1CEA1806
+487E00701380EA600100E013C0A600601380EA700300301300EA1806EA0E1CEA03F0>18 18 1 0
+21]111 dc[<EAFC7CEA1D86EA1E03381C018014C0130014E0A6EB01C0A21480381E0300EA1D06
+EA1CF890C7FCA7B47E>19 26 1 8 23]112 dc[<EA03C1EA0C33EA180BEA300FEA7007A212E0A6
+12601270EA300F1218EA0C37EA07C7EA0007A7EB3FE0>19 26 2 8 22]113 dc[<EAFCE0EA1D30
+EA1E78A2EA1C301300ACEAFFC0>13 18 1 0 16]114 dc[<EA1F90EA3070EA4030EAC010A212E0
+EAF800EA7F80EA3FE0EA0FF0EA00F8EA8038131812C0A2EAE010EAD060EA8FC0>13 18 1 0 16]
+115 dc[<1204A4120CA2121C123CEAFFE0EA1C00A91310A5120CEA0E20EA03C0>12 26 1 0 16]
+116 dc[<38FC1F80EA1C03AD1307120CEA0E1B3803E3F0>20 18 1 0 23]117 dc[<38FF07E038
+3C0380381C0100A2EA0E02A26C5AA3EA0388A213D8EA01D0A2EA00E0A31340>19 18 1 0 22]
+118 dc[<39FF3FCFE0393C0F0380381C07011500130B000E1382A21311000713C4A213203803A0
+E8A2EBC06800011370A2EB803000001320>27 18 1 0 30]119 dc[<387F8FF0380F03801400EA
+0702EA0384EA01C813D8EA00F01370137813F8139CEA010E1202EA060738040380381E07C038FF
+0FF8>21 18 0 0 22]120 dc[<38FF07E0383C0380381C0100A2EA0E02A26C5AA3EA0388A213D8
+EA01D0A2EA00E0A31340A25BA212F000F1C7FC12F31266123C>19 26 1 8 22]121 dc[<EA7FFC
+EA70381260EA407013F013E0EA41C012031380EA0700EA0F04120E121CEA3C0CEA380812701338
+EAFFF8>14 18 1 0 18]122 dc[<B81280>41 1 0 -11 42]124 dc dfe /ff 16 117 df[<12
+3C127E12FFA4127E123C>8 8 5 0 18]46 dc[<B612F815FF3A03F8003FC0ED0FE0ED07F016F8
+150316FCA616F8150716F0ED1FE0ED3FC090B61200A29039F8003FC0ED0FE0ED07F0ED03F816FC
+150116FEA616FC1503A2ED07F8ED0FF0ED3FE0B71280EDFC00>39 40 2 0 46]66 dc[<91387F
+C004903907FFF80C90391FE01E1C90397F00073CD801FCEB01FC484813004848147C485A49143C
+001F151C485AA2007F150C90C8FCA24892C7FCA94AB512C07E903A800001FC00A2123FA26C7E12
+0F7F6C7E6C7E6C6C1303D8007F130790391FE01E3C903907FFF81C9039007FE004>42 40 4 0
+51]71 dc[<B539E003FFF0A2D803F8C7EA3C0016385E16C04B5A4BC7FC150E5D5D5D5D4A5A4AC8
+FC5C4A7E143F4A7E4A7EEBF9CF9038FB87F09038FE07F8496C7EEBF8016E7E81816F7E826F7E15
+0F6F7E8215036F7E826F7EB5D8E01F13F8A2>45 40 2 0 50]75 dc[<B512F8A2D803F8C8FCB3
+A5ED0180A315031600A25DA25DA25D157EEC01FEB6FCA2>33 40 2 0 39]76 dc[<D8FFF8ED7F
+FC6D15FF00031700A2017EEC01BFA26DEC033FA26D6C1306A36D6C130CA26D6C1318A26D6C1330
+A36D6C1360A26D6C13C0A291387E0180A391383F0300A2EC1F86A2EC0FCCA3EC07F8A26E5AA26E
+5AA2D8FFFC91380FFFFCEC00C0>54 40 3 0 61]77 dc[<B612F015FE3903F8007FED1FC0ED0F
+E0A2ED07F0A216F8A616F0A2ED0FE0A2ED1FC0ED7F0090B512FE15F001F8C8FCB0B512E0A2>37
+40 2 0 44]80 dc[<01FF13400007EBE0C0380F80F9381E001F48130F007C13031278140112F8
+1400A27E15007EEA7F8013F8383FFFC014F86C7F6C7F00037FC61480010F13C01300141FEC0FE0
+1407A200C01303A46C14C0A26CEB07807E00FEEB0F0038E7C03E38C1FFF838803FE0>27 40 4 0
+36]83 dc[<B539E003FFF0A2D803F8C7EA0C00B3AA00015DA26C7E5E017E5C6D14E06D6C485A90
+2607E00FC7FC903801FFFE9038003FF0>44 40 2 0 49]85 dc[<EB7F803803FFE03807E1F038
+0F80F8381F007C48137E007E133EA2143F12FEA2B6FCA248C7FCA4127EA27E1403381F8006EA0F
+C03807F01C3801FFF038003FC0>24 26 2 0 29]101 dc[<9038FE03E03907FFCFF0380F83F838
+1F01F0393E00F8E01500007E7FA5003E5BA26C485A380F83E0EBFFC0D810FEC7FC90C8FC1238A2
+123C383FFFF06C13FE806C14804814C0383C001F007CEB07E0481303A4007CEB07C0A26CEB0F80
+391FC07F003807FFFCC613E0>28 38 2 12 32]103 dc[<120FEA1F8013C0123FA2121F1380EA
+0F00C7FCA7EAFFC0A2120FB3A4EAFFFCA2>14 41 1 0 17]105 dc[<38FFC0FCEBC3FF390FC60F
+8001C813C09038D007E013E0A313C0B039FFFC7FFEA2>31 26 2 0 36]110 dc[<EB7FC03801FF
+F03807E0FC380F803E48487E481480003E130F007E14C0A200FE14E0A8007E14C0A2007F131F6C
+14806C1400380F803E3807E0FC3801FFF038007FC0>27 26 2 0 32]111 dc[<3803F8C0EA1FFF
+EA3C07EA78011270EAF000A27E6C1300EAFFC0EA7FFC6CB4FC6C13806C13C0000113E038000FF0
+1303EAC00113007EA26C13E0EAF80138FE03C038E7FF8038C1FC00>20 26 2 0 25]115 dc[<13
+60A413E0A21201A212031207121FB512C0A23807E000AE1460A63803F0C012013800FF80EB3E00
+>19 37 1 0 25]116 dc dfe /fg 12 118 df[<1230127812FCA212781230>6 6 10 0 26]46
+dc[<133E3801FF804813C03807C1E0EA0F00381E0F70383C3FF0EA387F387070F8EBE078A238E1
+C038A83870E070A2EB70E0EA387F383C3FC0381E0F00380F00383807C0F83803FFF06C13E03800
+3F00>21 30 2 0 26]64 dc[<EA1FF0EA3FFC487EEA780FEA300738000380A2137FEA07FF121F
+EA3F83EA7803127012E0A3EA7007EA780F383FFFFCEA1FFDEA07F0>22 21 3 0 26]97 dc[<EB
+FF80000313C0000F13E0EA1F01383C00C04813001270A25AA51270A2007813707E381F01F0380F
+FFE0000313C03800FE00>20 21 3 0 26]99 dc[<EB1FC0A31301A6EA01F1EA07FDEA0FFFEA1E
+0FEA3C07EA7803EA700112E0A7EA7003A2EA3807EA3E0F381FFFFCEA07FDEA01F1>22 30 2 0
+26]100 dc[<EA01F8EA07FF481380381E07C0EA3C01387800E01270481370A2B512F0A300E0C7
+FC1270A2007813707E381F01F0380FFFE0000313C03800FE00>20 21 3 0 26]101 dc[<EB07E0
+EB1FF0EB3FF8EB7878EBF030EBE000A4387FFFF0B5FCA23800E000AF383FFF804813C06C1380>
+21 30 1 0 26]102 dc[<130C131EA2130C1300A6EA0FFEA3EA000EB3A5131C1260EAF038EAFF
+F8EA7FF0EA1FC0>15 42 2 11 26]106 dc[<12FEA3120EA6EB0FFCEB1FFEEB0FFCEB03C0EB07
+80EB0F00131E5B5B13FC120F13DE138F380E07801303EB01C014E0EB00F038FFE3FE14FF14FE>
+24 30 1 0 26]107 dc[<EAFFE0A31200B3A6B512E0A3>19 30 3 0 26]108 dc[<3807FB80EA
+1FFF127FEA7807EAE003A30078C7FCEA7FC0EA3FFCEA07FE38003F801307386001C012E0A2EAF0
+0338FC0780B51200EAEFFEEAE3F8>18 21 4 0 26]115 dc[<38FE0FE0A3EA0E00AD1301EA0F03
+3807FFFE7EEA00FC>23 21 1 0 26]117 dc dfe /fh 20 118 df[<132013401380EA01005A12
+061204120CA25AA25AA312701260A312E0AE1260A312701230A37EA27EA2120412067E7EEA0080
+13401320>11 50 4 13 19]40 dc[<7E12407E7E12187E12041206A27EA2EA0180A313C01200A3
+13E0AE13C0A312011380A3EA0300A21206A21204120C5A12105A5A5A>11 50 3 13 19]41 dc[<
+EA01F0EA071CEA0C06487E00381380A2387001C0A400F013E0AE007013C0A3EA780300381380A2
+381C0700EA0C06EA071CEA01F0>19 34 2 1 24]48 dc[<13801203120F12F31203B3A9EA07C0
+EAFFFE>15 33 4 0 24]49 dc[<EA03F0EA0C1CEA100700201380384003C0A2008013E012F0EA
+F801A3EA2003120014C0A2EB07801400130E5B13185B5B5B485A90C7FC000213205A5A00181360
+481340383FFFC05AB5FC>19 33 2 0 24]50 dc[<EA01F0EA060C487EEA1807383803801270A2
+38F001C0A314E0A5127013031238EA1805120CEA0619EA03E1380001C0A3EB0380A200301300EA
+78071306EA700CEA20186C5AEA0FC0>19 34 2 1 24]57 dc[<497EA3497EA3EB05E0A2EB0DF0
+1308A2497E1478A2497EA3497EA3497EA290B5FC3901000780A24814C000021303A24814E01401
+A2000CEB00F0A2003EEB01F839FF800FFF>32 35 2 0 37]65 dc[<B512F0380F801E00071307
+EC03C01401EC00E015F01578A2157C153CA3153EA9153CA2157C1578A215F015E01401EC03C0EC
+0700000F131EB512F8>31 34 2 0 37]68 dc[<3803F020380C0C60EA1802383001E0EA700000
+60136012E0A21420A36C1300A21278127FEA3FF0EA1FFE6C7E0003138038003FC0EB07E01301EB
+00F0A214707EA46C1360A26C13C07E38C8018038C60700EA81FC>20 36 3 1 27]83 dc[<EA0F
+E0EA1838EA3C0C130EEA18071200A313FFEA07C7EA1E07123C1278127000F01308A3130FEA7817
+383C2390380FC1E0>21 21 2 0 24]97 dc[<120E12FE121E120EAB131FEB61C0EB8060380F00
+30000E1338143C141C141EA7141C143C1438000F1370380C8060EB41C038083F00>23 35 1 0
+27]98 dc[<EA01FCEA0707380C0380381C01C01238007813E0EA700012F0B5FC00F0C7FCA51270
+0078132012386C13406C138038070300EA00FC>19 21 1 0 22]101 dc[<14703801F19838071E
+18EA0E0E381C0700A2003C1380A4001C1300A2EA0E0EEA0F1CEA19F00010C7FCA21218A2EA1FFE
+380FFFC014E0383800F0006013300040131812C0A300601330A2003813E0380E03803803FE00>
+21 33 1 11 24]103 dc[<390E1FC07F3AFE60E183803A1E807201C03A0F003C00E0A2000E1338
+AF3AFFE3FF8FFE>39 21 1 0 42]109 dc[<380E1F8038FE60C0381E80E0380F0070A2120EAF38
+FFE7FF>24 21 1 0 27]110 dc[<EA0E1F38FE61C0380E8060380F0070000E1338143C141C141E
+A7143CA21438000F1370380E80E0EB41C0EB3F0090C7FCA9EAFFE0>23 31 1 10 27]112 dc[<
+EA0E3CEAFE46EA1E8FEA0F0F13061300120EAD120FEAFFF0>16 21 1 0 19]114 dc[<EA0F88EA
+3078EA601812C01308A212E0EAF000EA7F80EA3FE0EA0FF0EA01F8EA003CEA801C130CA212C013
+08EAE018EAD030EA8FC0>14 21 2 0 19]115 dc[<1202A41206A3120E121E123EEAFFF8EA0E00
+AB1304A6EA07081203EA01F0>14 31 1 0 19]116 dc[<000E137038FE07F0EA1E00000E1370AD
+14F0A238060170380382783800FC7F>24 21 1 0 27]117 dc dfe /fi 20 125 df[<B612C015
+F83907E0007E0003141FED0F80ED07C0150316E0150116F0A616E0150316C01507ED0F80ED1F00
+157C90B512F015FC9038E0001FED0780ED03C0ED01E016F0ED00F8A21678167CA6167816F8A2ED
+01F0ED03E01507ED0FC00007EC3F00B612FE15F0>38 48 4 0 46]66 dc[<91383FC002903901
+FFF806903807E01C90391F00070E013CEB018E49EB00DE49145E4848143E4848141E485A48C812
+0EA2001E1506A2123E003C1502127CA30078150012F8AA1278127C1602A2123C123E121E16047E
+160C6C6C14086C6C14186C6C14106C6C1420017814406DEB0180011FEB0300903807E01E903801
+FFF89038003FC0>39 50 4 1 47]67 dc[<B56CEBFFE0A2D807F0C7EA3F006C48143C16301620
+5E5E4BC7FC15025D5D5D5D5D5D4AC8FC14021406140E141F5CEC4F80EC8FC0EBE1079038E203E0
+01E47FEBE8019038F000F8497F157C81A28182150F6F7E8215036F7E82150082167EA2486CECFF
+80B5D8800313F0A2>44 48 4 0 51]75 dc[<D8FFF0EDFFF0A20007EEFE00D802F8EC017CA301
+7C1402A26D1404A36D1408A36D6C1310A36D6C1320A36D6C1340A36D6C1380A2903900F80100A3
+EC7C02A36E5AA36E5AA3EC0F90A3EC07E0A26E5AA21207486C6C4813FED8FFF891381FFFF0A2>
+52 48 4 0 60]77 dc[<B67E15F03907E000FC0003143E150FED0780ED03C016E0A2150116F0A6
+16E0150316C0A2ED0780ED0F00153E15F890B512E001E0C8FCB3A2487EB57EA2>36 48 4 0 44]
+80 dc[<13FE38070380380801E0486C7E003C1378123E80A2121CC7FCA3EB07FCEB7C3CEA03E0
+EA0780EA1F00123E123C127C0078140812F8A3147CA2007C13BC393E011E10390F060FE03903F8
+07C0>29 30 3 0 32]97 dc[<487E123F12FFA2120F1207AEEB81F8EB860790389803C09038A0
+00E001C013F01578491338153C153E151EA2151FA8151E153E153CA215786D1370014013F09038
+2001C0390610038090380C0E00380403F8>32 49 2 0 36]98 dc[<EB3F80EBE0F03803803848
+487E000E131E001E130E48130FA2007C148000781307A212F8B6FC00F8C8FCA61278A2127C003C
+1480121C001EEB01006C13027E3801C00C3800F030EB1FC0>25 30 2 0 29]101 dc[<EB07E0EB
+1C10EB3838EB707C13E01201EBC03800031300ACB512C0A23803C000B3A7487EEA7FFFA2>22 49
+1 0 20]102 dc[<EC01E090387E06103901C38838380381D0390700E01048EBF000001E1378A2
+003E137CA6001E1378A26C5B6C5BEB81C03809C380D8087EC7FC90C8FC1218A37E120E380FFFF0
+6C13FE6CEBFF80390E000FC00018130348EB00E01270481470A5007014E0A26CEB01C06CEB0380
+6CEB07003803C03C38007FE0>29 46 2 15 32]103 dc[<1207EA0F80121FA2120FEA0700C7FC
+ABEA0180121F12FFA2120F1207B3A4EA0FC0EAFFF8A2>13 47 2 0 18]105 dc[<260181FEEB3F
+C03B3F860780C0F03BFF8801C10038019001E2133C270FA000E4131C000702F4131E01C013F8A2
+495BB3486C486C133F3CFFFC1FFF83FFF0A2>52 30 2 0 56]109 dc[<380181FC383F860F39FF
+880380019013C0380FA001D807C013E0A31380B3390FC003F039FFFC3FFFA2>32 30 2 0 36]
+110 dc[<EB3FC0EBE0703803801C48487E000E7F001E148048EB03C0A2007C14E000781301A200
+F814F0A8007814E0A2007C1303003C14C0A26CEB0780000E14006C130E6C6C5A3800E070EB3FC0
+>28 30 2 0 32]111 dc[<380181F8383F860F39FF9803C09038A001E03907C000F015785B153C
+153EA2151E151FA8151E153E153CA215786D13F0A29038A001C0903890038090388C0E00EB83F8
+0180C7FCAB487EEAFFFCA2>32 44 2 14 36]112 dc[<380183E0383F8C1838FF907CA2EA0FA0
+3807C0381400A35BB2487EEAFFFEA2>22 30 2 0 25]114 dc[<3803FC20380E0260383801E0EA
+300048136012E01420A27EA2007C1300EA7F80EA3FFC6CB4FC00071380000113E0EA000FEB01F0
+388000F8147814387EA36C13306C1370146000C813C038C603803881FE00>21 30 2 0 25]115
+dc[<1340A513C0A31201A212031207120F381FFFE0B5FC3803C000AF1410A80001132013E00000
+1340EB78C0EB1F00>20 43 1 0 25]116 dc[<39FFF803FFA2390FC000F86C48137015606C6C13
+40A26C6C1380A33900F00100A26D5AEB7802A26D5AA2EB3E0CEB1E08A26D5AA214B0EB07A0A2EB
+03C0A36D5AA2>32 30 1 0 34]118 dc[<BB1280>65 1 0 -18 65]124 dc dfe end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300
+%%Feature: *ManualFeed False
+ TeXDict begin 8.267717 11.692913 false @paper
+%%EndSetup
+%%Page: 1 1
+ bop 335 340 a fi(PBMtoPK)23 b(|)f(Con)n(v)n(erting)h(bitmaps)e(to)h(fon)n
+(ts)525 461 y fh(Angus)16 b(Duggan)i(\()p fg(ajcd@uk.ac.)o(ed)o(.lf)o(cs)p fh
+(\))738 558 y(21)f(Septem)o(b)q(er)d(1990)75 737 y ff(PBMtoPK.)75 828 y fe
+(PBMtoPK)k(is)f(a)f(program)f(for)i(con)o(v)o(erting)f(and)h(collecting)f(bit\
+maps)g(in)o(to)g(a)g(PK)i(format)d(fon)o(t,)h(for)g(use)75 878 y(with)11 b
+(T)190 887 y(E)213 878 y(X.)g(PKtoPBM)h(p)q(erforms)f(the)g(in)o(v)o(erse)h
+(op)q(eration,)f(extracting)h(bitmaps)d(from)h(a)g(PK)i(format)d(fon)o(t.)75
+1015 y ff(PBMPLUS.)75 1106 y fe(The)j(PBM)h(\(P)o(ortable)f(BitMap\))g(format)
+e(w)o(as)i(created)h(b)o(y)f(Jef)h(P)o(osk)n(anzer)f(as)g(a)g(\\lo)o(w)o(est)
+f(common)f(denom-)75 1156 y(inator")j(format,)f(whic)o(h)i(images)e(could)i
+(b)q(e)g(translated)h(to)f(and)g(from)e(with)h(ease.)20 b(The)14 b(bitmap)e
+(represen-)75 1206 y(tation)k(is)h(giv)o(en)f(in)h(plain)f(ASCI)q(I)h(text,)g
+(so)g(that)g(images)f(can)h(b)q(e)g(mailed)e(b)q(et)o(w)o(een)j(di\013eren)o
+(t)g(mac)o(hines)75 1256 y(and)12 b(net)o(w)o(orks)h(without)f(the)h(usual)f
+(problems)f(of)h(enco)q(ding)g(and)h(deco)q(ding.)k(\(The)c(ASCI)q(I)g(repres\
+en)o(tation)75 1305 y(of)g(the)i(bitmap)d(also)i(allo)o(ws)f(y)o(ou)g(to)h
+(create)i(or)e(alter)g(images)e(with)i(a)g(text)h(editor,)e(if)h(no)f(b)q(ett\
+er)j(to)q(ols)e(are)75 1355 y(a)o(v)n(ailable.\))137 1405 y(The)h(PBM)f(forma\
+t)e(is)i(v)o(ery)g(simple:)179 1467 y fd(P1)179 1513 y(16)19 b(16)179 1559 y
+(000001111)o(110)o(00)o(00)179 1604 y(000110000)o(001)o(10)o(00)179 1650 y
+(001000000)o(000)o(01)o(00)179 1696 y(010000000)o(000)o(00)o(10)179 1741 y
+(010000000)o(000)o(00)o(10)179 1787 y(100011000)o(011)o(00)o(01)179 1833 y
+(100011000)o(011)o(00)o(01)179 1878 y(100000000)o(000)o(00)o(01)179 1924 y
+(100000000)o(000)o(00)o(01)179 1970 y(100000000)o(000)o(00)o(01)179 2015 y
+(100010000)o(001)o(00)o(01)179 2061 y(010001000)o(010)o(00)o(10)179 2107 y
+(010000111)o(100)o(00)o(10)179 2152 y(001000000)o(000)o(01)o(00)179 2198 y
+(000110000)o(001)o(10)o(00)179 2244 y(000001111)o(110)o(00)o(00)137 2306 y fe
+(The)14 b(image)d(ab)q(o)o(v)o(e)i(is)g(a)g(smiley)f(face)h(\()p fc(D)p fe
+(\).)g(The)h(\014rst)g(t)o(w)o(o)f(c)o(haracters)i(of)e(the)h(\014le)f(con)o
+(tain)g(the)g(\\magic)75 2356 y(n)o(um)o(b)q(er")e(of)h(the)h(\014le)f(|)g
+(in)g(the)h(case)g(of)f(a)g(PBM)h(\014le,)f(this)g(is)g(\\)p fb(P1)p fe(".)17
+b(The)12 b(width)g(and)h(heigh)o(t)f(of)f(the)i(image)75 2405 y(follo)o(w,)e
+(sep)q(erated)j(b)o(y)f(whitespace)h(\(spaces,)g(tabs)f(or)g(newlines\),)g
+(and)f(then)i(the)f(image)e(data,)h(enco)q(ded)i(as)75 2455 y(ones)f(and)f
+(zeros.)19 b(The)13 b(PBM)g(format)e(sp)q(eci\014cation)i(allo)o(ws)e(white)i
+(space)h(to)e(app)q(ear)h(almost)d(an)o(ywhere)k(in)75 2505 y(the)g(\014le)f
+(|)f(the)i(image)d(need)j(not)f(ha)o(v)o(e)g(newlines)h(b)q(et)o(w)o(een)g
+(image)d(ro)o(ws,)i(and)g(the)h(bits)f(can)g(b)q(e)h(sep)q(erated)75 2555 y
+(b)o(y)g(whitespace)h(if)e(desired.)19 b(Commen)o(ts)12 b(can)i(b)q(e)h(inclu\
+ded)f(in)g(PBM)g(\014les,)g(but)g(most)f(of)g(the)i(PBM)f(\014lters)75 2605 y
+(will)e(delete)j(them)e(from)g(their)h(output.)137 2655 y(The)k(PBMPLUS)h(to)
+q(olkit)e(con)o(tains)h(programs)e(to)i(p)q(erform)f(man)o(y)f(common)f(image)
+g(manipulation)75 2704 y(op)q(erations)g(on)g(PBM)h(format)d(images,)h(suc)o
+(h)i(as)f(cropping,)g(cutting,)g(pasting,)g(rotating,)f(shearing,)h(con-)75
+2754 y(v)o(erting)g(b)q(et)o(w)o(een)h(image)d(formats,)g(etc..)21 b(These)16
+b(programs)d(are)j(usually)e(arranged)h(as)g fa(\014lters)s fe(;)f(they)h(tak)
+o(e)930 2866 y(1)p eop
+%%Page: 2 2
+ bop 75 166 a fe(the)11 b(input)f(image)f(on)h(the)h(default)g(input)f(stream\
+,)g(and)g(write)h(their)g(output)g(to)f(the)h(default)g(output)f(stream.)75
+216 y(This)k(organisation)f(allo)o(ws)g(m)o(ultiple)f(image)h(manipulations)e
+(to)j(b)q(e)h(strung)g(together)h(in)e(a)g(pip)q(eline,)f(cre-)75 266 y(ating)
+g(no)h(unnecessary)i(temp)q(orary)d(\014les.)137 315 y(There)18 b(are)e(t)o
+(w)o(o)g(other)h(image)d(formats)g(whic)o(h)i(are)h(supp)q(orted)g(b)o(y)f
+(the)h(PBMPLUS)g(to)q(olkit.)24 b(These)75 365 y(are)15 b(the)g(PGM)f(\(P)o
+(ortable)g(Gra)o(yMap\))g(format,)e(and)i(the)h(PPM)f(\(P)o(ortable)h(PixMap\
+\))f(format,)e(whic)o(h)i(are)75 415 y(lo)o(w)o(est)c(common)e(denominator)h
+(formats)g(for)i(gra)o(yscale)f(and)h(colour)f(images)f(resp)q(ectiv)o(ely)m
+(.)18 b(These)12 b(formats)75 465 y(ha)o(v)o(e)i(the)h(magic)d(n)o(um)o(b)q
+(ers)i(P2)h(and)f(P3,)g(and)g(a)g(similar)e(organisation)h(of)g(the)i(image)e
+(data.)19 b(In)14 b(addition,)75 515 y(there)e(are)f(binary)g(v)n(arian)o(ts)
+f(on)g(the)i(PBM,)f(PGM)f(and)h(PPM)g(formats,)f(whic)o(h)h(are)g(unsuitable)
+g(for)f(mailing.)75 565 y(These)15 b(v)n(arian)o(ts)e(ha)o(v)o(e)h(the)h(magi\
+c)c(n)o(um)o(b)q(ers)j(P4,)f(P5,)h(and)f(P6.)137 614 y(W)m(riting)g(programs)
+g(whic)o(h)h(use)h(the)f(PBMPLUS)i(formats)c(is)i(made)f(a)h(lot)g(easier)h
+(b)o(y)e(the)i(PBMPLUS)75 664 y(libraries,)h(whic)o(h)g(pro)o(vide)g(function\
+s)h(for)f(reading)g(and)g(writing)f(PBMPLUS)i(images)e(in)h(their)h(en)o(tire\
+t)o(y)m(,)75 714 y(or)d(ro)o(w)g(b)o(y)f(ro)o(w.)137 764 y(The)i(PBMPLUS)g
+(to)q(olkit)d(has)i(b)q(een)h(p)q(orted)g(to)f(VMS)g(and)g(other)g(systems.)
+75 901 y ff(Using)23 b(PBMtoPK.)75 992 y fe(PBMtoPK)15 b(and)g(PKtoPBM)g(are)
+g(based)g(on)f(T)m(om)e(Rokic)o(ki's)h(PXtoPK)i(and)f(PKtoPX)h(programs.)j
+(They)75 1042 y(are)e(written)f(in)g(C,)g(and)g(are)h(link)o(ed)e(with)h(the)
+h(PBM)g(library)m(.)21 b(PBMtoPK)16 b(can)g(b)q(e)f(used)i(to)e(incorp)q(orat\
+e)75 1092 y(bi-lev)o(el)g(images)f(in)o(to)h(T)467 1101 y(E)490 1092 y(X)h
+(do)q(cumen)o(ts,)g(b)o(y)g(creating)g(a)f(fon)o(t)h(whic)o(h)f(con)o(tains)h
+(the)g(images)f(used)h(in)g(the)75 1141 y(do)q(cumen)o(t)d(as)h(c)o(haracters\
+.)20 b(Figure)14 b(1)g(sho)o(ws)g(an)g(example)e(graphic)i(whic)o(h)g(w)o(as)
+f(created)j(in)d(this)h(w)o(a)o(y)m(.)584 1554 y fc(B)411 1646 y fe(Figure)g
+(1:)j(A)d(scanned)h(line-dra)o(wing)e(con)o(v)o(erted)i(b)o(y)f(PBMtoPK)137
+1745 y(Some)20 b(D)o(VI)g(driv)o(ers)h(ma)o(y)e(ha)o(v)o(e)i(problems)e(handl\
+ing)h(the)h(large)g(c)o(haracters)h(whic)o(h)f(are)g(t)o(ypically)75 1795 y
+(created)e(b)o(y)f(this)g(pro)q(cess.)32 b(This)18 b(should)g(not)g(b)q(e)g
+(a)g(problem)f(if)g(the)h(driv)o(er)h(adheres)g(to)f(the)g(recen)o(tly-)75
+1845 y(published)c(draft)g(Lev)o(el)g(0)f(D)o(VI)h(driv)o(er)g(sp)q(eci\014ca\
+tions.)137 1895 y(T)m(o)19 b(create)j(a)d(simple)f(fon)o(t)i(con)o(taining)e
+(only)h(one)h(image)e(\(in)i(the)g(c)o(haracter)h(p)q(osition)e(of)g(\\A"\),)
+h(a)75 1945 y(command)11 b(similar)h(to)179 2007 y fd(pbmtopk)17 b(example.3)
+o(00)o(pk)f(example.tf)o(m)h(300)h(-s10)g(-c65)g(image.pbm)75 2069 y fe(w)o
+(ould)e(b)q(e)h(used.)28 b(This)16 b(command)e(will)h(create)j(the)g(PK)f(fon)
+o(t)f(\014le)h fb(example.300pk)d fe(and)i(the)i(TFM)e(\014le)75 2119 y fb
+(example.tfm)p fe(,)c(setting)i(the)h(resolution)g(of)f(the)g(fon)o(t)g(to)h
+(300)e(dots)i(p)q(er)g(inc)o(h,)f(and)g(the)h(design)g(size)g(of)f(the)75 2169
+y(fon)o(t)h(to)h(10)f(p)q(oin)o(ts.)24 b(T)m(o)15 b(include)h(this)g(image)d
+(in)j(the)g(do)q(cumen)o(t,)f(a)h(fon)o(t)f(declaration)h(should)f(b)q(e)i
+(put)f(in)75 2218 y(the)e(do)q(cumen)o(t)g(prologue:)179 2281 y fd(\\font\\im\
+a)o(gef)o(on)o(t=e)o(xa)o(mpl)o(e)137 2343 y fe(The)i(fon)o(t)e(ma)o(y)f(then)
+i(b)q(e)h(selected,)g(and)f(the)g(image)e(can)i(b)q(e)g(t)o(yp)q(eset)i(b)o
+(y)d(placing)g(the)h(c)o(haracter)i(\\A")75 2393 y(on)d(the)g(page.)k(F)m(or)
+c(example:)179 2455 y fd(\\begin{fi)o(gur)o(e})o([hb)o(t])o(\\ce)o(nte)o(ri)o
+(ng)179 2501 y(\\mbox{\\im)o(age)o(fo)o(nt)i(A})179 2546 y(\\caption{)o(A)h
+(scanned)f(image)i(converted)e(by)j(PBMtoPK})179 2592 y(\\end{figu)o(re})137
+2654 y fe(The)12 b(TFM)f(and)g(PK)h(\014les)g(will)d(probably)i(ha)o(v)o(e)g
+(to)g(b)q(e)h(mo)o(v)o(ed)d(to)i(an)g(appropriate)h(directory)g(\(the)g(exact)
+75 2704 y(directory)j(names)f(are)h(site)f(and)h(D)o(VI)f(driv)o(er)g(sp)q
+(eci\014c\);)i(D)o(VI)e(driv)o(ers)h(and)f(preview)o(ers)i(ma)o(y)d(also)g
+(require)75 2754 y(that)g(the)h(lo)q(cation)e(of)h(the)h(PK)f(and)h(TFM)f(\
+\014les)g(are)h(included)f(in)g(option)g(\014les)g(or)g(en)o(vironmen)o(t)f
+(v)n(ariables.)930 2866 y(2)p eop
+%%Page: 3 3
+ bop 137 166 a fe(The)17 b(ma)r(jor)d(disadv)n(an)o(tage)i(of)f(this)i(metho)
+q(d)e(of)h(including)f(raster)i(graphics)g(in)e(T)1476 175 y(E)1499 166 y(X)i
+(output)f(is)g(that)75 216 y(the)e(user)h(m)o(ust)e(kno)o(w)h(man)o(y)e(detai\
+ls)h(ab)q(out)h(the)h(output)f(device.)137 266 y(PBMtoPK)h(pro)o(vides)e(a)g
+(large)g(n)o(um)o(b)q(er)g(of)g(options)g(whic)o(h)g(can)g(b)q(e)h(used)h(to)
+e(alter)g(information)e(in)i(the)75 315 y(PK)k(and)f(TFM)h(fon)o(t)f(\014les)
+h(|)f(the)h(designsize,)h(resolution,)e(fon)o(t)g(parameters,)h(and)g(the)g
+(co)q(ding)f(sc)o(heme)75 365 y(and)g(fon)o(t)g(family)e(name)h(commen)o(ts)g
+(can)i(all)e(b)q(e)j(reset.)28 b(Options)16 b(are)h(pro)o(vided)g(to)f(set)i
+(the)f(c)o(haracter's)75 415 y(width,)g(heigh)o(t,)f(depth,)i(and)e(italic)g
+(correction)h(in)g(the)g(TFM)g(\014le)f(for)g(eac)o(h)i(c)o(haracter)g(\(thes\
+e)g(need)f(not)75 465 y(b)q(e)g(the)g(same)e(as)h(the)h(c)o(haracter's)g(actu\
+al)f(width)g(or)g(heigh)o(t)g(in)g(pixels\),)g(and)g(the)h(c)o(haracter)g(ori\
+gin)e(and)75 515 y(horizon)o(tal)g(and)g(v)o(ertical)h(escap)q(emen)o(ts)g
+(in)f(the)i(PK)f(\014le.)23 b(Sensible)16 b(guesses)i(are)e(made)e(for)h(an)o
+(y)g(piece)i(of)75 565 y(information)11 b(not)j(supplied,)f(based)i(on)e(the)
+i(information)c(whic)o(h)j(w)o(as)f(supplied)h(and)g(the)h(image)d(size.)137
+614 y(If)e(m)o(ultiple)f(images)g(are)h(b)q(eing)h(included)g(in)f(one)g(fon)
+o(t)g(\014le,)h(or)f(a)h(fon)o(t)f(is)g(b)q(eing)g(con)o(v)o(erted)i(from)d
+(another)75 664 y(format)15 b(in)o(to)h(a)g(PK)h(fon)o(t,)f(the)i(command-l)o
+(ine)c(options)i(rapidly)g(b)q(ecome)g(un)o(wieldy)g(and)h(ma)o(y)e(o)o(v)o
+(er\015o)o(w)75 714 y(the)g(maxim)n(um)10 b(command)i(line)i(size.)20 b(A)14 b
+(facilit)o(y)f(is)h(therefore)i(pro)o(vided)e(to)h(read)g(the)g(c)o(haracter-\
+sp)q(eci\014c)75 764 y(options)f(from)e(a)h(\014le,)h(whic)o(h)f(can)i(b)q
+(e)f(prepared)h(with)f(a)f(text)i(editor,)e(or)h(automatically)d(generated.)
+137 814 y(Ligature)k(and)g(k)o(erning)g(tables)g(are)g(not)g(catered)h(for)f
+(at)g(all)e(b)o(y)i(PBMtoPK)h(|)e(if)g(these)j(features)f(are)75 863 y(requir\
+ed)h(in)e(the)i(fon)o(t,)e(the)i(TFM)f(\014le)g(should)g(b)q(e)g(con)o(v)o
+(erted)h(to)f(a)g(PL)g(\(Prop)q(ert)o(y)h(List\))f(\014le,)g(edited)g(b)o(y)
+75 913 y(hand,)d(and)h(con)o(v)o(erted)h(bac)o(k)f(in)o(to)f(a)h(TFM)g(\014le\
+.)137 963 y(The)h(in)o(terface)f(to)g(PKtoPBM)h(is)f(m)o(uc)o(h)f(simpler;)f
+(the)j(name)e(of)g(the)i(PK)f(\014le)g(from)e(whic)o(h)i(glyphs)g(are)75 1013
+y(to)e(b)q(e)i(extracted)g(is)e(giv)o(en)h(on)f(the)h(command)d(line,)i(with)
+g(a)h(list)f(of)g(names)g(for)g(the)h(PBM)g(\014les)g(mixed)f(with)75 1063 y
+(switc)o(hes)j(whic)o(h)f(set)h(the)f(n)o(um)o(b)q(er)f(of)h(the)g(next)g(c)o
+(haracter)i(to)d(b)q(e)i(extracted.)75 1200 y ff(Getting)22 b(PBMtoPK.)75 1291
+y fe(PBMtoPK)13 b(and)e(PKtoPBM)i(are)f(on)f(the)h(Aston)g(arc)o(hiv)o(e,)g
+(in)f(the)h(directory)g fb([tex-archive.wherev)o(er])p fe(.)75 1341 y(PBMtoPK)
+k(w)o(as)g(p)q(osted)g(to)f(Usenet)i(group)f fb(alt.sources)d fe(in)i(early)g
+(August,)h(and)f(so)g(should)h(b)q(e)g(found)75 1391 y(in)d(an)o(y)h(arc)o
+(hiv)o(e)g(storing)g fb(alt.sources)p fe(.)1649 1450 y fc(A)p fe(.)930 2866 y
+(3)p eop
+%%Trailer
+ end
+userdict /end-hook known{end-hook}if
+SafetyEnclosure restore
+%%EOF
diff --git a/graphics/pbmtopk/doc/pbmtopk.tex b/graphics/pbmtopk/doc/pbmtopk.tex
new file mode 100644
index 0000000000..b963197716
--- /dev/null
+++ b/graphics/pbmtopk/doc/pbmtopk.tex
@@ -0,0 +1,179 @@
+%%% pbmtopk.tex
+%%% AJCD 21/9/90
+%%% Short article for UK TeX User's Group newsletter about the PBMtoPK and
+%%% PKtoPBM programs.
+
+\documentstyle[a4,verbatim]{article}
+
+\title{PBMtoPK --- Converting bitmaps to fonts}
+\author{Angus Duggan ({\tt ajcd@uk.ac.ed.lfcs})}
+\date{21 September 1990}
+
+%%% Please alter this directory
+\def\inaston{[tex-archive.fonts.duggan]}
+
+%%% Dates of Usenet posting
+\def\postingdates{at the beginning of August, with three patches on 10th
+August, 12th August, and 21st September}
+
+%%% Example font for this document
+\font\examplf=examplf
+
+%%% new environment for examples; small, indented, verbatim
+\newenvironment{example}%
+ {\quote\small\verbatim}%
+ {\endverbatim\endquote\smallskip}
+
+\begin{document}
+
+\maketitle
+
+\section*{PBMtoPK.}
+PBMtoPK is a program for converting and collecting bitmaps into a PK format
+font, for use with \TeX. PKtoPBM performs the inverse operation, extracting
+bitmaps from a PK format font.
+
+\section*{PBMPLUS.}
+The PBM (Portable BitMap) format was created by Jef Poskanzer as a ``lowest
+common denominator'' format, which images could be translated to and from with
+ease. The bitmap representation is given in plain ASCII text, so that images
+can be mailed between different machines and networks without the usual
+problems of encoding and decoding. (The ASCII representation of the bitmap
+also allows you to create or alter images with a text editor, if no better
+tools are available.)
+
+The PBM format is very simple:
+\begin{example}
+P1
+16 16
+0000011111100000
+0001100000011000
+0010000000000100
+0100000000000010
+0100000000000010
+1000110000110001
+1000110000110001
+1000000000000001
+1000000000000001
+1000000000000001
+1000100000010001
+0100010000100010
+0100001111000010
+0010000000000100
+0001100000011000
+0000011111100000
+\end{example}
+The image above is a smiley face ({\examplf S}).
+The first two characters of the file contain the ``magic number'' of the
+file --- in the case of a PBM file, this is ``{\tt P1}''. The width and height
+of the image follow, seperated by whitespace (spaces, tabs or newlines), and
+then the image data, encoded as ones and zeros. The PBM format specification
+allows white space to appear almost anywhere in the file --- the image need
+not have newlines between image rows, and the bits can be seperated by
+whitespace if desired. Comments can be included in PBM files, but most of the
+PBM filters will delete them from their output.
+
+The PBMPLUS toolkit contains programs to perform many common image
+manipulation operations on PBM format images, such as cropping, cutting,
+pasting, rotating, shearing, converting between image formats, etc..
+These programs are usually arranged as {\em filters\/}; they take the input
+image on the default input stream, and write their output to the default
+output stream. This organisation allows multiple image manipulations to be
+strung together in a pipeline, creating no unnecessary temporary files.
+
+There are two other image formats which are supported by the PBMPLUS toolkit.
+These
+are the PGM (Portable GrayMap) format, and the PPM (Portable PixMap) format,
+which are lowest common denominator formats for grayscale and colour images
+respectively. These formats have the magic numbers P2 and P3, and a similar
+organisation of the image data. In addition, there are binary variants
+on the PBM, PGM and PPM formats, which are unsuitable for mailing. These
+variants have the magic numbers P4, P5, and P6.
+
+Writing programs which use the PBMPLUS formats is made a lot easier by the
+PBMPLUS libraries, which provide functions for reading and writing PBMPLUS
+images in
+their entirety, or row by row.
+
+The PBMPLUS toolkit has been ported to VMS and other systems.
+
+\section*{Using PBMtoPK.}
+PBMtoPK and PKtoPBM are based on Tom Rokicki's PXtoPK and PKtoPX programs.
+They are written in C, and are linked with the PBM library. PBMtoPK can be
+used to incorporate bi-level images into \TeX\ documents, by creating a font
+which contains the images used in the document as characters.
+Figure~\ref{fig:beast} shows an example graphic which was created in this way.
+
+\begin{figure}[hbt]\centering
+\mbox{\examplf B}
+\caption{A scanned line-drawing converted by PBMtoPK}\label{fig:beast}
+\end{figure}
+
+Some DVI drivers may have problems handling the large characters which are
+typically created by this process. This should not be a problem if the driver
+adheres to the recently-published draft Level~0 DVI driver specifications.
+
+To create a simple font containing only one image (in the character position
+of ``A''), a command similar to
+\begin{example}
+pbmtopk example.300pk example.tfm 300 -s10 -c65 image.pbm
+\end{example}
+\noindent
+would be used. This command will create the PK font file {\tt example.300pk}
+and the TFM file {\tt example.tfm}, setting the resolution of the font to 300
+dots per inch, and the design size of the font to 10 points. To include this
+image in the document, a font declaration should be put in the document
+prologue:
+\begin{example}
+\font\imagefont=example
+\end{example}
+The font may then be selected, and the image can be typeset by placing the
+character ``A'' on the page. For example:
+\begin{example}
+\begin{figure}[hbt]\centering
+\mbox{\imagefont A}
+\caption{A scanned image converted by PBMtoPK}
+\end{figure}
+\end{example}
+The TFM and PK files will probably have to be moved to
+an appropriate directory (the exact directory names are site and DVI driver
+specific); DVI drivers and previewers may also require that the location of the
+PK and TFM files are included in option files or environment variables.
+
+The major disadvantage of this method of including raster graphics in \TeX\
+output is that the user must know many details about the output device.
+
+PBMtoPK provides a large number of options which can be used to alter
+information in the PK and TFM font files --- the designsize, resolution,
+font parameters, and the coding scheme and font family name comments can all
+be reset. Options are provided to set the character's width, height, depth,
+and italic correction in the TFM file for each character (these need not be
+the same as the
+character's actual width or height in pixels), and the character origin and
+horizontal and vertical escapements in the PK file. Sensible guesses are made
+for any piece of information not supplied, based on the information
+which was supplied and the image size.
+
+If multiple images are being included in one font file, or a font is being
+converted from another format into a PK font, the command-line options
+rapidly become unwieldy and may overflow the maximum command line size.
+A facility is therefore provided to read the character-specific options from a
+file, which can be prepared with a text editor, or automatically generated.
+
+Ligature and kerning tables are not catered for at all by PBMtoPK --- if these
+features are required in the font, the TFM file should be converted to a PL
+(Property List) file, edited by hand, and converted back into a TFM file.
+
+The interface to PKtoPBM is much simpler; the name of the PK file from which
+glyphs are to be extracted is given on the command line, with a list of names
+for the PBM files mixed with switches which set the number of the next
+character to be extracted.
+
+\section*{Getting PBMtoPK.}
+PBMtoPK and PKtoPBM are on the Aston archive, in the directory {\tt\inaston}.
+PBMtoPK was posted to Usenet group {\tt alt.sources} \postingdates, and
+so should be available from any archive storing {\tt alt.sources}.
+
+\noindent\hfill{\examplf A}.
+
+\end{document}
diff --git a/graphics/pbmtopk/doc/smiley300.pbm.Z.btoa b/graphics/pbmtopk/doc/smiley300.pbm.Z.btoa
new file mode 100644
index 0000000000..cfca32bd6e
--- /dev/null
+++ b/graphics/pbmtopk/doc/smiley300.pbm.Z.btoa
@@ -0,0 +1,6 @@
+xbtoa Begin
++.\Ki@ORTe!sCmn0G5j?(o*eBLCG%lKRn*:6AQIg=B&CbTu2j2,>.<InKZ,.%k!MSH#b-&MB5uRHs-
+!99U?Z+_Q\<,U<&c`Hf@^)<9VPr$@&GT\C>$:TI"lX2!Isg<JaFC54s1Y,h/etNOEX?<p\5>Asj!jR
+MII/[Ue9mNVdj2?*7G[:6fP$.+Z"Rn`mJBoInV*C,$Ltb>kh$_^48.>mZnejMmI[eg3=VDWf7l1I=4
+Gq6+JB$31&+
+xbtoa End N 194 c2 E b6 S 5cea R 95a887dc
diff --git a/graphics/pbmtopk/pbmtopk/Makefile b/graphics/pbmtopk/pbmtopk/Makefile
new file mode 100644
index 0000000000..a1f21555e2
--- /dev/null
+++ b/graphics/pbmtopk/pbmtopk/Makefile
@@ -0,0 +1,28 @@
+# Simple makefile for pbmtopk & pktopbm
+# AJCD 9/8/90
+
+#CC=gcc-1.37.1
+CFLAGS=-I. -O
+
+all: pbmtopk pktopbm
+
+test: test.dvi test.pbm
+
+pbmtopk: pbmtopk.c
+ $(CC) $(CFLAGS) -o pbmtopk pbmtopk.c -lpbm
+
+pktopbm: pktopbm.c
+ $(CC) $(CFLAGS) -o pktopbm pktopbm.c -lpbm
+
+test.pbm: pktopbm test.300pk
+ pktopbm test.300pk -c 65 test.pbm
+
+test.dvi: test.tex test.tfm
+ tex test
+
+test.300pk test.tfm: pbmtopk test.opt
+ pbmtopk test.300pk test.tfm 300 -s 10 -f test.opt
+
+clean:
+ rm -f pbmtopk pktopbm test.dvi test.log test.tfm test.300pk test.pbm
+
diff --git a/graphics/pbmtopk/pbmtopk/face.pbm b/graphics/pbmtopk/pbmtopk/face.pbm
new file mode 100644
index 0000000000..eb79666e15
--- /dev/null
+++ b/graphics/pbmtopk/pbmtopk/face.pbm
@@ -0,0 +1,66 @@
+P1
+64 64
+0111110100000000010110101110101001000010100000010000000000001001
+0011011101011011010110111111011010010100000101000101000010100000
+1111101010000101011011011110101001010010101000010000010001000001
+0011110100101010110110111111110101011101000010100010100101011000
+1111011011001011101011111010101010101010010000010100001000110000
+0110110100101010111101011011111101011011010101010000010010000100
+1111010101010101101111111101100101010100101010101010100100000000
+0101010010101011011111010101011010110101010110101010010001000000
+1110100110111010111110101101010101111101101101101001001000000000
+0100010101010101011101010111101110101010111110101011010101001010
+0001001111010000000010010101110101010101010000000100100101010000
+0100011101010101001000101011011101101010101010000001010101010010
+0010110101101000000010000111110110101001000000000000010101010100
+1000111111010000010000010001010101010000010000000001010101010000
+0011110110101001000000000000100010000100000000000000101110101010
+0010111111010100000101000100001000000000000000000100011011010100
+0101011111100000010000000000000000000000000000000000111111110101
+0001111111110101000100000000000000000000000000000000011111111010
+0111111111000000000001000000000000000000100000000000111111111100
+1011111111101010001000010001000000000000000100010000011101111111
+0111111111010000000000000000000000000000000000000010111111111010
+0001110111100101001001000000001000000000000000000000011111111110
+0111111111010000000000000000000000000000000000100000111111011100
+0010111111101010100000000100000000000000000000000010011111111101
+0001111111000000000000100000000000000100000000000000111011111010
+1010111111010100000000000000100000100000000000000100011111110100
+0001011111000001001010010100001000000000000000000000011111111010
+0100111111110100010001010010100010010100010010000010001111110100
+0001011011000010101101111010001000101010100000000000011111110010
+0100101111001000010011110101100010101010100101010000101110111100
+0001011111100010101101001010010001010101110100000000011111110010
+0100000101001001010010110001000000010101110101010100001111101000
+0010001011000000000000000100000000000000001000000000010100011101
+1000100001010010000100100000100000000100100000000000000100000110
+0000001010000000100000000010000000100000000001000000010010010101
+0010100010101000000100100000100000000001000000000000000100001011
+0100000100000010000000000100000000000000000000000000100000000100
+0010101001011000000000000001000000000000001000000010000000010101
+1010111000100001000000000000010000000000000000000000000000100010
+0001110101000100000100001001000000001000000001001001001000010101
+0101110000101001000000000000000000000000000000000000000010001001
+0000111010010000010000100101010010100000000000010001001001010010
+0101001010100101000000000010100101010010000000000100000010101101
+0000100001010000000100000101011011100000010001000000001010000101
+0000001010100100100000100010101000010000000000001001010001010101
+0010100010010000000000001000100101000000000000000000001010101011
+0000001001000101001001000010001000000000000100010001010101010111
+0010101010010000000000001000100100001001000000000000010101001011
+0100010001000100100010100101010010000000010000100010011010100111
+1000101010010000001000010111111111110101000000000000001101001011
+0101010100100101000000001010101000101000000000010010100110101111
+1010010010001000000100100001010101000001001001000000001010101111
+0001101000100100100000000100101010010000000000001010101101011111
+0110010010010001001010100001000001000010001000100000001010101111
+1010101001000100010000001000010000001000000010001001101100111111
+0101010010000010100010100000000100000000101000100100010101011111
+1110101001010000010100000100000000000000000010000001111000111111
+1010100101001010100000100000000000000001001000010010110010111111
+0101010010010001001010001001001010010000010010000101100101110111
+1010100100000110010010100100100001000101001001000011010100111111
+0101001001010010001000100010010100101001000100000101101011111111
+1010100100101100100101001001001001010010010000000010010100111111
+0100010001001001000010101010010101001001000000000101101011111111
+0101000101010100010100010000100010010100000001000010011111111111
diff --git a/graphics/pbmtopk/pbmtopk/pbmtopk.1 b/graphics/pbmtopk/pbmtopk/pbmtopk.1
new file mode 100644
index 0000000000..d518356b99
--- /dev/null
+++ b/graphics/pbmtopk/pbmtopk/pbmtopk.1
@@ -0,0 +1,73 @@
+.TH pbmtopk 1 "6 August 1990"
+.SH NAME
+pbmtopk - convert a portable bitmap into a packed (PK) format font
+.SH SYNOPSIS
+pbmtopk pkfile[.pk] tfmfile[.tfm] resolution [-s designsize] [-p num param...]
+[-C codingscheme] [-F family] [-f optfile] [-c num]
+[-W width] [-H height] [-D depth]
+[-I ital] [-h horiz] [-v vert] [-x xoff] [-y yoff] [pbmfile]...
+.SH DESCRIPTION
+Reads portable bitmaps as input, and produces a packed (PK) font file and a
+TFM (TeX font metric) file as output. The resolution parameter indicates the
+resolution of the font, in dots per inch. If the filename "-" is used for any
+of the filenames, the standard input stream (or standard output where
+appropriate) will be used.
+.SH OPTIONS
+.IP "-s designsize"
+Sets the design size of the font, in TeX's points (72.27pt to the inch). The
+default design size is 1. The TFM parameters are given as multiples of the
+design size.
+.IP "-p num param..."
+Sets the first num font parameters for the font. The first seven parameters
+are the slant,
+interword spacing, interword space stretchability, interword space
+shrinkability, x-height, quad width, and post-sentence extra space of the
+font. Math and symbol fonts may have more parameters; see The TeXbook for a
+list of these. Reasonable default values are chosen for parameters which are
+not specified.
+.IP "-C codingscheme"
+Sets the coding scheme comment in the TFM file.
+.IP "-F family"
+Sets the font family comment in the TFM file.
+.IP "-f optfile"
+Reads the file optfile, which should contain a lines of the form:
+.sp
+.nf
+.na
+ filename xoff yoff horiz vert width height depth ital
+.fi
+.ad
+.sp
+The pbm files specified by the filename parameters are inserted consecutively
+in the font with the specified attributes. If any of the attributes are
+omitted, or replaced with "*", a default value will be calculated from the
+size of the bitmap. The settings of the -W, -H, -D, -I, -h, -v, -x, and -y
+options do not affected characters created in this way.
+The character number can be changed by including a line starting with "=",
+followed by the new number.
+Lines beginning with
+"%" or "#" are ignored.
+.IP "-c num"
+Sets the character number of the next bitmap encountered to num.
+.IP "-W width"
+Sets the TFM width of the next character to width (in design size multiples).
+.IP "-H height"
+Sets the TFM height of the next character to height (in design size multiples).
+.IP "-D depth"
+Sets the TFM depth of the next character to depth (in design size multiples).
+.IP "-I ital"
+Sets the italic correction of the next character to
+ital (in design size multiples).
+.IP "-h horiz"
+Sets the horizontal escapement of the next character to horiz (in pixels).
+.IP "-v vert"
+Sets the vertical escapement of the next character to vert (in pixels).
+.IP "-x xoff"
+Sets the horizontal offset of the next character to xoff (in pixels).
+.IP "-y yoff"
+Sets the vertical offset of the next character to yoff (in pixels, from the
+top row).
+.SH "SEE ALSO"
+pktopbm(1), pbm(5)
+.SH AUTHOR
+Adapted from Tom Rokicki's pxtopk by Angus Duggan <ajcd@uk.ac.ed.lfcs>.
diff --git a/graphics/pbmtopk/pbmtopk/pbmtopk.c b/graphics/pbmtopk/pbmtopk/pbmtopk.c
new file mode 100644
index 0000000000..45696e9684
--- /dev/null
+++ b/graphics/pbmtopk/pbmtopk/pbmtopk.c
@@ -0,0 +1,1050 @@
+/*
+ pbmtopk, adapted from "pxtopk.c by tomas rokicki" by AJCD 1/8/90
+
+ compile with: cc -o pbmtopk pbmtopk.c -lm -lpbm
+ */
+
+#include <stdio.h>
+#include <pbm.h>
+#include <ctype.h>
+
+extern double atof();
+
+#define MAXPKCHAR 256
+#define MAXOPTLINE 200
+#define MAXWIDTHTAB 256
+#define MAXHEIGHTTAB 16
+#define MAXDEPTHTAB 16
+#define MAXITALICTAB 64
+#define MAXPARAMS 30
+#define NAMELENGTH 80
+
+#define true (1)
+#define false (0)
+#define chr(a) a
+
+#define round(a) ((int)(a+.5))
+#define fixword(d) ((int)((double)(d)*1048576))
+#define unfixword(f) ((double)(f) / 1048576)
+#define fixrange(f) ((f) < 16777216 && (f) > -16777216)
+#define designunits(p) ((p)*72.27/(double)resolution/unfixword(designsize))
+
+/* character flags: in order of appearance in option files. */
+#define XOFFSET 1
+#define YOFFSET 2
+#define HORZESC 4
+#define VERTESC 8
+#define TFMWIDTH 16
+#define TFMHEIGHT 32
+#define TFMDEPTH 64
+#define TFMITALIC 128
+
+typedef int integer ;
+typedef char quarterword ;
+typedef char boolean ;
+typedef quarterword ASCIIcode ;
+typedef quarterword eightbits ;
+typedef FILE *bytefile ;
+typedef unsigned char byte ;
+
+integer resolution, designsize ;
+char *filename[MAXPKCHAR] ;
+
+integer xoffset[MAXPKCHAR] ;
+integer yoffset[MAXPKCHAR] ;
+integer horzesc[MAXPKCHAR] ;
+integer vertesc[MAXPKCHAR] ;
+
+byte tfmindex[MAXPKCHAR] ;
+byte hgtindex[MAXPKCHAR] ;
+byte depindex[MAXPKCHAR] ;
+byte italindex[MAXPKCHAR] ;
+byte charflags[MAXPKCHAR] ;
+
+bit **bitmap ;
+integer smallestch, largestch ;
+integer emwidth ;
+integer checksum ;
+char *codingscheme = "GRAPHIC" ;
+char *familyname = "PBM" ;
+
+integer widthtab[MAXWIDTHTAB] ; /* TFM widths */
+integer numwidth ; /* number of entries in width table */
+integer heighttab[MAXHEIGHTTAB] ;
+integer numheight ;
+integer depthtab[MAXDEPTHTAB] ;
+integer numdepth ;
+integer italictab[MAXITALICTAB] ;
+integer numitalic ;
+integer parameters[MAXPARAMS] ;
+integer numparam ;
+
+ASCIIcode xord[128] ;
+char xchr[256] ;
+bytefile tfmfile, pkfile ;
+char tfmname[NAMELENGTH+1], pkname[NAMELENGTH+1] ;
+integer pkloc ;
+integer bitweight ;
+integer outputbyte ;
+integer car ;
+integer hppp ;
+integer width ;
+integer height ;
+integer power[32] ;
+
+integer
+compute_checksum()
+{
+ /*
+ begin
+ c0:=bc; c1:=ec; c2:=bc; c3:=ec;
+ for c:=bc to ec do if char_wd[c]>0 then
+ begin
+ temp_width:=memory[char_wd[c]];
+ if design_units<>unity then
+ temp_width:=round((temp_width/design_units)*1048576.0);
+ temp_width:=temp_width + (c+4)*@'20000000; {this should be positive}
+ c0:=(c0+c0+temp_width) mod 255;
+ c1:=(c1+c1+temp_width) mod 253;
+ c2:=(c2+c2+temp_width) mod 251;
+ c3:=(c3+c3+temp_width) mod 247;
+ end;
+ header_bytes[check_sum_loc]:=c0;
+ header_bytes[check_sum_loc+1]:=c1;
+ header_bytes[check_sum_loc+2]:=c2;
+ header_bytes[check_sum_loc+3]:=c3;
+ end
+ */
+}
+
+#define add_tfmwidth(v) (add_tfmtable(widthtab, &numwidth, v, MAXWIDTHTAB,\
+ "TFM width"))
+#define add_tfmheight(v) (add_tfmtable(heighttab, &numheight, v, MAXHEIGHTTAB,\
+ "TFM height"))
+#define add_tfmdepth(v) (add_tfmtable(depthtab, &numdepth, v, MAXDEPTHTAB,\
+ "TFM depth"))
+#define add_tfmitalic(v) (add_tfmtable(italictab, &numitalic, v, MAXITALICTAB,\
+ "Italic correction"))
+byte
+add_tfmtable(table, count, value, maxv, name)
+ integer *table, *count, value, maxv;
+ char *name;
+{
+ integer i;
+ for (i = 0; i < *count; i++) /* search for value in tfm table */
+ if (table[i] == value) return (byte)i;
+ if (*count >= maxv) {
+ fprintf(stderr, "Too many values in %s table!\n", name) ;
+ jumpout();
+ }
+ if (!fixrange(value)) {
+ fprintf(stderr, " %s %f for char %d out of range!\n",
+ name, unfixword(value), car);
+ jumpout();
+ }
+ table[*count] = value ;
+ return (*count)++ ;
+}
+
+add_suffix(name, suffix)
+ char *name, *suffix ;
+{
+ int haveext = 0;
+ if (name && strcmp(name, "-")) {
+ while (*name) {
+ if (*name == '/') haveext = 0 ;
+ else if (*name == '.') haveext = 1 ;
+ name++ ;
+ }
+ if (!haveext) {
+ *name++ = '.';
+ strcpy(name,suffix) ;
+ }
+ }
+}
+
+initialize()
+{
+ integer i ;
+ fprintf(stderr, "This is PBMtoPK, C Version 2.3\n") ;
+ for (i = 0 ; i <= 31 ; i ++) xchr[i] = '?' ;
+ xchr[32] = ' ' ;
+ xchr[33] = '!' ;
+ xchr[34] = '"' ;
+ xchr[35] = '#' ;
+ xchr[36] = '$' ;
+ xchr[37] = '%' ;
+ xchr[38] = '&' ;
+ xchr[39] = '\'' ;
+ xchr[40] = '(' ;
+ xchr[41] = ')' ;
+ xchr[42] = '*' ;
+ xchr[43] = '+' ;
+ xchr[44] = ',' ;
+ xchr[45] = '-' ;
+ xchr[46] = '.' ;
+ xchr[47] = '/' ;
+ xchr[48] = '0' ;
+ xchr[49] = '1' ;
+ xchr[50] = '2' ;
+ xchr[51] = '3' ;
+ xchr[52] = '4' ;
+ xchr[53] = '5' ;
+ xchr[54] = '6' ;
+ xchr[55] = '7' ;
+ xchr[56] = '8' ;
+ xchr[57] = '9' ;
+ xchr[58] = ':' ;
+ xchr[59] = ';' ;
+ xchr[60] = '<' ;
+ xchr[61] = '=' ;
+ xchr[62] = '>' ;
+ xchr[63] = '?' ;
+ xchr[64] = '@' ;
+ xchr[65] = 'A' ;
+ xchr[66] = 'B' ;
+ xchr[67] = 'C' ;
+ xchr[68] = 'D' ;
+ xchr[69] = 'E' ;
+ xchr[70] = 'F' ;
+ xchr[71] = 'G' ;
+ xchr[72] = 'H' ;
+ xchr[73] = 'I' ;
+ xchr[74] = 'J' ;
+ xchr[75] = 'K' ;
+ xchr[76] = 'L' ;
+ xchr[77] = 'M' ;
+ xchr[78] = 'N' ;
+ xchr[79] = 'O' ;
+ xchr[80] = 'P' ;
+ xchr[81] = 'Q' ;
+ xchr[82] = 'R' ;
+ xchr[83] = 'S' ;
+ xchr[84] = 'T' ;
+ xchr[85] = 'U' ;
+ xchr[86] = 'V' ;
+ xchr[87] = 'W' ;
+ xchr[88] = 'X' ;
+ xchr[89] = 'Y' ;
+ xchr[90] = 'Z' ;
+ xchr[91] = '[' ;
+ xchr[92] = '\\' ;
+ xchr[93] = ']' ;
+ xchr[94] = '^' ;
+ xchr[95] = '_' ;
+ xchr[96] = '`' ;
+ xchr[97] = 'a' ;
+ xchr[98] = 'b' ;
+ xchr[99] = 'c' ;
+ xchr[100] = 'd' ;
+ xchr[101] = 'e' ;
+ xchr[102] = 'f' ;
+ xchr[103] = 'g' ;
+ xchr[104] = 'h' ;
+ xchr[105] = 'i' ;
+ xchr[106] = 'j' ;
+ xchr[107] = 'k' ;
+ xchr[108] = 'l' ;
+ xchr[109] = 'm' ;
+ xchr[110] = 'n' ;
+ xchr[111] = 'o' ;
+ xchr[112] = 'p' ;
+ xchr[113] = 'q' ;
+ xchr[114] = 'r' ;
+ xchr[115] = 's' ;
+ xchr[116] = 't' ;
+ xchr[117] = 'u' ;
+ xchr[118] = 'v' ;
+ xchr[119] = 'w' ;
+ xchr[120] = 'x' ;
+ xchr[121] = 'y' ;
+ xchr[122] = 'z' ;
+ xchr[123] = '{' ;
+ xchr[124] = '|' ;
+ xchr[125] = '}' ;
+ xchr[126] = '~' ;
+ for (i = 127 ; i <= 255 ; i ++) xchr[i] = '?' ;
+ for (i = 0 ; i <= 127 ; i ++) xord[chr(i)] = 32 ;
+ for (i = 32 ; i <= 126 ; i ++) xord[xchr[i]] = i ;
+ for (i = 0 ; i < 32 ; i++) power[i] = 1 << i ;
+ for (i = 0; i < MAXPKCHAR; i++) {
+ filename[i] = NULL;
+ charflags[i] = 0;
+ }
+ pkloc = 0 ;
+ designsize = fixword(1.0) ;
+ numparam = 0;
+ widthtab[0] = heighttab[0] = depthtab[0] = italictab[0] = 0 ;
+ numwidth = numheight = numdepth = numitalic = 1;
+ smallestch = MAXPKCHAR ;
+ largestch = -1 ;
+ emwidth = 0 ;
+}
+
+jumpout()
+{
+ exit(1) ;
+}
+
+pkbyte(b)
+ integer b ;
+{
+ if (b < 0) b = b + 256 ;
+ putc(b, pkfile) ;
+ pkloc++ ;
+}
+
+pkhalfword(a)
+ integer a ;
+{
+ if (a < 0) a = a + 65536 ;
+ pkbyte(a >> 8) ;
+ pkbyte(a & 255) ;
+}
+
+pkthreebytes(a)
+ integer a ;
+{
+ pkbyte((a>>16) & 255) ;
+ pkbyte((a>>8) & 255) ;
+ pkbyte(a & 255) ;
+}
+
+pkword(a)
+ integer a ;
+{
+ pkbyte((a>>24) & 255) ;
+ pkbyte((a>>16) & 255) ;
+ pkbyte((a>>8) & 255) ;
+ pkbyte(a & 255) ;
+}
+
+pknyb(a)
+ integer a ;
+{
+ if (bitweight == 16) {
+ outputbyte = (a<<4) ;
+ bitweight = 1 ;
+ } else {
+ pkbyte(outputbyte + a) ;
+ bitweight = 16 ;
+ }
+}
+
+writepreamble()
+{
+ integer i ;
+ char *comment = "PBMtoPK 2.3 output" ;
+
+ pkbyte(247) ;
+ pkbyte(89) ;
+ pkbyte(strlen(comment)) ;
+ for (i = 0 ; i < strlen(comment); i++) pkbyte(xord[comment[i]]) ;
+ pkword(designsize) ;
+ pkword(checksum) ; /* checksum; calculate if possible */
+ pkword(hppp) ;
+ pkword(hppp) ;
+}
+
+writepostamble()
+{
+ pkbyte(245) ;
+ while ((pkloc % 4 != 0)) pkbyte(246) ;
+ fprintf(stderr, "%d bytes written to packed file.\n", pkloc) ;
+}
+
+tfmbyte(b)
+ integer b ;
+{
+ if (b < 0) b = b + 256 ;
+ putc(b, tfmfile) ;
+}
+
+tfmhalfword(a)
+ integer a ;
+{
+ if (a < 0) a = a + 65536 ;
+ tfmbyte(a >> 8) ;
+ tfmbyte(a & 255) ;
+}
+
+tfmword(a)
+ integer a ;
+{
+ tfmbyte((a>>24) & 255) ;
+ tfmbyte((a>>16) & 255) ;
+ tfmbyte((a>>8) & 255) ;
+ tfmbyte(a & 255) ;
+}
+
+writetfmfile()
+{
+ integer totallength ;
+ integer headersize = 17;
+ integer i ;
+
+ if (largestch - smallestch < 0) {
+ largestch = 0;
+ smallestch = 1;
+ }
+ if (numparam < 7) /* set default parameters */
+ switch (numparam) {
+ case 0: /* slant */
+ parameters[numparam++] = 0 ;
+ case 1: /* space */
+ parameters[numparam++] = fixword(designunits(emwidth/3.0));
+ case 2: /* space_stretch */
+ parameters[numparam++] = fixword(unfixword(parameters[1])/2.0) ;
+ case 3: /* space_shrink */
+ parameters[numparam++] = fixword(unfixword(parameters[1])/3.0) ;
+ case 4: /* x_height */
+ parameters[numparam++] = fixword(0.45);
+ case 5: /* quad */
+ parameters[numparam++] = fixword(designunits(emwidth)) ;
+ case 6: /* extra_space */
+ parameters[numparam++] = fixword(unfixword(parameters[1])/3.0) ;
+ }
+ totallength = 6 + headersize + (largestch+1-smallestch) +
+ numwidth + numheight + numdepth + numitalic + numparam ;
+ /* lengths */
+ tfmhalfword(totallength) ;
+ tfmhalfword(headersize) ;
+ tfmhalfword(smallestch) ;
+ tfmhalfword(largestch) ;
+ tfmhalfword(numwidth) ;
+ tfmhalfword(numheight) ;
+ tfmhalfword(numdepth) ;
+ tfmhalfword(numitalic) ;
+ tfmhalfword(0) ; /* lig/kern table */
+ tfmhalfword(0) ; /* kern table */
+ tfmhalfword(0) ; /* extensible char table */
+ tfmhalfword(numparam) ;
+ /* header */
+ tfmword(checksum) ;
+ tfmword(designsize) ;
+ if (strlen(codingscheme) > 39) tfmbyte(39) ;
+ else tfmbyte(strlen(codingscheme)) ;
+ for (i = 0; i < 39; i++)
+ if (*codingscheme) tfmbyte(xord[*codingscheme++]) ;
+ else tfmbyte(0) ;
+ if (strlen(familyname) > 19) tfmbyte(19) ;
+ else tfmbyte(strlen(familyname)) ;
+ for (i = 0; i < 19; i++)
+ if (*familyname) tfmbyte(xord[*familyname++]) ;
+ else tfmbyte(0) ;
+ /* char_info */
+ for (car = smallestch; car <= largestch; car++)
+ if (filename[car]) {
+ tfmbyte(tfmindex[car]) ;
+ tfmbyte((hgtindex[car]<<4) + depindex[car]) ;
+ tfmbyte(italindex[car]<<2) ;
+ tfmbyte(0) ;
+ } else tfmword(0) ;
+ /* width */
+ for (i = 0; i < numwidth; i++) tfmword(widthtab[i]) ;
+ /* height */
+ for (i = 0; i < numheight; i++) tfmword(heighttab[i]) ;
+ /* depth */
+ for (i = 0; i < numdepth; i++) tfmword(depthtab[i]) ;
+ /* italic */
+ for (i = 0; i < numitalic; i++) tfmword(italictab[i]) ;
+ /* no lig_kern, kern, or exten */
+ /* param */
+ for (i = 0; i < numparam; i++)
+ if (i && (!fixrange(parameters[i]))) {
+ fprintf(stderr, " Parameter %d out of range (-p)!\n", i);
+ jumpout();
+ }
+ else tfmword(parameters[i]) ;
+ fprintf(stderr, "%d bytes written to tfm file.\n", totallength*4) ;
+}
+
+readcharacter()
+{
+ FILE *fp;
+
+ if (!strcmp(filename[car], "-")) fp = stdin;
+ else if ((fp = fopen(filename[car], "r")) == NULL) {
+ fprintf(stderr, " Can't open pbm file %s!\n", filename[car]);
+ jumpout();
+ }
+ bitmap = pbm_readpbm(fp, &width, &height) ;
+ if (fp != stdin) fclose(fp) ;
+
+ if ((charflags[car] & HORZESC) == 0) horzesc[car] = width ;
+ if ((charflags[car] & VERTESC) == 0) vertesc[car] = 0;
+ if ((charflags[car] & XOFFSET) == 0) xoffset[car] = 0;
+ if ((charflags[car] & YOFFSET) == 0) yoffset[car] = height-1;
+ if ((charflags[car] & TFMWIDTH) == 0)
+ tfmindex[car] = add_tfmwidth(fixword(designunits(width)));
+ if ((charflags[car] & TFMHEIGHT) == 0)
+ hgtindex[car] = add_tfmheight(fixword(designunits(yoffset[car]+1)));
+ if ((charflags[car] & TFMDEPTH) == 0)
+ depindex[car] = add_tfmdepth(fixword(designunits(height-1-yoffset[car])));
+ if ((charflags[car] & TFMITALIC) == 0) italindex[car] = 0;
+
+ if (car < smallestch) smallestch = car;
+ if (car > largestch) largestch = car;
+ if (width > emwidth) emwidth = width ;
+}
+
+int
+equal(row1, row2)
+ bit *row1, *row2 ;
+{
+ integer i ;
+
+ for (i = 0; i < width; i++)
+ if (row1[i] != row2[i]) return (0) ;
+ return(1) ;
+}
+
+shipcharacter()
+{
+ integer compsize ;
+ integer i, j, k ;
+ bit *zerorow, *onesrow ;
+ integer *repeatptr, *bitcounts ;
+ integer count ;
+ integer test ;
+ integer curptr, rowptr ;
+ integer bitval ;
+ integer repeatflag ;
+ integer colptr ;
+ integer currepeat ;
+ integer dynf ;
+ integer deriv[14] ;
+ integer bcompsize ;
+ boolean firston ;
+ integer flagbyte ;
+ boolean state ;
+ boolean on ;
+ integer hbit ;
+ integer pbit ;
+ boolean ron, son ;
+ integer rcount, scount ;
+ integer ri, si ;
+ integer max2 ;
+ integer predpkloc ;
+ integer buff ;
+
+ integer tfwid = widthtab[tfmindex[car]] ;
+ integer hesc = horzesc[car] ;
+ integer vesc = vertesc[car] ;
+ integer xoff = xoffset[car] ;
+ integer yoff = yoffset[car] ;
+
+ zerorow = pbm_allocrow(width) ;
+ onesrow = pbm_allocrow(width) ;
+ repeatptr =
+ (integer *)malloc((unsigned int)((height+1)*sizeof(integer))) ;
+ bitcounts =
+ (integer *)malloc((unsigned int)((height*width)*sizeof(integer))) ;
+ if (repeatptr == NULL || bitcounts == NULL) {
+ fprintf(stderr, " Out of memory while allocating bit counts!\n");
+ jumpout() ;
+ }
+ for (i = 0 ; i < width ; i++) {
+ zerorow[i] = PBM_WHITE ;
+ onesrow[i] = PBM_BLACK ;
+ }
+ for (i=0; i < height; i++) {
+ if (equal(bitmap[i], zerorow))
+ repeatptr[i] = 0 ;
+ else if (equal(bitmap[i], onesrow))
+ repeatptr[i] = 0 ;
+ else if (i + 1 < height && equal(bitmap[i],bitmap[i+1]))
+ repeatptr[i] = 1 ;
+ else
+ repeatptr[i] = 0 ;
+ }
+ i = 0 ;
+ while (i < height) {
+ k = i ;
+ while (repeatptr[k] == 1) k++ ;
+ repeatptr[i] = k - i ;
+ i = k + 1 ;
+ }
+ repeatptr[i] = 0 ;
+ colptr = width - 1 ;
+ repeatflag = currepeat = curptr = count = rowptr = 0 ;
+ test = PBM_WHITE ;
+ do {
+ colptr++ ;
+ if (colptr == width) {
+ colptr = 0 ;
+ rowptr = currepeat ;
+ if (repeatptr[currepeat] > 0) {
+ repeatflag = repeatptr[currepeat] ;
+ currepeat += repeatflag ;
+ rowptr += repeatflag ;
+ }
+ currepeat++ ;
+ }
+ if (rowptr >= height) bitval = -1 ;
+ else bitval = bitmap[rowptr][colptr] ;
+ if (bitval == test) count++ ;
+ else {
+ bitcounts[curptr++] = count ;
+ if (curptr+3 >= height*width) {
+ fprintf(stderr, " Out of memory while saving character counts!\n");
+ jumpout() ;
+ }
+ count = 1 ;
+ test = bitval ;
+ if (repeatflag > 0) {
+ bitcounts[curptr++] = -repeatflag ;
+ repeatflag = 0 ;
+ }
+ }
+ } while (test != -1) ;
+ bitcounts[curptr] = 0 ;
+ bitcounts[curptr + 1] = 0 ;
+ for (i = 1 ; i <= 13 ; i ++) deriv[i] = 0 ;
+ i = firston = (bitcounts[0] == 0) ;
+ compsize = 0 ;
+ while (bitcounts[i] != 0) {
+ j = bitcounts[i] ;
+ if (j == -1) compsize++ ;
+ else {
+ if (j < 0) {
+ compsize++ ;
+ j = -j ;
+ }
+ if (j < 209) compsize += 2 ;
+ else {
+ k = j - 193 ;
+ while (k >= 16) {
+ k >>= 4 ;
+ compsize += 2 ;
+ }
+ compsize++ ;
+ }
+ if (j < 14) (deriv[j])-- ;
+ else if (j < 209) (deriv[(223 - j) / 15])++ ;
+ else {
+ k = 16 ;
+ while (((k<<4) < j + 3)) k <<= 4 ;
+ if (j - k <= 192)
+ deriv[(207 - j + k) / 15] += 2 ;
+ }
+ }
+ i++ ;
+ }
+ bcompsize = compsize ;
+ dynf = 0 ;
+ for (i = 1 ; i <= 13 ; i ++) {
+ compsize += deriv[i] ;
+ if (compsize <= bcompsize) {
+ bcompsize = compsize ;
+ dynf = i ;
+ }
+ }
+ compsize = ((bcompsize + 1)>>1) ;
+ if ((compsize > ((height*width+7)>>3)) || (height*width == 0)) {
+ compsize = ((height*width+7)>>3) ;
+ dynf = 14 ;
+ }
+ flagbyte = (dynf<<4) ;
+ if (firston) flagbyte |= 8 ;
+ if ((tfwid > 16777215) || (tfwid < 0) || (hesc < 0) || (vesc != 0) ||
+ (compsize > 196579) || (width > 65535) || (height > 65535) ||
+ (xoff > 32767) || (yoff > 32767) || (xoff < -32768) || (yoff < -32768)) {
+ flagbyte |= 7 ;
+ pkbyte(flagbyte) ;
+ compsize += 28 ;
+ pkword(compsize) ;
+ pkword(car) ;
+ predpkloc = pkloc + compsize ;
+ pkword(tfwid) ;
+ pkword(hesc<<16) ;
+ pkword(vesc<<16) ;
+ pkword(width) ;
+ pkword(height) ;
+ pkword(xoff) ;
+ pkword(yoff) ;
+ } else if ((hesc > 255) || (width > 255) || (height > 255) ||
+ (xoff > 127) || (yoff > 127) || (xoff < -128) ||
+ (yoff < -128) || (compsize > 1016)) {
+ compsize += 13 ;
+ flagbyte += (compsize>>16) + 4 ;
+ pkbyte(flagbyte) ;
+ pkhalfword(compsize & 65535) ;
+ pkbyte(car) ;
+ predpkloc = pkloc + compsize ;
+ pkthreebytes(tfwid) ;
+ pkhalfword(hesc) ;
+ pkhalfword(width) ;
+ pkhalfword(height) ;
+ pkhalfword(xoff) ;
+ pkhalfword(yoff) ;
+ } else {
+ compsize += 8 ;
+ flagbyte = flagbyte + (compsize>>8) ;
+ pkbyte(flagbyte) ;
+ pkbyte(compsize & 255) ;
+ pkbyte(car) ;
+ predpkloc = pkloc + compsize ;
+ pkthreebytes(tfwid) ;
+ pkbyte(hesc) ;
+ pkbyte(width) ;
+ pkbyte(height) ;
+ pkbyte(xoff) ;
+ pkbyte(yoff) ;
+ }
+ if (dynf != 14) {
+ bitweight = 16 ;
+ max2 = 208 - 15 * dynf ;
+ i = firston ;
+ while (bitcounts[i] != 0) {
+ j = bitcounts[i] ;
+ if (j == - 1) pknyb(15) ;
+ else {
+ if (j < 0) {
+ pknyb(14) ;
+ j = -j ;
+ }
+ if (j <= dynf) pknyb(j) ;
+ else if (j <= max2) {
+ j -= dynf + 1 ;
+ pknyb((j >> 4) + dynf + 1) ;
+ pknyb((j & 15)) ;
+ } else {
+ j -= max2 - 15 ;
+ k = 16 ;
+ while (k <= j) {
+ k <<= 4 ;
+ pknyb(0) ;
+ }
+ while (k > 1) {
+ k >>= 4 ;
+ pknyb(j / k) ;
+ j = j % k ;
+ }
+ }
+ }
+ i++ ;
+ }
+ if (bitweight != 16) pkbyte(outputbyte) ;
+ } else {
+ buff = 0 ;
+ pbit = 8 ;
+ i = firston ;
+ hbit = width ;
+ on = ! firston ;
+ state = false ;
+ count = repeatflag = 0 ;
+ while ((bitcounts[i] != 0) || state || (count > 0)) {
+ if (state) {
+ count = rcount ;
+ i = ri ;
+ on = ron ;
+ repeatflag-- ;
+ } else {
+ rcount = count ;
+ ri = i ;
+ ron = on ;
+ }
+ do {
+ if (count == 0) {
+ if (bitcounts[i] < 0) {
+ if (! state) repeatflag = -bitcounts[i] ;
+ i++ ;
+ }
+ count = bitcounts[i] ;
+ i++ ;
+ on = !on ;
+ }
+ if ((count >= pbit) && (pbit < hbit)) {
+ if (on) buff += power[pbit] - 1 ;
+ pkbyte(buff) ;
+ buff = 0 ;
+ hbit -= pbit ;
+ count -= pbit ;
+ pbit = 8 ;
+ } else if ((count < pbit) && (count < hbit)) {
+ if (on) buff += power[pbit] - power[pbit - count] ;
+ pbit -= count ;
+ hbit -= count ;
+ count = 0 ;
+ } else {
+ if (on) buff += power[pbit] - power[pbit - hbit] ;
+ count -= hbit ;
+ pbit -= hbit ;
+ hbit = width ;
+ if (pbit == 0) {
+ pkbyte(buff) ;
+ buff = 0 ;
+ pbit = 8 ;
+ }
+ }
+ } while (hbit != width) ;
+ if (state && (repeatflag == 0)) {
+ count = scount ;
+ i = si ;
+ on = son ;
+ state = false ;
+ } else if (! state && (repeatflag > 0)) {
+ scount = count ;
+ si = i ;
+ son = on ;
+ state = true ;
+ }
+ }
+ if (pbit != 8) pkbyte(buff) ;
+ }
+ if (predpkloc != pkloc) {
+ fprintf(stderr, " Bad predicted character length: character %d!\n", car);
+ jumpout() ;
+ }
+ pbm_freerow(zerorow);
+ pbm_freerow(onesrow);
+ free((char *)repeatptr);
+ free((char *)bitcounts);
+}
+
+usage()
+{
+ fprintf(stderr, " Usage: pbmtopk pkfile[.pk] tfmfile[.tfm] dpi\n") ;
+ fprintf(stderr, " [-s designsize] [-p num param...]\n");
+ fprintf(stderr, " [-C codingscheme ] [-F family]\n");
+ fprintf(stderr, " [-c num | <char>]...\n");
+ fprintf(stderr, " <char> is: [-W tfmwidth] [-H tfmheight] [-D tfmdepth]\n");
+ fprintf(stderr, " [-I ital_corr] [-h horiz] [-v vert]\n") ;
+ fprintf(stderr, " [-x xoffset] [-y yoffset] file\n") ;
+ fprintf(stderr, " or: -f optfile\n") ;
+ jumpout() ;
+}
+
+checkchar()
+{
+ if (car < 0 || car >= MAXPKCHAR) {
+ fprintf(stderr, " Character must be in range 0 to %d (-c)!\n",
+ MAXPKCHAR-1) ;
+ jumpout() ;
+ }
+}
+
+optionfile(name)
+ char *name ;
+{
+ FILE *fp ;
+ char buffer[MAXOPTLINE] ;
+
+ if (!strcmp(name, "-")) fp = stdin ;
+ else if ((fp = fopen(name, "r")) == NULL) {
+ fprintf(stderr, " Can't open option file %s!\n", name) ;
+ jumpout() ;
+ }
+ while (!feof(fp)) {
+ char *here = buffer;
+
+ if (fgets(buffer, MAXOPTLINE, fp) == NULL) break ;
+ while (isspace(*here)) here++ ;
+ if (*here && *here == '=') {
+ if (sscanf(here+1, "%d", &car) != 1) {
+ fprintf(stderr, "Bad option file line %s!\n", buffer) ;
+ jumpout() ;
+ }
+ } else if (*here && *here != '%' && *here != '#') {
+ char str[NAMELENGTH] ;
+ integer i, n;
+
+ checkchar() ;
+ if (sscanf(here, "%s%n", str, &n) != 1) {
+ fprintf(stderr, "Bad option file line %s!\n", buffer) ;
+ jumpout() ;
+ }
+ filename[car] =
+ (char *)malloc((unsigned int)(sizeof(char)*(strlen(str)+1))) ;
+ strcpy(filename[car], str) ;
+ for (i = 1; i < 256; i<<=1) {
+ here += n;
+ if (sscanf(here, "%s%n", str, &n) != 1) break ;
+ if (strcmp(str, "*")) {
+ charflags[car] |= i ;
+ switch (i) {
+ case XOFFSET:
+ xoffset[car] = atoi(str) ;
+ break ;
+ case YOFFSET:
+ yoffset[car] = atoi(str) ;
+ break ;
+ case HORZESC:
+ horzesc[car] = atoi(str) ;
+ break ;
+ case VERTESC:
+ vertesc[car] = atoi(str) ;
+ break ;
+ case TFMWIDTH:
+ tfmindex[car] = add_tfmwidth(fixword(atof(str))) ;
+ break ;
+ case TFMHEIGHT:
+ hgtindex[car] = add_tfmheight(fixword(atof(str))) ;
+ break ;
+ case TFMDEPTH:
+ depindex[car] = add_tfmdepth(fixword(atof(str))) ;
+ break ;
+ case TFMITALIC:
+ italindex[car] = add_tfmitalic(fixword(atof(str))) ;
+ break ;
+ }
+ }
+ }
+ car++ ;
+ }
+ }
+ if (fp != stdin) fclose(fp) ;
+}
+
+dialog(gargc, gargv)
+ int gargc ;
+ char **gargv ;
+{
+ integer i, hesc, vesc, xoff, yoff, tfwid, tfdep, tfhgt, tfital ;
+ byte flags ;
+
+ if (--gargc < 1) usage() ;
+ strcpy(pkname, *++gargv) ;
+ add_suffix(pkname, "pk") ;
+
+ if (--gargc < 1) usage() ;
+ strcpy(tfmname, *++gargv) ;
+ add_suffix(tfmname, "tfm") ;
+
+ if (--gargc < 1) usage() ;
+ resolution = atoi(*++gargv) ;
+ if (resolution < 1 || resolution > 32767) {
+ fprintf(stderr, " Unlikely resolution %d dpi!\n", resolution);
+ jumpout();
+ }
+
+ car = flags = hesc = vesc = xoff = yoff = tfwid = 0;
+ while (++gargv, --gargc) {
+ if (gargv[0][0] == '-' && gargv[0][1]) {
+ char c, *p;
+ c = gargv[0][1] ;
+ if (gargv[0][2]) p = *gargv + 2 ;
+ else if (++gargv, --gargc) p = *gargv ;
+ else usage() ;
+ switch (c) {
+ case 'C':
+ codingscheme = p;
+ break ;
+ case 'F':
+ familyname = p;
+ break ;
+ case 'c':
+ car = atoi(p) ;
+ break ;
+ case 's':
+ designsize = fixword(atof(p));
+ if (designsize < 1048576) {
+ fprintf(stderr, " Design size %f out of range!\n",
+ unfixword(designsize));
+ jumpout() ;
+ }
+ case 'h':
+ hesc = atoi(p) ;
+ flags |= HORZESC ;
+ break ;
+ case 'v':
+ vesc = atoi(p) ;
+ flags |= VERTESC ;
+ break ;
+ case 'x':
+ xoff = atoi(p) ;
+ flags |= XOFFSET ;
+ break ;
+ case 'y':
+ yoff = atoi(p) ;
+ flags |= YOFFSET ;
+ break ;
+ case 'W':
+ tfwid = fixword(atof(p)) ;
+ flags |= TFMWIDTH ;
+ break ;
+ case 'H':
+ tfhgt = fixword(atof(p)) ;
+ flags |= TFMHEIGHT ;
+ break ;
+ case 'D':
+ tfdep = fixword(atof(p)) ;
+ flags |= TFMDEPTH ;
+ break ;
+ case 'I':
+ tfital = fixword(atof(p)) ;
+ flags |= TFMITALIC ;
+ break ;
+ case 'f':
+ optionfile(p) ;
+ break ;
+ case 'p':
+ numparam = atoi(p);
+ if (numparam < 1 || numparam > 30) {
+ fprintf(stderr, " Parameter count %d out of range!\n", numparam);
+ jumpout();
+ }
+ for (i=0; i<numparam; i++)
+ if (++gargv,--gargc) parameters[i] = fixword(atof(*gargv)) ;
+ else {
+ fprintf(stderr, " Not enough parameters (-p)!\n");
+ jumpout() ;
+ }
+ break ;
+ default:
+ usage() ;
+ }
+ } else {
+ checkchar() ;
+ if (flags & TFMWIDTH)
+ tfmindex[car] = add_tfmwidth(tfwid);
+ if (flags & TFMDEPTH)
+ depindex[car] = add_tfmdepth(tfdep);
+ if (flags & TFMHEIGHT)
+ hgtindex[car] = add_tfmheight(tfhgt);
+ if (flags & TFMITALIC)
+ italindex[car] = add_tfmitalic(tfital);
+ horzesc[car] = hesc ;
+ vertesc[car] = vesc ;
+ xoffset[car] = xoff ;
+ yoffset[car] = yoff ;
+ filename[car] = *gargv ;
+ charflags[car] = flags ;
+ car++ ;
+ flags = 0;
+ }
+ }
+}
+
+main(argc, argv)
+ int argc ;
+ char *argv[] ;
+{
+ initialize() ;
+ dialog(argc, argv) ;
+ hppp = round((resolution<<16) / 72.27) ;
+ add_suffix(pkname, "pk") ;
+ add_suffix(tfmname, "tfm") ;
+ if (!strcmp(pkname, "-")) pkfile = stdout;
+ else if ((pkfile = fopen(pkname, "w")) == NULL) {
+ fprintf(stderr, " Can't open PK file %s!\n", pkname);
+ jumpout() ;
+ }
+ if (!strcmp(tfmname, "-")) tfmfile = stdout ;
+ else if ((tfmfile = fopen(tfmname, "w")) == NULL) {
+ fprintf(stderr, " Can't open TFM file %s!\n", tfmname);
+ jumpout();
+ }
+ writepreamble() ;
+ for (car = 0 ; car < MAXPKCHAR ; car++)
+ if (filename[car]) {
+ readcharacter() ;
+ shipcharacter() ;
+ }
+ writepostamble() ;
+ writetfmfile() ;
+ if (pkfile != stdout) fclose(pkfile) ;
+ if (tfmfile != stdout) fclose(tfmfile) ;
+ exit(0);
+}
diff --git a/graphics/pbmtopk/pbmtopk/pktopbm.1 b/graphics/pbmtopk/pbmtopk/pktopbm.1
new file mode 100644
index 0000000000..ff0329d55f
--- /dev/null
+++ b/graphics/pbmtopk/pbmtopk/pktopbm.1
@@ -0,0 +1,17 @@
+.TH pktopbm 1 "6 August 1990"
+.SH NAME
+pktopbm - convert packed (PK) format font into portable bitmap(s)
+.SH SYNOPSIS
+pktopbm pkfile[.pk] [-c num] pbmfile ...
+.SH DESCRIPTION
+Reads a packed (PK) font file as input, and produces portable bitmaps as
+output. If the filename "-" is used for any
+of the filenames, the standard input stream (or standard output where
+appropriate) will be used.
+.SH OPTIONS
+.IP "-c num"
+Sets the character number of the next bitmap written to num.
+.SH "SEE ALSO"
+pbmtopk(1), pbm(5)
+.SH AUTHOR
+Adapted from Tom Rokicki's pxtopk by Angus Duggan <ajcd@uk.ac.ed.lfcs>.
diff --git a/graphics/pbmtopk/pbmtopk/pktopbm.c b/graphics/pbmtopk/pbmtopk/pktopbm.c
new file mode 100644
index 0000000000..d511a768c2
--- /dev/null
+++ b/graphics/pbmtopk/pbmtopk/pktopbm.c
@@ -0,0 +1,381 @@
+/*
+ pktopbm, adapted from "pktopx in C by Tomas Rokicki" by AJCD 1/8/90
+
+ compile with: cc -lpbm -o pktopbm pktopbm.c
+ */
+
+#include <stdio.h>
+#include <pbm.h>
+
+#define NAMELENGTH 80
+#define MAXROWWIDTH 3200
+#define MAXPKCHAR 256
+
+#define round(a) ((int)(a+0.5))
+
+typedef int integer ;
+typedef unsigned char quarterword ;
+typedef char boolean ;
+typedef quarterword eightbits ;
+typedef FILE *bytefile ;
+
+bytefile pkfile ;
+char pkname[NAMELENGTH+1] ;
+integer pkloc ;
+integer i, j ;
+char *filename[MAXPKCHAR] ;
+bit **bitmap = NULL ;
+integer dynf ;
+eightbits inputbyte ;
+eightbits bitweight ;
+integer repeatcount ;
+integer flagbyte ;
+
+add_suffix(name, suffix)
+ char *name, *suffix ;
+{
+ int haveext = 0;
+ if (name) {
+ while (*name) {
+ if (*name == '/') haveext = 0 ;
+ else if (*name == '.') haveext = 1 ;
+ name++ ;
+ }
+ if (!haveext) {
+ *name++ = '.';
+ strcpy(name,suffix) ;
+ }
+ }
+}
+
+initialize()
+{
+ integer i ;
+
+ fprintf(stderr, "This is PKtoPBM, C Version 2.3\n") ;
+ for (i = 0 ; i < MAXPKCHAR ; i ++) filename[i] = NULL ;
+}
+
+jumpout()
+{
+ exit(1) ;
+}
+
+openpkfile()
+{
+ if ((pkfile = fopen(pkname, "r")) == NULL) {
+ fprintf(stderr, " Can't open pk file %s!\n", pkname) ;
+ }
+ pkloc = 0 ;
+}
+
+eightbits pkbyte()
+{
+ pkloc++ ;
+ return(getc(pkfile)) ;
+}
+
+integer get16()
+{
+ integer a = pkbyte() ;
+ return((a<<8) + pkbyte()) ;
+}
+
+integer get32()
+{
+ integer a = get16() ;
+ if (a > 32767) a -= 65536 ;
+ return((a<<16) + get16()) ;
+}
+
+integer getnyb()
+{
+ eightbits temp ;
+ if (bitweight == 0) {
+ inputbyte = pkbyte() ;
+ bitweight = 16 ;
+ }
+ temp = inputbyte / bitweight ;
+ inputbyte -= temp * bitweight ;
+ bitweight >>= 4 ;
+ return(temp) ;
+}
+
+boolean getbit()
+{
+ boolean temp ;
+ bitweight >>= 1 ;
+ if (bitweight == 0) {
+ inputbyte = pkbyte() ;
+ bitweight = 128 ;
+ }
+ temp = (inputbyte >= bitweight) ;
+ if (temp) inputbyte -= bitweight ;
+ return(temp) ;
+}
+
+integer pkpackednum()
+{
+ integer i, j ;
+ i = getnyb() ;
+ if (i == 0) {
+ do {
+ j = getnyb() ;
+ i++ ;
+ } while (!(j != 0)) ;
+ while (i > 0) {
+ j = (j<<4) + getnyb() ;
+ i-- ;
+ }
+ return(j - 15 +((13 - dynf)<<4) + dynf) ;
+ } else if (i <= dynf) return(i) ;
+ else if (i < 14) return(((i - dynf - 1)<<4) + getnyb() + dynf + 1) ;
+ else {
+ if (i == 14) repeatcount = pkpackednum() ;
+ else repeatcount = 1 ;
+ return(pkpackednum()) ;
+ }
+}
+
+skipspecials()
+{
+ integer i, j, k ;
+ do {
+ flagbyte = pkbyte() ;
+ if (flagbyte >= 240)
+ switch(flagbyte) {
+ case 240:
+ case 241:
+ case 242:
+ case 243:
+ i = 0 ;
+ for (j = 240 ; j <= flagbyte ; j ++) i = (i<<8) + pkbyte() ;
+ for (j = 1 ; j <= i ; j ++) k = pkbyte() ;
+ break ;
+ case 244:
+ i = get32() ;
+ break ;
+ case 245:
+ break ;
+ case 246:
+ break ;
+ case 247:
+ case 248:
+ case 249:
+ case 250:
+ case 251:
+ case 252:
+ case 253:
+ case 254:
+ case 255:
+ fprintf(stderr, " Unexpected flag byte %d!\n", flagbyte) ;
+ jumpout() ;
+ }
+ } while (!((flagbyte < 240) || (flagbyte == 245))) ;
+}
+
+usage()
+{
+ fprintf(stderr, " Usage: pktopbm pkfile[.pk] [[-c num] pbmfile]...\n");
+ jumpout() ;
+}
+
+dialog(gargc, gargv)
+ int gargc ;
+ char **gargv ;
+{
+ integer car ;
+
+ if (--gargc < 1) usage() ;
+ strcpy(pkname, *++gargv) ;
+ add_suffix(pkname, "pk") ;
+ car = 0 ;
+ while (++gargv, --gargc) {
+ if (gargv[0][0] == '-' && gargv[0][1])
+ switch (gargv[0][1]) {
+ case 'c':
+ if (gargv[0][2]) car = atoi(*gargv+2) ;
+ else if (++gargv, --gargc) car = atoi(*gargv) ;
+ else usage() ;
+ break ;
+ default:
+ usage() ;
+ } else if (car < 0 || car >= MAXPKCHAR) {
+ fprintf(stderr, " Character must be in range 0 to %d (-c)!\n",
+ MAXPKCHAR-1) ;
+ jumpout() ;
+ } else filename[car++] = *gargv ;
+ }
+}
+
+main(argc, argv)
+ int argc ;
+ char *argv[] ;
+{
+ integer endofpacket ;
+ integer designsize ;
+ integer checksum ;
+ integer hppp, vppp ;
+ integer cheight, cwidth ;
+ integer horesc ;
+ integer packetlength ;
+ integer rowsleft ;
+ boolean turnon ;
+ integer hbit ;
+ integer count ;
+ integer rp ;
+ integer i, j, k ;
+ integer car ;
+ bit row[MAXROWWIDTH+1] ;
+
+ initialize() ;
+ dialog(argc, argv) ;
+ openpkfile() ;
+ if (pkbyte() != 247) {
+ fprintf(stderr, " Bad pk file (pre command missing)!\n") ;
+ jumpout() ;
+ }
+ if (pkbyte() != 89) {
+ fprintf(stderr, " Wrong version of packed file!\n") ;
+ jumpout() ;
+ }
+ j = pkbyte() ;
+ for (i = 1 ; i <= j ; i ++) k = pkbyte() ;
+ designsize = get32() ;
+ checksum = get32() ;
+ hppp = get32() ;
+ vppp = get32() ;
+ if (hppp != vppp) fprintf(stderr, " Warning: aspect ratio not 1:1!\n") ;
+ skipspecials() ;
+ while (flagbyte != 245) {
+ dynf = (flagbyte>>4) ;
+ flagbyte &= 15 ;
+ turnon = (flagbyte >= 8) ;
+ if (turnon) flagbyte &= 7 ;
+ if (flagbyte == 7) {
+ packetlength = get32() ;
+ car = get32() ;
+ endofpacket = packetlength + pkloc ;
+ if ((car >= MAXPKCHAR) || (car < 0)) goto lab9997 ;
+ i = get32() ; /* tfmwidth */
+ horesc = get32() ;
+ i = get32() ;
+ cwidth = get32() ;
+ cheight = get32() ;
+ if ((cwidth < 0) || (cheight < 0) || (cwidth > 65535) || (cheight > 65535)) goto lab9997 ;
+ i = get32() ;
+ j = get32() ;
+ } else if (flagbyte > 3) {
+ packetlength =((flagbyte - 4)<<16) + get16() ;
+ car = pkbyte() ;
+ endofpacket = packetlength + pkloc ;
+ if (car >= MAXPKCHAR) goto lab9997 ;
+ i = pkbyte() ; /* tfmwidth */
+ i = get16() ;
+ horesc = get16() ;
+ cwidth = get16() ;
+ cheight = get16() ;
+ i = get16() ;
+ j = get16() ;
+ } else {
+ packetlength = (flagbyte<<8) + pkbyte() ;
+ car = pkbyte() ;
+ endofpacket = packetlength + pkloc ;
+ if (car >= MAXPKCHAR) goto lab9997 ;
+ i = pkbyte() ; /* tfmwidth */
+ i = get16() ;
+ horesc = pkbyte() ;
+ cwidth = pkbyte() ;
+ cheight = pkbyte() ;
+ i = pkbyte() ;
+ j = pkbyte() ;
+ }
+ if (filename[car]) {
+ bitmap = pbm_allocarray(cwidth, cheight) ;
+ if (bitmap == NULL) {
+ fprintf(stderr, " Out of memory allocating bitmap!\n") ;
+ jumpout() ;
+ }
+ } else goto lab9997 ;
+ bitweight = 0 ;
+ if (dynf == 14) {
+ for (i = 0 ; i < cheight ; i ++)
+ for (j = 0 ; j < cwidth ; j ++) {
+ if (getbit())
+ bitmap[i][j] = PBM_BLACK ;
+ else
+ bitmap[i][j] = PBM_WHITE ;
+ }
+ } else {
+ rowsleft = cheight ;
+ hbit = cwidth ;
+ repeatcount = rp =0 ;
+ while (rowsleft > 0) {
+ count = pkpackednum() ;
+ while (count > 0) {
+ if (count < hbit) {
+ hbit -= count ;
+ while (count--) {
+ if (turnon)
+ row[rp++] = PBM_BLACK ;
+ else
+ row[rp++] = PBM_WHITE ;
+ }
+ } else {
+ count -= hbit ;
+ while (hbit--) {
+ if (turnon)
+ row[rp++] = PBM_BLACK ;
+ else
+ row[rp++] = PBM_WHITE ;
+ }
+ for (i = 0; i <= repeatcount; i++)
+ for (j = 0; j < cwidth; j++)
+ bitmap[i + cheight-rowsleft][j] = row[j] ;
+ rowsleft -= repeatcount + 1;
+ repeatcount = rp = 0 ;
+ hbit = cwidth ;
+ }
+ }
+ turnon = ! turnon ;
+ }
+ if ((rowsleft != 0) || (hbit != cwidth)) {
+ fprintf(stderr, " Bad pk file (more bits than required)!\n") ;
+ jumpout() ;
+ }
+ }
+ if (endofpacket != pkloc) {
+ fprintf(stderr, " Bad pk file (bad packet length)!\n") ;
+ jumpout() ;
+ }
+ /* output bitmap to file */
+ {
+ FILE *fp ;
+ if (!strcmp(filename[car], "-"))
+ fp = stdout ;
+ else {
+ if ((fp = fopen(filename[car], "w")) == NULL) {
+ fprintf(stderr, " Can't open file %s!\n", filename[car]) ;
+ jumpout() ;
+ }
+ }
+ filename[car] = NULL;
+ pbm_writepbm(fp, bitmap, cwidth, cheight, 0) ;
+ pbm_freearray(bitmap, cheight) ;
+ if (fp != stdout) (void)fclose(fp) ;
+ }
+ goto lab9998 ;
+ lab9997: while (pkloc != endofpacket) i = pkbyte() ;
+ if (car < 0 || car >= MAXPKCHAR)
+ fprintf(stderr, " Character %d out of range!\n", car) ;
+ lab9998: skipspecials() ;
+ }
+ while (! feof(pkfile)) i = pkbyte() ;
+ pkloc-- ;
+ for (car = 0; car < MAXPKCHAR; car++)
+ if (filename[car])
+ fprintf(stderr, " Warning: No character in position %d (file %s).\n",
+ car, filename[car]) ;
+ fprintf(stderr, "%d bytes read from packed file.\n", pkloc) ;
+ exit(0);
+}
diff --git a/graphics/pbmtopk/pbmtopk/sign.pbm b/graphics/pbmtopk/pbmtopk/sign.pbm
new file mode 100644
index 0000000000..3a8717968c
--- /dev/null
+++ b/graphics/pbmtopk/pbmtopk/sign.pbm
@@ -0,0 +1,302 @@
+P1
+150 100
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000001111110000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000111111111000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000011110000011100000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000001111000000000110000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000011100000000000011000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000011000000000000001100000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000110000000000000001100000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000001100000000000000000110000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000011000000000000000000110000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000011000000000000000000110000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000110000000000000000000011000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000110000000000000000000011000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000001100000000000000000000011000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000001100000000000000000000001100000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000011000000000000000000000001100000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000011000000000000000000000001100000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000110000000000000000000000001100000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000110000000000000000000000001100000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000001100000000000000000000000011000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000001100000000000000000000000011000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000001100000000000000000000000011000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000011000000000000000000000000011000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000011000000000000000000000000011000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000011000000000000000000000000011000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000110000000000000000000000000011000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000110000000000000000000000000011000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000001100000000000000000000000000110000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000001100000000000000000000000000110000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000001100000000000000000000000000110000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000011000000000000000000000000000110011000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000011000000000000000000000000000110011000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000011000000000000000000000000001100110000011000000111111100000000
+0000000111100000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000011000000000000000000000000001100110000011000011111111110000000
+0000011111111000000000000000000000000000000000000000011110000000000000
+0000000000
+0000000011000000000000000000000000001101110000011000111100000111000000
+0001110000011100000000000000000011000000000000000001111111000000000000
+0000000000
+0000000110000000000000000000000000011001100000111001110000000011100000
+0011100000001100000000000000000111100000000000000001100001000000000000
+0000000000
+0000000110000000000000000000000000011011100001101011000000000001110000
+0011000000000110000100000000001101100000000000000011000011000000000000
+0000000000
+0000000110000000000000000000000000011111100001101011000000000000110000
+0110000000000110000100000000001101100000000000000011000110000000000000
+0000000000
+0000000110000000000000000000000000000111000011001110000000000000110000
+0100000000000010001100000000011001100000000000000011111100000000000000
+0000000000
+0000000110000000000000000000000000001111000011001100000000000000110000
+1100000000000011001100000000011001100000000000000000111111000000000000
+0000000000
+0000000110000000000000000000000000001111000010001100000000000000110000
+1000000000000011001100000000111011000000000000000001110011110000000000
+0000000000
+0000000110000000000000000000000000011110000110011100000000000000110001
+1000000000000011001100000000110011000000000000000001100000111000000000
+0000000000
+0000000110000000000000000000000000110110000110011000000000000001100001
+1000000000000011011100000000110011000000000000000011000000001110000000
+0000000000
+0000000110000000000000000000000001101100000100011000000000000001100001
+1000000000000011011100000000110110000000000000000110000000000111000000
+0000000000
+0000000110000000000000000000000001101100001100111000000000000001100001
+1000000000000001011100000000111110000000000000001100000000000011000000
+0000000000
+0000000110000000000000000000000011001100001000111000000000000001100001
+1000000000000000111100000000111100000000000000011000000000000001100000
+0000000000
+0000000110000000000000000000000011001000011000110000000000000011000001
+1000000000000000111100000000111000000000000000110000000000000001100000
+0000000000
+0000000110000000000000000000000110011000011000110000000000000011000001
+1000000000000000101100000000110000000000000001100000000000000000110000
+0000000000
+0000000110000000000000000000001100011000011000110000000000000011000001
+1000000000000000101100000001110000000000000111000000000000000000110000
+0000000000
+0000000111000000000000000000011100111000110001110000000000000011000001
+1000000000000001001100000001111000000000011110001000000000000000110000
+0000000000
+0000000011000000000000000000111000111000100001100000000000000011000001
+1000000000000011001100000011011000000001111000001100000000000000110000
+0000000000
+0000000011000000000000000001110000011011000001100000000000000011000001
+1100000000000010001100000110011100001111100000000110000000000000110000
+0000000000
+0000000001100000000000000111100000011111000001100000000000000011000100
+1100000000000110001100001100001111111110000000000111000000000001100000
+0000000000
+0000000001110000000000001110000000001100000011100000000000000001001100
+0111000000001100001100011000000111110000000000000011100000000011100000
+0000000000
+0000000000111100000001111100000000000000000011100000000000000001111000
+0011100000111000011000110000000000000000000000000001111000000111000000
+0000000000
+0000000000001111111111100000000000000000000011100000000000000001110000
+0001111111110000011001100000000000000000000000000000011111111110000000
+0000000000
+0000000000000011111110000000000000000000000000000000000000000000000000
+0000011111000000011011000000000000000000000000000000000111111100000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000011110000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000011100000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000111000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000001111000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000011011000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000110011000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000001100011000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000011000011000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000001110000011000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000011100000011000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000111000000011000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000011110000000011000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000011000000000111000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0001110000000000110000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0001100000000000110000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0011100000000000110000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0111000000000000110000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0110000000000000110000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+1100000000000000110000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+1100000000000000110000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000001
+1000000000000001100000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000001
+1000000000000001100000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000011
+0000000000000001100000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000011
+0000000000000011000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000011
+0000000000000011000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000011
+0000000000000011000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000011
+0000000000000110000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000011
+0000000000000110000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000011
+0000000000000110000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000011
+0000000000001100000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000011
+0000000000001100000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000011
+0000000000011000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000001
+0000000000011000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000001
+1000000000110000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+1110000001100000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0111100111000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0001111110000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000011000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000
diff --git a/graphics/pbmtopk/pbmtopk/test.opt b/graphics/pbmtopk/pbmtopk/test.opt
new file mode 100644
index 0000000000..ce9828eea0
--- /dev/null
+++ b/graphics/pbmtopk/pbmtopk/test.opt
@@ -0,0 +1,8 @@
+% pbmtopk option file for the 'test font.
+% invoke with: pbmtopk test.300pk test.tfm 300 -s 10 -f test.opt
+% reset character number to 65 ('A')
+= 65
+% character 'A': small 64x64 version of my face.
+face.pbm
+% character 'B': my name.
+sign.pbm * 57
diff --git a/graphics/pbmtopk/pbmtopk/test.tex b/graphics/pbmtopk/pbmtopk/test.tex
new file mode 100644
index 0000000000..40cbd3b2f0
--- /dev/null
+++ b/graphics/pbmtopk/pbmtopk/test.tex
@@ -0,0 +1,11 @@
+% test.tex
+% test file for simple font produced by pbmtopk.
+% AJCD 9 Aug 90
+
+\font\test=test
+
+This is a test of the font produced with pbmtopk; character A is {\test A},
+and character B is {\test B}.
+
+\vfil\eject
+\bye