kit004075500237450000000000000000001114712475300110775ustar nishidawheelkit/.cvsignore010064400237450000000000000003451062427023100131450ustar nishidawheelconfig.log config.cache configure.scan Imakefile config.status Makefile tp ctlwords.h tp2ps mgp mgp2ps mgp.0 mgp2ps.0 mgpembed.0 grammar.c tokdefs.h scanner.c mgpembed.pl .depend ctlwords mgp.1.html mgp2ps.1.html mgpembed.1.html kit/COPYRIGHT010064400237450000000000000027100657071650700124560ustar nishidawheelCopyright (C) 1997 and 1998 WIDE Project. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. kit/COPYRIGHT.jp010064400237450000000000000030550657373032100130620ustar nishidawheel($BCm(B) $B0J2<$OF|K\8l$NJ}$,J,$+$j$d$9$$?M$N$?$a$K!"1Q8l$NCx:n8"I=<($rLu$7(B $B$?J8>O$G$"$k!#@5<0$JCx:n8"$O!"1Q8l$N86K\$K=>$&!#(B Copyright (C) 1997 and 1998 WIDE $B%W%m%8%'%/%H(B. All rights reserved. $BJQ99$NM-L5$K$+$+$o$i$:!"%=!<%9$*$h$S%P%$%J%j7A<0$N:FG[I[$*$h$SMxMQ$O!"(B $B0J2<$N>r7o$rK~$?$7$F$$$l$P!"$3$l$r5v2D$9$k!#(B 1. $B%=!<%9!&%3!<%I$N:FG[I[$O!">e5-$NCx:n8"I=<(!"$3$N>r7o9`L\!"$*$h$S!"(B $B0J2<$NLH@U;v9`$rJ]B8$7$J$1$l$P$J$i$J$$!#(B 2. $B%P%$%J%j7A<0$N:FG[I[$O!">e5-$NCx:n8"I=<(!"$3$N>r7o9`L\!"$*$h$S!"0J(B $B2<$NLH@U;v9`$r!"$=$NG[I[$KIU?o$9$k@bL@=q!"$"$k$$$O$=$NB>$N;qNA$N$$$:$l(B $B$+$KL@5-$7$J$1$l$P$J$i$J$$!#(B 3. $BA0$b$C$FFCJL$K5vBz$rF@$J$$8B$j!"$3$N%=%U%H%&%'%"$+$iGI@8$7$?@=IJ$N(B $B?d>)$dHNGdB%?J$N$?$a$K!"$3$N%W%m%8%'%/%HL>$H9W8%A0$rMxMQ$7$F$O(B $B$J$i$J$$!#(B $B$3$N%=%U%H%&%'%"$O!V$3$N$^$^$N7A$G!WDs6!$5$l!"L@<(E*$"$k$$$O8@30$NJ]>Z(B $B$O!">&MQMxMQ$*$h$SFCDjL\E*$X$NE,9g$KBP$9$k8@30$NJ]>Z$b4^$_!"$^$?$3$l$i(B $B$@$1$K8B$i$:!"B8:_$7$J$$!#$?$H$(0J2<$N$h$&$JB;32$N2DG=@-$r<(:6$5$l$F$$(B $B$?$H$7$F$b!"$I$N$h$&$J7A$K$7$m$3$N%=%U%H%&%'%"$NMxMQ$+$iH/@8$7$?LdBj$K(B $B$*$$$F!"$3$N%W%m%8%'%/%H$H9W8%@\E*$K!"4V@\E*$K!"6vA3$K!"FCJL$K!"D(H3>e!"$"$k$$$O!"I,A3(B $BE*$K@8$8$F$7$^$C$?B;32$KBP$7@UG$$O$J$/!"$$$+$J$k@UG$M}O@>e$G$b7@Ls$NM-(B $BL5$K78$o$i$:87L)$J@UG$$O$J$/!"$^$?(B($B2a<:$"$k$$$O$=$NB>$r4^$`(B)$BITK!9T0Y$K(B $BBP$7$F$b@UG$$O$J$$!#(B kit/FAQ010064400237450000000000000106461055273436500115210ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MagicPoint FAQ Aug 23, 2005 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: I'm using .dev package of magicpoint and my fonts look jaggy. A: Giving the "-x m17n" to mgp might solve the problem. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: When I incorporate postscript in MagicPoint presentation, "ghostscript" dies with "WARN: cannot generate pnmraw+ file from test.eps". A: Install more recent version of "ghostscript", which supports "pnmraw" output driver. A: Give the -X option to "mgp", with name of "ghostscript" output driver which is configured into your "ghostscript". %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: Background image will not be reflected to postscript output from "mgp2ps". A: This is a feature (or known bug). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: I'm using European language for presentations and line-breaks are not correct. Q: I'm using European language for presentations and accented characters will not be generated on postscript output. A: See README.lang for detail. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: I would like to try a more-recent snapshot version of MagicPoint. A: ftp://sh.wide.ad.jp/WIDE/free-ware/mgp-snap/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: I'm trouble finding scalable fonts. Q: Presentations using X11 font looks awful. A: See README.fonts for detail. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: I have special Adobe type 1 font installed to my X11 configuration, and I cannot use that font with postscript output. A: (1) Modify print.c to include the font into fontname mapping table, (2) Regenerate postscript file, (3) Download your font to your printer, (4) Try printing the file. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: Compilation with png library fails. A: Check the version number of your png library. in most cases, the library you are using is too old. note that, some of Linux rpms uses different version numbering scheme from the original png library. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: %system or %xsystem does not work. Q: If i use %system or %xsystem, X server (or window manager) dies. A: The behavior of %system/xsystem command heavily depends on the behavior of your window manager, and they may not work right for some of those. as there are so many window managers, we have trouble supporting them. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: What is MNG? A: MNG (Multiple-image Network Graphics) is the animation extension of the popular PNG image-format. See http://www.libpng.org/pub/mng and http://www.mng.com/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: Can I convert my animation gif files into mng format? A: Yes. I would like to recommand you to use the convert command in ImageMagick. See http://www.simplesystems.org/ImageMagick/ for more information. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: Can I write Magicpoint presentation with an XML based language? A: The sdoc2mgp.xsl can convert an XML based language into mgp syntax. See http://xml.da-cha.org/ for more information. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: My projector cuts the edge of my computer's output. How can I enlarge the margins? A: Execute MagicPoint with the "-o" option specifying a smaller window size then that of the root window. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: What is Xft? A: Xft is a library designed to interface the FreeType rasterizer with the X Rendering Extension. Please see http://keithp.com/~keithp/render/Xft.tutorial for more information. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: Does mgp support freetype2? A: Since mgp supports xft, you can use freetype2 functions with Xft. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Q: I would like to use non-ASCII characters for filenames in mgp slides A: please run mgp with -U option kit/Imakefile.in010064400237450000000000000114361072474363000133770ustar nishidawheel# $Id: Imakefile.in,v 1.54 2007/12/03 09:08:40 nishida Exp $ @SET_MAKE@ srcdir= @srcdir@ VPATH= @srcdir@ SRCS= mgp.c draw.c parse.c plist.c print.c globals.c x11.c x11dummy.c \ font.c background.c scanner.c grammar.c postscript.c tfont.c \ embed.c unimap.c mng.c m17n.c TPOBJS= mgp.o draw.o parse.o plist.o globals.o x11.o font.o background.o \ scanner.o grammar.o postscript.o tfont.o embed.o unimap.o mng.o m17n.o PROBJS= print.o parse.o globals.o x11dummy.o scanner.o grammar.o postscript.o \ embed.o LIBOBJS= @LIBOBJS@ OBJS= ${TPOBJ} ${PROBJS} ${LIBOBJS} LIBS= $(srcdir)/image/libmgpimage.a AWK= @AWK@ PERL= @mgp_cv_path_perl@ YACC= @YACC@ LEX= @LEX@ # NOTE: we must not define CC here, since imake may assume other CC to be used. OPTFLAGS= @OPTFLAGS@ ${CPPFLAGS} DEFS= @DEFS@ -DMGPLIBDIR=\"$(LIBDIR)/mgp\" #DEFS+= -DGLYPHEDGE SYS_LIBRARIES= -L$(srcdir)/image -lmgpimage @LIBS@ EXTRA_DEPLIBS= @DEPLIBS@ #undef DefaultCDebugFlags #define DefaultCDebugFlags @DEBUGFLAGS@ #undef ServerCDebugFlags #undef LibraryDebugFlags AllTarget(mgp mgp2ps) DependTarget() #ifndef NullParameter #define NullParameter #endif NormalProgramTarget(mgp,$(TPOBJS) $(LIBOBJS), $(LIBS) $(EXTRA_DEPLIBS), NullParameter,$(XLIB)) NormalProgramTarget(mgp2ps,$(PROBJS) $(LIBOBJS), $(LIBS) $(EXTRA_DEPLIBS), NullParameter,$(XLIB)) InstallProgram(mgp,$(BINDIR)) InstallProgram(mgp2ps,$(BINDIR)) InstallManPage(mgp,$(MANDIR)) InstallManPage(mgp2ps,$(MANDIR)) #if defined(ImakeConfigRelease) && ImakeConfigRelease >= 6 InstallNamedTarget(install,mgpembed.pl,$(INSTBINFLAGS),$(BINDIR),mgpembed) /*R6 only*/ #else InstallNamedProg(mgpembed.pl,mgpembed,$(BINDIR)) /*obsoleted in R6?*/ #endif InstallManPage(mgpembed,$(MANDIR)) SpecialObjectRule(draw.o,draw.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(parse.o,parse.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(plist.o,plist.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(postscript.o,postscript.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(print.o,print.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(x11.o,x11.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(font.o,font.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(tfont.o,tfont.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(x11dummy.o,x11dummy.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(background.o,background.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(globals.o,globals.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(mgp.o,mgp.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(scanner.o,scanner.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(grammar.o,grammar.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(embed.o,embed.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(mng.o,mng.c, $(DEFS) $(OPTFLAGS)) SpecialObjectRule(m17n.o,m17n.c, $(DEFS) $(OPTFLAGS)) #define PassCDebugFlags #define IHaveSubdirs SUBDIRS= image sample contrib NamedMakeSubdirs($(srcdir)/image/libmgpimage.a, image) MakeSubdirs(sample contrib) mgp.o: $(srcdir)/mgp.c ctlwords.h draw.o: $(srcdir)/draw.c ctlwords.h globals.o: $(srcdir)/globals.c ctlwords.h grammar.o: $(srcdir)/grammar.c ctlwords.h parse.o: $(srcdir)/parse.c ctlwords.h plist.o: $(srcdir)/plist.c ctlwords.h print.o: $(srcdir)/print.c ctlwords.h ctlwords.h: $(srcdir)/ctlwords.c $(srcdir)/globals.c $(CC) -o ./ctlwords $(srcdir)/ctlwords.c ./ctlwords < $(srcdir)/globals.c > ctlwords.h clean:: rm -f ctlwords scanner.c: $(srcdir)/scanner.l $(LEX) -t $(srcdir)/scanner.l > scanner.c scanner.o: scanner.c tokdefs.h grammar.c tokdefs.h: $(srcdir)/grammar.y $(YACC) -d $(srcdir)/grammar.y mv y.tab.c grammar.c mv y.tab.h tokdefs.h # -O2 will work badly... unimap.o: $(CC) -c $(CCOPTIONS) $(THREADS_CFLAGS) $(ALLDEFINES) \ -I$(srcdir) $(DEFS) $(OPTFLAGS) unimap.c # missing libraries memcmp.o: missing/memcmp.c $(CC) -c $(CFLAGS) -I$(srcdir) $(DEFS) $(OPTFLAGS) \ $(srcdir)/missing/memcmp.c strdup.o: missing/strdup.c $(CC) -c $(CFLAGS) -I$(srcdir) $(DEFS) $(OPTFLAGS) \ $(srcdir)/missing/strdup.c strsep.o: missing/strsep.c $(CC) -c $(CFLAGS) -I$(srcdir) $(DEFS) $(OPTFLAGS) \ $(srcdir)/missing/strsep.c usleep.o: missing/usleep.c $(CC) -c $(CFLAGS) -I$(srcdir) $(DEFS) $(OPTFLAGS) \ $(srcdir)/missing/usleep.c mkstemp.o: missing/mkstemp.c $(CC) -c $(CFLAGS) -I$(srcdir) $(DEFS) $(OPTFLAGS) \ $(srcdir)/missing/mkstemp.c snprintf.o: missing/snprintf.c $(CC) -c $(CFLAGS) -I$(srcdir) $(DEFS) $(OPTFLAGS) \ $(srcdir)/missing/snprintf.c strlcpy.o: missing/strlcpy.c $(CC) -c $(CFLAGS) -I$(srcdir) $(DEFS) $(OPTFLAGS) \ $(srcdir)/missing/strlcpy.c strlcat.o: missing/strlcat.c $(CC) -c $(CFLAGS) -I$(srcdir) $(DEFS) $(OPTFLAGS) \ $(srcdir)/missing/strlcat.c distclean:: clean -/bin/rm -f config.status config.log config.cache ctlwords.h -/bin/rm -f scanner.c grammar.c tokdefs.h mgp.0 mgp2ps.0 mgpembed.pl -/bin/rm -f contrib/mgp2html.pl contrib/mgp2latex.pl for i in $(SUBDIRS); do \ (cd $$i; if [ -f Makefile ]; then make distclean; fi); \ done -/bin/rm -f Makefile Imakefile /*EOF*/ kit/README010064400237450000000000000114751074705526600120520ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MagicPoint - an X11 based presentation tool September 9, 2003 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MagicPoint is an X11 based presentation tool. It is designed to make simple presentations easy while to make complicated presentations possible. Its presentation file (whose suffix is typically .mgp) is just text so that you can create presentation files quickly with your favorite editor (e.g. Emacs). This is one of the alpha releases of MagicPoint. We're planing to add a version control mechanism of .mgp file for forward compatibly. But currently, such a mechanism is missing. Please use this package at your own risk. MagicPoint is completely free but absolutely no warranty. For more information, please refer to COPYRIGHT or COPYRIGHT.jp. Please note that some of the source codes is derived from other people's works, and may have different distribution policies. Be sure to check the comments in the source codes. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% INSTALLATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Since MagicPoint extensively uses fonts in various sizes, we recommend you to install good font rendering systems in your system. THIS DOCUMENT ASSUMES THAT YOU WILL USE MAGICPOINT WITH **TRUETYPE** FONTS. YOU SHOULD INSTALL *FREETYPE* BEFORE YOU INSTALL MAGICPOINT. To install "libttf.a", see: http://www.freetype.org/ If you want to use other rendering systems, read "README.fonts" or "README.fonts.jp". %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Follow the steps below to make MagicPoint: English or European: % ./configure Japanese: % ./configure --enable-freetype-charset16 % xmkmf % make Makefiles % make Invoking `configure' updates Imakefile. So, do NOT forget to invoke `xmkmf' everytime you update Imakefile. Note: if you have to use a non-standard compiler, you must declare your compiler by using "env" command, like: % env CC=gcc ./configure # force gcc % env CC=shlicc2 ./configure # force shlicc2 (bsdi3) We cannot make a guess in the configure script, since "imake" may dislike the compiler that was guessed by configure. This applies to, for example, Solaris without the Sun compiler license (gcc-only environment). Note 1: If you are willing to use the iso-8859-x character set (i.e. you would like setlocale() to be called at startup), specify the "--enable-locale" option. Note 2: If you have libraries installed at odd places, use the option --with-searchpath=/your/odd/path. E.g. if you have installed libfreetype on MAcOS X from Fink, use ./configure --with-searchpath=/sw Multiple directories need to be included in quotes and seperated with spaces. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% It's a good idea to preview sample files before installation. For more information, see "sample/README" or "sample/README.jp", which describes how to install TrueType fonts. To visualize the sample{,-jp}.mgp file, type: % ./mgp sample/sample.mgp % ./mgp sample/sample-jp.mgp To visualize the tutorial{,-jp}.mgp file, type: % ./mgp sample/tutorial.mgp % ./mgp sample/tutorial-jp.mgp WE STRONGLY RECOMMEND TO BUY TRUETYPE FONTS IF YOU WANT TO GIVE YOUR PRESENTATION WITH BEAUTIFUL FONTS. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% When you believe that everything is OK, install MagicPoint as follows: % su # make install # make install.man Alternatively you can build a native package (RPM, DEB, PKG, ...) for your operating system with the EPM package manager (freely available from http://www.easysw.com/epm/) and install this package. The configu- ration file for the packages is "mgp.list". The EPM method has the advantage that you can uninstall magicpoint later if you no longer need it or want to upgarde to a new version. The following commands for instance generate a Debian package and a RPM package on linux systems: % su # necessary on Debian only $ epm -f deb -nm mgp # creates DEB in subdirectory linux-*/ $ epm -f rpm -nm mgp # creates RPM in subdirectory linux-*/ If you want to paste EPS figures into your presentation, you will need to install "ghostscript" or "alike". %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FOR MORE INFO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Official home page of MagicPoint is: http://member.wide.ad.jp/wg/mgp/ Stable release packages are available from: ftp://sh.wide.ad.jp/WIDE/free-ware/mgp/ To join the mailing-list for MagicPoint, See: http://member.wide.ad.jp/wg/mgp/ml.html http://member.wide.ad.jp/wg/mgp/ml-jp.html (in Japanese) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% kit/README.fonts010064400237450000000000000172100735653025700131730ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Configuring fonts for MagicPoint presentation March 15, 2001 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% For better presentations with the "MagicPoint" presentation tool, it is necessary to configure your MagicPoint, and maybe your X11 server to handle large-size fonts. The document tries to summarize steps to make use of large-size fonts with MagicPoint. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Standard methods %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - Scalable English fonts, with the FreeType library FreeType project, a free software project for TrueType scalable font renderer, provides the FreeType library at: http://www.freetype.org/ MagicPoint implements native support for the FreeType library. You can compile the renderer into MagicPoint. If you have the FreeType library (libttf.a) somewhere in your system, the "configure" script will find the library and links the library into the MagicPoint binary. To avoid linking libttf.a into the MagicPoint binary, you can specify the --disable-freetype option to the "configure" script, as below: ./configure --disable-freetype If you want to get Free/Commercial TrueType fonts, read the section "How to get TrueType fonts" below. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - Scalable English fonts, with a standard X11 server A standard X11 server is capable of rendering "Adobe Type-1" scalable fonts. To use Adobe Type-1 fonts, you have to install their font files. You can find some fonts in /usr/X11R6/lib/X11/fonts/Type1, which is a part of the X11 standard distribution. If you do not have the directory (or a similar directory), please install adequate font files into your system. Some good additional fonts can be found at: http://www.gimp.org/fonts.html ftp://ftp.gimp.org/pub/gimp/fonts/ You may also add some directories to the X11 font search path. Refer to the manual for your system. Also, please do not forget to perform "xset fp rehash", if you modify the X11 font path while your X11 sever is running. You can query these fonts by using XLFD (X11 font specification string) starting with "-adobe-". Use "xfontsel" to see whether or not it is installed. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - Scalable Japanese fonts, with VFLib For non-Adobe and Adobe scalable fonts, a library called VFLib is available from: ftp://gull.se.hiroshima-u.ac.jp/pub/VFlib/. MagicPoint implements native support for VFlib library. You can compile the renderer into MagicPoint. If you have the VFlib library (libVFlib.a) somewhere in your system, "configure" script will find the library and links the library into the MagicPoint binary. To avoid compiling libVFlib.a into the MagicPoint binary, you can specify --disable-vflib option to "configure" script, as below: ./configure --disable-vflib English fonts will become scalable as well, however, this method is not very suitable for western readers since this approach usually uses Japanese font files. The Japanese font files include several thousand of letters and will occupies several megabytes on your disk. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - Scalable Japanese fonts, with FreeType Recent MagicPoint can use the FreeType library for rendering Japanese fonts. You can use this function by executing configure script as below: ./configure --enable-freetype-charset16 You also need to specify Japanese truetype font files with 'tmfont' directive. The usage of 'tmfont' directive is described in the SYNTAX file. Note: If you have already installed the VFlib library and you want to use the FreeType library to render Japanese fonts, you have to disable VFlib as below: ./configure --disable-vflib --enable-freetype-charset16 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Advanced/complex methods %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - Scalable fonts, with a FreeType-ready X11 server There seems to be several projects for implementing FreeType into X11 server, or X11 font servers (xfs). By using these kind of implementation, a X11 server will be able to render wide variety of TrueType scalable fonts. For obtaining implementation, visit the following URL: http://www.freetype.org/projects.htm http://www.gimp.org/fonts.html See the "Using TrueType fonts with Gimp and X" section. The projects listed below support not only Western languages but also Asian languages: http://cclub.cc.tut.ac.jp/~go/unix/xtt.html http://hawk.ise.chuo-u.ac.jp/student/person/tshiozak/x-tt/index-eng.html By specifying proper XLFD, you can use those scalable fonts with MagicPoint. You may have to modify some of the FreeType-X11 font specification file as well. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - Scalable Japanese/English fonts, with a VFlib-ready X11 server There are several project to compiling VFlib into X11 server, or X11 font server (xfs), for example: http://karin.ip.titech.ac.jp/~takagi/X-VFlib/index.html By specifying proper XLFD, you can use those scalable fonts with MagicPoint. You may have to modify some of the VFlib-X11 font specification file as well. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - Scalable Japanese fonts, with the VFlib/FreeType-hetero library It may be really confusing (even for the authors), but there are several attempts to merge VFlib and FreeType. Some try to provide functionality of FreeType under VFlib API (FreeType-in-VFlib), and others try to do the other way around (VFlib-in-FreeType). In either cases, you can link the library into MagicPoint itself. There are, of course, attempts to merge those font renderers into X11 servers or X11 font servers (xfs). In this case, you can use scalable font by using proper XLFD. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Miscellaneous %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - How to get TrueType fonts. You can get freely available TrueType fonts from following: http://www.aaa.nl/people/mkatwijk/freettf.html http://come.to/freefonts CTAN mirros, pub/CTAN/fonts/cm/ps-type1/bakoma/ttf Computer modern fonts in TrueType format ftp://www.mew.org/pub/MagicPoint/xtt-fonts_0.19981020-3.tar.gz Freely redistributable Japanese fonts are converted into TrueType format. (Wadalab gothic and Watanabe mincho) http://members.aol.com/JR9er/index.html http://members.xoom.com/acidfonts/ http://dingbats.i-us.com/ http://www.freestuffcenter.com/fonts.html http://www.fontpool.com/ TrueType font collections and collections of links. Also there are several sources for free-of-charge fonts, with some licensing things: http://microsoft.com/typography/fontpack/default.htm NOTE: Because that MS fonts package is Self Extract type windows executable, you must extract it on windows platform. mmmm... http://www.bitstream.com/products/world/cyberbits/index.html NOTE: You can download it without fee. You must sign a form to download this. You can also purchase their CD-ROM. Of course, it's also good for you to purchase commercial font products. Here are some online stores for font files, including TrueType fonts: http://www3.digitalriver.com/bit/index.html http://www.arttoday.com/ http://www.matchfonts.com/ You may also able to purchase "font collection CD-ROM", at computer store near you. NOTE: TeX-deribed fonts (including computer modern fonts) places marks like "<" or ">" in strange places. Therefore, you may have some trouble writing formulas and other non-plain text. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% kit/README.fonts.jp010064400237450000000000000241030725472622700136030ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MagicPoint$B%W%l%<%s%F!<%7%g%sMQ$N%U%)%s%H@_Dj$K$D$$$F(B March 15, 2001 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% $BF|K\8lHG(B(README.fonts.jp)$B$K4X$9$kCm0U(B %%% $B1Q8lHG(B(README.fonts)$B$NJ}$,@5<0$G$9!#(B $BF|K\8lHG$OFbMF$N99?7$,CY$l$k2DG=@-$,$"$j$^$9!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MagicPoint $B$G$OMM!9$JJ}K!$G%U%)%s%H>pJs$r@\8F$S=P$7$K$h$k%Y(B $B%/%?!<%U%)%s%H$NMxMQ$b$G$-$k$h$&$K$J$C$F$$$^$9!#(B $B$3$3$G$O!"(BMagicPoint $B$GH/I=$9$k:]$K5$$K$J$kBg$-$JJ8;z$rH~$7$/I=<($9$k(B $BJ}K!$K$D$$$F@bL@$7$^$9!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $BI8=`E*$JJ}K!(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - FreeType $B%i%$%V%i%j$rMxMQ$7$?%9%1!<%i%V%k%U%)%s%H$NMxMQ(B FreeType $B%i%$%V%i%j$O!"(BFreeType $B%W%m%8%'%/%H(B http://www.freetype.org/ $B$,G[I[$7$F$$$k%U%j!<$N(B TrueType $B%U%)%s%H!&%l%s%@%i!<$G$9!#(BMagicPoint $B$O(BFreeType $B%i%$%V%i%j$rAH$_9~$`$3$H$G!"D>@\(B TrueType $B%U%)%s%H$rMxMQ$G(B $B$-$k$h$&$K$J$j$^$9!#$*;H$$%7%9%F%`$K(B FreeType $B%i%$%V%i%j(B(libttf.a)$B$,%$(B $B%s%9%H!<%k$5$l$F$$$k>l9g!"(BMagicPoint $B$N9=C[;~(B(configure$B%9%/%j%W%Hl9g$O!"(B ./configure --disable-freetype $B$N$h$&$K!"(Bconfigure$B%9%/%j%W%H$N0z?t$K(B--disable-freetype$B$r$D$1$F&MQ(B)$B$NH$7$F$/$@$5$$!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - $BI8=`E*$J(BX11$B%5!<%P$rMxMQ$7$?%9%1!<%i%V%k!&%U%)%s%H$NMxMQ(B $B1QJ8;z%U%)%s%H$K4X$7$F$O!"(BX11$B%5!<%P$OI8=`$G!"(BAdobe Type1$B7A<0$N%9%1!<%i(B $B%V%k!&%U%)%s%H$rMxMQ$G$-$^$9!#(BAdobe Type1 $B7A<0$N%U%)%s%H$r;H$&$K$O!"(B X11$B%U%)%s%H%Q%9$,DL$C$F$$$k>l=j$K(B($BDL>o$O(B/usr/X11R6/lib/X11/font/Type1) $B$K%U%)%s%H$,CV$+$l$F$$$J$1$l$P$J$j$^$;$s!#(B $B$*;H$$$N%7%9%F%`$K(B Type1 $B%U%)%s%H$,4^$^$l$F$$$J$$!"$b$7$/$O!"I,MW$J%U%)(B $B%s%H$,7g$1$F$$$k>l9g$O!"$4<+J,$G%$%s%9%H!<%k$7$F$/$@$5$$!#(B X11$BI8=`G[IU$K$D$$$F$$$k$b$N0J30$K$b!"$$$/$D$+$N(BAdobe Type1$B7A<0$N%U%)%s%H$r(B http://www.gimp.org/fonts.html ftp://ftp.gimp.org/pub/gimp/fonts/ $B$+$iH$7$F$/$@$5$$!#(B $B$^$?!"K:$l$:$K(B Type1 $B%U%)%s%H$,CV$+$l$?%G%#%l%/%H%j$X$N%U%)%s%H!&%Q%9(B $B$r@_Dj$9$k$h$&$K$7$F$/$@$5$$!#%7%9%F%`$K$h$C$F%U%)%s%H!&%Q%9$N@_DjJ}K!(B $B$,0[$J$k$3$H$,$"$k$N$G!"$*;H$$$N(B X $B%5!<%P$N%^%K%e%"%k$r;2>H$7$F$/$@$5(B $B$$!#(B $B%U%)%s%H$r%$%s%9%H!<%k$7$?D>8e$b$7$/$O%U%)%s%H!&%Q%9DL$7$?D>8e$O(B xset fp rehash $B%3%^%s%I$rMxMQ$7$F(B X $B%5!<%P$N%U%)%s%H>pJs$r99?7$7$F$/$@$5$$!#(B $B@5$7$/%U%)%s%H$,%$%s%9%H!<%k$5$l$F$$$k$+$O!"(Bxfontsel $B$*$h$S(B xlsfonts$B$G(B $B3NG'$G$-$^$9!#(BType1 $B%U%)%s%H$O(B XLFD $B$H$7$F$O(B "-adobe-" $B$G;O$^$kL>A0$,(B $B$D$$$F$$$^$9$N$G!"$=$N%U%)%s%H$,$"$k$3$H$r3NG'$7$F$/$@$5$$!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - $B%9%1!<%i%V%kF|K\8l%U%)%s%H$NMxMQ(B %%%% - VFlib$B$rMxMQ$7$?>l9g(B VFlib ftp://gull.se.hiroshima-u.ac.jp/pub/VFlib/ $B$O3Fl9g!"(BMagicPoint $B$N:n@.;~(B (configure$B%9%/%j%W%Hl9g$O!"(B ./configure --disable-vflib $B$N$h$&$K!"(Bconfigure $B%9%/%j%W%H$N0z?t$K(B --disable-vflib $B$r$D$1$Fe$H$F$bBg$-$$$N$G!"(B $B1Q8l$7$+MxMQ$7$J$$%f!<%6$K$H$C$F$O$A$g$C$HL5BL$+$b$7$l$^$;$s!#(B %%%% - FreeType$B$NMxMQ(B $B8=:_$N(BMagicPoint$B$G$O(BFreeType(http://www.freetype.org/)$B$rMxMQ$7$F(B TrueType $B$NF|K\8l$rI=<($9$k$3$H$,$G$-$^$9!#(BFreeType$B$,%$%s%9%H!<%k$5$l$F$$$k(B $B4D6-$G!"(B ./configure --enable-freetype-charset16 $B$N$h$&$K%*%W%7%g%s$r;XDj$7$F(Bconfigure$B$rH$7$F$/$@$5$$!#(B (*$BCm(B) VFlib$B$,%$%s%9%H!<%k$5$l$F$$$k4D6-$G!"(BFreeType$B$rMxMQ$7$FF|K\8l%U%)%s%H(B $B$rI=<($7$?$$>l9g$O!"(Bconfigure $B%9%/%j%W%H$NH$N$3$H(B $B$N%5%$%H$G8x3+$5$l$F$$$^$9!#(B $B$3$l$i$N(B FreeType $B$,AH$_9~$^$l$?(B X11 $B%5!<%P$rMxMQ$9$k$H!"MM!9$J(B TrueType $B%U%)%s%H$r(B X11 $B$N%U%)%s%H$H$7$FMxMQ$G$-$k$h$&$K$J$j$^$9!#(B $B$3$l$i$N%U%)%s%H$N(B XLFD $B$r;XDj$9$k$3$H$G!"(BMagicPoint $B$+$iMxMQ$G$-$k$h(B $B$&$K$J$j$^$9!#(B %%%% - $B1QJ8;z(B/$BF|K\8l%U%)%s%H$NMxMQ(B $BF|K\8l(B TrueType $B$K4X$7$F$b!"(BFreeType $B$rAH$_9~$s$@(B X11 $B%5!<%P$*$h$S(B X11 $B%U%)%s%H!&%5!<%P$GMxMQ$7$h$&$H$$$&F0$-$,$"$j$^$9!#(B $B$?$H$($P!"(B http://cclub.cc.tut.ac.jp/~go/unix/xtt.html http://hawk.ise.chuo-u.ac.jp/student/person/tshiozak/x-tt/ $B$N%5%$%H$G8x3+$5$l$F$$$^$9!#(B $B$3$l$i$N%U%)%s%H$N(B XLFD $B$r;XDj$9$k$3$H$G!"(BMagicPoint $B$+$iMxMQ$G$-$k$h(B $B$&$K$J$j$^$9!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - VFlib $B$KBP1~$7$?(B X11 $B%5!<%P$K$h$k%9%1!<%i%V%k!&%U%)%s%H$NMxMQ(B VFlib $B$rAH$_9~$s$@(B X11 $B%5!<%P$*$h$S(B X11 $B%U%)%s%H!&%5!<%P$rMxMQ$7$F1Q8l(B $B$dF|K\8l$rI=<($G$-$^$9!#(B $B$?$H$($P!"(B http://karin.ip.titech.ac.jp/~takagi/X-VFlib/index.html $B$N%5%$%H$G8x3+$5$l$F$$$^$9!#(B $B$3$l$i$N%U%)%s%H$N(B XLFD $B$r;XDj$9$k$3$H$G!"(BMagicPoint$B$+$iMxMQ$G$-$k$h$&(B $B$K$J$j$^$9!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - VFlib/FreeType $BJ#9g%i%$%V%i%j$K$h$k%9%1!<%i%V%k!&%U%)%s%H$NMxMQ(B VFlib $B$H(B FreeType $B$r9g$o$;$?%i%$%V%i%j$,B8:_$7$^$9!#(BVFlib API $B$rMxMQ$7(B $B$F(B FreeType $B$N5!G=$rMxMQ$9$k$b$N$d!"(BFreeType $B$r3HD%$7$F(BVFlib$B5!G=$rMxMQ(B $B$G$-$k$h$&$K$9$k$b$N$,$"$j$^$9!#(B $B$I$A$i$N>l9g$G$b!"(B($B$?$V$s(B) MagicPoint $B$G$b$=$N$^$^MxMQ$G$-$k$G$7$g$&!#(B $B$^$?!"EvA3$G$9$,!"$3$l$i$N%U%)%s%H!&%l%s%@%i$r(B X11 $B%5!<%P$*$h$S(B X11 $B%U%)(B $B%s%H!&%5!<%P$KAH$_9~$s$G$$$k>l9g$O!"(BMagicPoint $B$G$b(B XLFD $B$r;XDj$9$k$3(B $B$H$G(BX$B$N%U%)%s%H$H$7$FMxMQ$G$-$^$9!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $B$=$NB>;(B?$J$3$H(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - TrueType $B%U%)%s%H$N/$7Ld(B $BBj$,$"$j$^$9!#(B http://microsoft.com/typography/fontpack/default.htm $B%i%$%;%s%9$K$O%U%j!<$G$"$k$H=q$+$l$F$$$^$9$,!"(B Windows$B%W%i%C%H!&%U%)!<%`$G$7$+E83+$G$-$J$$<+8J2rE`(B $B7A<0%P%$%J%j$GG[I[$5$l$F$$$^$9!#E83+$N:]$K$O%i%$%;(B $B%s%9>r9`$X$NF10U$,I,MW$K$J$j!"<+F0E*$K(Bwindows$B$N%U%)(B $B%s%H%G%#%l%/%H%j$K%$%s%9%H!<%k$5$l$^$9!#(B http://www.bitstream.com/products/world/cyberbits/index.html $BL5NA$G%@%&%s%m!<%I$G$-$^$9$,!"$=$N:]$K%5%$%s$7$J$$(B $B$H$$$1$^$;$s!#(BCDROM $B$r9XF~$9$k$3$H$G$b&MQ%U%)%s%H$rMxMQ$9$k$N$bNI$$J}K!$G$7$g$&!#0J2<$N%5%$%H$G$O%$%s%?!<%M%C(B $B%H>e$G%*%s%i%$%s$G%U%)%s%H$rHNGd$7$F$$$^$9(B: http://www3.digitalriver.com/bit/index.html http://www.arttoday.com/ http://www.matchfonts.com/ $B$^$?!"%Q%=%3%s!&%7%g%C%WE9F,$G!V%U%)%s%H!&%3%l%/%7%g%s(B CD-ROM$B!W$NN`$r(B $B9XF~$9$k$N$b$$$$$G$7$g$&!#(B NOTE: TeX $B5/8;$N%U%)%s%H(B(computer modern font$B$b$3$NCg4V(B)$B$G$O!"(B"<" $B$d(B ">" $B$J$I$N5-9fN`$,(B ASCII $B$H0c$&G[Ns$K$J$C$F$$$^$9!#$3$N$?$a!"?t<0$d$=(B $B$NB>$N5-9fF~$j$NJ8$r=q$/$H$-$K6lO+$9$k$+$b$7$l$^$;$s!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% kit/README.lang010064400237450000000000000027061114676321600127620ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Making multilingual presentations with MagicPoint March 15, 2001 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MagicPoint has no idea about what kind of character set you are using with your presentation file, or what kind of language you are using. For example, if you use Latin-1 (iso-8859-1) you MUST tell that explicitly to MagicPoint. If you want to use Latin-[1-4] (iso-8859-[1-4]), you can specify the encoding of the file explisitly with charset directive, like: %charset "iso8859-1" Note that this directive can be used after %page directive, that is, you can't use %charset directive in preamble. In the future, we will add more encodings to charset directive, like "iso2022-jp", or "euc-jp" Making MagicPoint presentations in European languages - Use "/configure --enable-locale" before compilation. In some operating systems you may need -lxpg4 with this. (so that ctype functions, such as isprint(), works with locale support) - When invoking MagicPoint, configure the LANG environment variable to proper value. - When making a PostScript file for the presentation, use -e option. Making MagicPoint presentations in Asian languages - Use iso-2022 family encoding (iso-2022-jp, iso-2022-cn and others). Or, the X11 ctext encoding for your file. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% kit/README.m17n010064400237450000000000000013031010604405300125750ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Using the m17n library for MagicPoint Aug 10, 2004 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% From 1.11a, mgp supports m17n library which provides multilingual facilities to applications. Please see http://www.m17n.org for more information of m17n library. To use this library, you need to run configure with --with-m17n-library when you build mgp. (Of course, you need to install m17n library beforehand.) The mgp which was build with m17n-lib use this library as default rendering engine. If you want to use other rendering engines, use -x m17n option. kit/README.xft010064400237450000000000000023661002000074200126160ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Configuring Xft2 and fontconfig for MagicPoint Jun 5, 2003 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% From 1.10a, mgp supports Xft2 and fontconfig libraries. Using these libraries will bring mgp the following benefits. a) type1 font support b) better anti-aliasing algorithm c) closest matching font selection algorithm d) M17N functions To use these functions, you need to install them. If you have XFree86 4.2 or higher, probably Xft2 is already installed. But you might have to install fontconfig. If you're using recent Linux distributions, they may be already installed and configured. If you have the "fc-list" command which is part of the fontconfig package and if it shows names of the fonts on your system, both libraries have been successfully installed. use %xfont directive to specify which font to use. If you don't have these libraries, the following URL will be useful. * http://www.fontconfig.org you can get the most recent version of the fontconfig package and configuration documents for setting up. * http://www.xfree86.org you can get the most recent version of XFree86. kit/RELNOTES010064400237450000000000000077441077006472400123470ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Release Notes for MagicPoint Feb 14, 2008 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <<<1.13a>>> * m17n library support enhancement * MacOS support enhancement * add new environment variable MGPRC for the path of the .mgprc file. * add "psfont" directive to specify the font used by mgp2ps * add -g option for mgp2ps to allow users to adjust line distanc * add -zoomonclk option for newimage * allow to handle gif format images by default * many bug fixes Dedication Magicpoint 1.13a is dedicated to the memory of Dr. Jun-ichiro "itojun" Hagino, who was known for his enormous contribution to the Internet and the Open Source Software community. He was the developer of Magicpoint from its infancy. Magicpoint could not exist without his devoted work. <<<1.12a>>> * add %tsystem directive which might be more stable than %xsystem * add -rotate option for newimage * allow to use non-ASCI filename in slides (use -U to enable this feature) * many bug fixes <<<1.11b>>> * (bugfix) suppress flickering screen when ctrl key is pressed <<<1.11a>>> * use EWMH to get borderless fullscreen. (use 'w' key to switch) * MacOS X support * m17n library support * setlocale-patch built in, print.c (from mailing list: mgp-users 01112) * %-character can be escaped by '\' at the beginning of a line * escape sequence added o \[xX]HH will be converted to a character (H - hex value) o \\ means \ o \[^xX] or \[xX]CC with 'C' different to hex values will cause the program to exit -1 * super-/subscript support * support for symbol font added * new option: --title 'title' for mgp. * add -raise option for %newimage directive * many bug fixes. <<<1.10a>>> * Support for Xft2 + fontconfig. If you are not familiar with these words, please see FAQ and README.xft2 for more information. * Support for new directive %tab 0 which can be used to apply a list of directives to lines that start with a non-tab character. * For security reasons, we have changed mgp so that directives that fork a process are not processed by default. The -U option must be specified in order to process such directives. * Introduced %opaque directive. Please see SYNTAX for detailed information. * Support for iso8859-2 encoding for mgp2ps * Introduced -X option for mgp2ps to suppress the use of the specified rendering engine * Introduced escape char '\' to display lines that start with '#'. * Many bug fixes. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <<<1.09a>>> New features: - The "area" directive: specifying drawing area in the window. it can be used for siide-by-side positioning or logo displaying, etc. - Enhance "prefix" directive you can specify prefix spacing by percentage of the drawing area width. Bugs fixed: - Security fix: fix a seculity hole inherited from xloadimage. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <<<1.08a>>> New features: - The "charset" directive: you can use iso-8859-[1-4] - MNG support: animation without "mark" and "again" - Enhancing "mgp2ps" * Supporting "cont", "mark", "again" * Resizing image Bugs fixed: - Some. :-) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <<<1.07a>>> New features: - PNG support - Adding a dither algorithm to the gradation mechanism - Pre-drawing (Pages which contain text only is cached before displayed.) - mgp2ps produces much closer PS image to display image. Bugs fixed: - If bgrad and/or bimage were used, display speed was getting slower and slower. This has been fixed. - Freeing color resources used anti-alias was wrong. This has been fixed. - Cleaned up the code for background image handling. - mgp was core-dumped if reloaded during caching. This has been fixed. - Fixed some small bugs. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% kit/SYNTAX010064400237450000000000000336031074416247000121310ustar nishidawheel$Id: SYNTAX,v 1.46 2008/01/18 17:43:20 nishida Exp $ placement restriction for directives: .mgprc preamble main pages --- --- --- %vfcap okay x okay %tfdir okay x okay %tfont0 okay x okay %default x okay x %tab x okay x %deffont x okay x %include x okay x others x x okay %% Comment lines. # Comment lines. \# (at the beginning of a line) Shows the character #. \% (at the beginning of a line) Shows the character %. \ Followed by an escape sequence. Currently supported: - \\ converts to the character \. - \xHH (case insensitiv), where HH are hexadecimal digits. Converts to the ASCII-character number HH. Escaping is switched off in Unicode. \ (at the end of line) Line continuation. Spaces/tabs at the beginning of next line will be ignored. %size :: size of fonts %fore "color" "color" :: color of foreground %back "color" "color" :: color of background %ccolor "color" "color" :: color of page guide and balloon help in bottom line %bgrad :: width of generated image(0-100%) 0 means physical display size :: height of generated image(0-100%) 0 means physical display size :: number of colors, 0 means no reduction. default 256 colors(8bit) :: gradation direction (0-360 degree) 0 :Top to Bottom 90 :Left to Right 180:Bottom to Top 270 :Right to Left default 0 negative value means "non-liner gradation" :: zoom to max size 0 nozoom, 1 zoom default 0 :: colors in the gradation image %left Left justify. %leftfill Left justify, with folding long line. %center Centering. %right Right justify. %shrink (not supported at this moment) %lcutin Text will be animated (flying from the leftmost edge of the page). %rcutin Text will be animated (flying from the leftmost edge of the page). %cont Draw without line break. %nodefault Disable effect of default directive. %xfont "font" %xfont "font" "registry" :: use X11's to draw characters. "font" is for specifying X11 XLFD, font alias name, or "family-weight-slant". "registry" is for specifying "registry-encoding". interpretation of "registry": - If none specified, "iso8859-1" is assumed. - If no dash inside, encoding of "*" is assumed. Therefore, you'll get "REGISTRY-*". - If there's a single dash inside, use specified value. Therefore, you'll get "REGISTRY-SPECIFIED". interpretation of "font": - If it has no dash inside, Try font alias, such as "8x5" or "a14". If there's no font alias matched, it should be "times" or something like that. In this case, try "-*-FONT-*-*-*-*-SIZE-*-*-*-*-*-REGISTERY-SPECIFIED". - If it has single dash inside, such as "times-medium": Try "-*-FONT-NAME-*-*-*-SIZE-*-*-*-*-*-REGISTRY-SPECIFIED". - If it has two dash inside, such as "times-medium-r": Try "-*-FONT-NAME-SPECIFIED-*-*-SIZE-*-*-*-*-*-REGISTRY-SPECIFIED". - Otherwise, try the specified string itself as XLFD. Some exercises: %xfont "times" You'll get "-*-times-*-*-*-*-SIZE-*-*-*-*-*-iso8859-1". %xfont "mincho" "jisx0208.1983" You'll get "-*-mincho-*-*-*-*-SIZE-*-*-*-*-*-jisx0208.1983-*". %xfont "mincho-medium-r" "jisx0208.1983" You'll get "-*-mincho-medium-r-*-*-SIZE-*-*-*-*-*-jisx0208.1983-*". NOTE: Only the following items are meaningful as "registry". jisx0208.1983-* gb2312.1980-* ksc5601.1987-* iso8859-1 iso8859-2 iso8859-3 iso8859-4 It would be nice if we can support "adobe-specific" for symbols, however, we have no escape sequence to designate the it... If you have installed magicpoint with Xft2 enabled, %xfont will accept "FONTNAME", "FONTNAME:STYLE", and "FONTNAME:style=STYLE". Note that if you specify "FONTNAME" and it contains '-', it will be interpreted as XLFD. In such a case, you should use "FONTNAME:STYLE" or "FONTNAME:style=STYLE". %vfont "font" :: use VFlib's to draw Kanji characters. %tfont "font" :: use TrueType font to draw ASCII characters. can be full pathname, or just filename. Use %tfdir for setting default font directory. %tmfont "font" :: use TrueType font to draw Kanji characters. can be full pathname, or just filename. you do not need it with Xft2 enabled installation. %tfont0 "font" :: use TrueType font , if none of the font specified by %tfont directive is found. This is the last-resort for the TrueType font finding code. (allowed in ~/.mgprc, without "%" sign) you do not need it with Xft2 enabled installation. %psfont "font" :: use PostScript fonts to create PostScript file Suported fonts are: Times-[Roman|Italic|Bold|BoldItalic] Helvetica Helvetica-[BoldOblique|Bold|Oblique] Helvetica-Narrow Helvetica-Narrow[Oblique|Bold|Oblique] NewCenturySchlbk-[Roman|Bold|Italic|BoldItalic] Courier Courier-[Oblique|Bold|BoldOblique] AvantGarde-[Book|BookOblique|Demi|DemiOblique] Bookman-[Demi|DemiItalic|Light|LigtItalic] Palatino-[Roman|Bold|Italic|BoldItalic] ZapfChanery-MediumItalic Symbol ZapfDingbats if none of this fonts is specified it uses the default font Helvetica. %bar :: color of bar, foreground color will be used as default. :: permill of display height. default 10. :: start position percent of display width. default 0. :: length percent of display width. default 100. %valign "top|center|bottom" vertical alignment of images with current text line %image "imagefile" %image "imagefile" [ [] ] "imagefile" :: name of image file :: number of colors, 0 means no reduction. :: height percentage against physical display or original size, 0 means the original height. :: width percentage against physical display or original size, 0 means the original width. :: 0 means zoomrate is against physial display others mean zoomrate is against original size :: auto resizing. specify the original screen size by WIDTHxHEIGHT. unless screensize is the same size of the physical display, zoomrate is calculated automagically. Note that if the image is a binary image, current foreground and background colors are applied to the drawn image. %newimage [options] "imagefile" Same as %image, but it is much easier to understand. options include: -colors numcolors -xysize pixel pixel -zoom percentage -xyzoom x-percentage y-percentage Percentage is against the original image. "100" means the original image size, "50" means half the original image size. -scrzoom percentage -xscrzoom percentage -yscrzoom percentage -xyscrzoom x-percentage y-percentage Percentage is against the screen. "100" means screen width/height, "50" means half the screen width/height. -xscrzoom and -yscrzoom scales image with aspect ratio unchanged. -raise percentage raise the baseline of the image in the line. Percentage is against the height of the image. "100" means the height of the image. -rotate degrees degrees is angle measure counter clockwise, supported values are 0, -90, 90, -180, 180, 270 -zoomonclk percentage enlarge image when it is clicked. Percentage is against the screen. "100" means screen width. TODO: supersede %image by %newimage? TODO: option for auto resize mode (fit image into the room left on the screen) %prefix "string" Place "string" at the beginning of line. "string" should be a set of blank characters (\040). The effect of %prefix command in %tab command is local to tab-indented line. %prefix specify prefix spacing by of the drawing area width. The effect of %prefix command in %tab command is local to tab-indented line. %icon %icon add an icon for itemizing lines. for example, %tab 1 size 5, icon box green 50 gives you an green box on the leftmost column of line. size is the percentage against the current character size. %bimage "imagefile" [ ] Specify the name of background image file :: auto resizing. specify the original screen size by WIDTHxHEIGHT. unless screensize is the same size of the physical display, zoomrate is calculated automagically. %default Unless nodefault directive is specified, the directives in the argument is prepended to the directives of the linenum'th line in every page. The syntax of is a comma separated directives. This directive has to be placed in the preamble. %tab Apply list of directives, if any of the lines start with tabnum tabs. This directive has to be placed in the preamble. %tab Apply list of directives, if any of the lines start with "&id". This directive has to be placed in the preamble. %page A new page starts %vgap Specify vertical gap size of each line :: percentage against current character size vertical gap = vertical font size * gapsize / 100 %hgap Specify horizontal gap size of each line :: percentage against current character size horizontal gap = vertical font size * gapsize / 100 NOTE: horizontal gap is calculated based on vertical size, because fonts are proportional (horizontal size varies by code point). %pause Stop drawing until forward key or button is pressed %mark Mark the current position on the screen, so that we can come back later by %again. NOTE: mark is local to a page. mark will be cleared at the page boundary. %again Move current position to the location marked by %mark. %system "command" Fork&exec the specified program. NOTE: the program will be invoked every time the page is redrawn. It sometimes annoy you. it needs some rework. Special translation for presentation-window-relative geometry: Argument that starts with "%" will be translated as if it was interpreted relative to presentation window. "xeyes -geometry %50x50+25+25" will be translated so that eyes appear on the center of the presentation window. The command has to be placed on a line alone. Do not use commas. Process will be killed when you leave the page. %system "command" Almost same as above. Process will be killed when you leave the specified . If you set to -1, the process will be killed when MagicPoint is terminated. (of course, you can terminate the child process alone by yourself) %filter "command" TEXT %endfilter Fork&exec the specified program, feed TEXT into that process from standard input. use the standard output from the process as presentation input. Do not forget to place %endfilter. The command has to be placed on a line alone. Do not use commas. %vfcap "filename" Specifies VFlib configuration filename. (allowed in ~/.mgprc, without "%" sign) %tfdir "dir" Specifies where to find TrueType font by default. (allowed in ~/.mgprc, without "%" sign) %deffont "fontname" Define a symbolic fontname, by using list-of-directives. The directive must appear in the preamble. For example, you may want to define a typewriter-like font as: %deffont "typewriter" xfont "courier", tfont "cour.ttf" By using the above definition, you can make your presentation file less dependent to the configuration of magicpoint binary. If the configuration allows the use of TrueType "cour.ttf" font, "tfont" directive will be effective. If there's no TrueType font available, or FreeType library is not compiled into the magicpoint binary you are currently using, "xfont" will be effective. "%font" cannot be used in "%deffont". this is for avoiding infinite loops. %font "fontname" Invoke the symbolic fontname defined by %deffont directive. %embed "filename" %endembed Embedded image support. uuencoded data fragment can be put between the directives. NOTE: this directive is not for human beings. use "mgpembed" command. %noop No operation %pcache :: enable or disable forward page cache 0 means disable forward page cache 1 means enable forward page cache :: cache mode 0 means caching is executed after 2seconds idle. 1 means caching is executed immediately. :: type of 'special effect' for the forward page cache (0-2) :: speed of 'special effect'. value 1 means the highest speed. %anim "filename" display animation file. (currently, only mng format is supported.) %charset "registry" Specify the encoding of the document. At this moment, the following charset are supported. iso8859-1 iso8859-2 iso8859-3 iso8859-4 %area [ ] Specify the drawing area within the window. All parameters are translated as relative value of the window. If offset is not specified, the drawing area will be put center. Note that all relative size specified in other directive after "%area" will be affected, i.e. it will be relative to the width/height of the drawing area instead of the window. %opaque :: transparency of the font. (0-100) Value 0 means that the font will be drawn with full tranparency. NOTE: To use this directive, you need to build mgp with Xft2. %setsup Initialize values for subsequent %sup (superscript) and %sub (subscript) commands. :: set superscript offset (percentage of font size) :: set superscript offset (percentage of font size) :: scale factor for super-/subscript font size The range of all three integer values goes from 10 to 100. When unset, the default value %setsup 40 15 60 is used. %sup Writes the immediately following line as superscript. Only works in connection with %cont. %sub Writes the immediately following line as subscript. Only works in connection with %cont. kit/TODO.jp010064400237450000000000000044660732074657600123000ustar nishidawheelTODOs $Id: TODO.jp,v 1.22 2001/07/05 02:14:22 itojun Exp $ mgp2ps - gif$B2hA|$r(Bsubroutine$B2=$7$F(Bps$B$r$A$$$5$/(B - image$B$GFI$s$@(Beps$B%U%!%$%k$N(Bzoom - $BJ}$rC5$9$Y$-!#(B === done, partially. - $BGX7J%0%i%G!<%7%g%s(B - /etc/magic (#!) - mgp2ps$B$G%+%i!<(Bps$B=PNO(B - $B2hA|(B($BFC$K(Beps)$B$N(Bcache - 2$BCM(Bbmp$B$r(Bforeground color$B$H(Bbackground color$B$GIA2h(B - bimage $B$r;HMQ$7$F$$$J$$>l9g$K(B xbm/bitmap $B$J$I$r(B fore/back $B$GI=<((B === done - pixmap, maskpix $B$rDIJ|$7$F!":BI87O$r@0M}$9$k(B - bimage $B$r;HMQ$7$F$$$J$$>l9g$N9bB.2=(B - transparent gif - back$B$H(Bbimage$B$NE}9g(B bimage$B$H(Bback$B$r=E$M$k$H(BVFlib$B$G=q$$$?(Bfont$B$N(Battribute$B$,$/$5$k(B bimage$B$b(Bpage_attribute$B$G;XDj$7$F(Bdraw$B$9$k$h$&$K$9$k$N$,NI$$(B - font$B4XO"$r(Bfont.c$B$KJ,$1$k!#(Bvflib$B$N%U%)%s%H$K%"%s%@!<%i%$%s!"$H$+!#(B - antialias - $BJ8;zI=<($N(Boptimization$B!#!V(Band$B$7$F(Bor$B$9$k!W$N$r0l7b$G$d$l$J$$$+(B? window$B$r=E$M$FIA2h$r$O$d$/(B($BF)L@$K$9$k$N$O$I$&$d$k$N(B?) - timebar - %include directive $B$N%5%]!<%H!#$3$N;~$N(B search path $B$NDj5A!#(B - $BI=<(Cf$K%/%j%C%/$7$?>l9g$NBP=h(B (skip$B$7$F(Bx event$B$r=hM}(B) - $BD9$$9T$N(B folding %leftfill - leftfill$B$N$H$-$N6XB'=hM}(B - leftfill$B$N$H$-$N1Q8l$N9TKv=hM}(B($B$;$a$FC18l$G6h@Z$j$?$$(B) - %system directive ($B30It%W%m%;%9$N8F$S=P$7(B) $B30It%W%m%;%9$N=PNO$r?)$($?$j!"(B< %filter) - $BMn=q%l%$%d(B/$B5!G=(B $B%Z%s$N?'$KBP$9$k9M;!$H$+I,MW(B? -> 5$B?'A*Br2D(B - reload (control-R) - freetype$B$ND>@\%5%]!<%H(B - gs-view.c$B$H$5$h$J$i(B kit/USAGE010064400237450000000000000234741015160035500117430ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% How to make .mgp files (cheat sheet) Kazu Yamamoto (with Chaki) March 14, 2001 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% All .mgp commands start with "%". After making sure that /usr/X11R6/lib/X11/mgp/default.mgp exists, add the following line to the beginning of the .mgp file. %include default.mgp This determines the default style. Each page begins with "%page". %page TITLE Body MagicPoint is line oriented. Don't write anything in the first line because the default style uses the first line for making space at the top of the screen. The second line is the title of the page. The third line is transformed into a horizontal line. The fourth line on becomes the body. When there is a "%" at the beginning of a line, the rest of the line becomes a command. Multiple commands separated by "," can be written in a single line. To make the size 7% of the screen and the foreground color yellow, one would write: %size 7, fore "yellow" This line is big and yellow. Any line that starts with "%" won't show up on the screen nor will it be counted as a line. The following parameters can be used to change how a line looks. text color %fore background color %back text size %size text placement %center, %leftfill, %rightfill space between characters %hgap space between lines %vgap Font %font There are a few others, but this should be enough for now. The parameters of default.mgp are set as follows: %default 1 leftfill, size 2, fore "white", back "black", font "thick" %default 2 size 7, vgap 10, prefix " " %default 3 size 2, bar "gray70", vgap 10 %default 4 size 5, fore "white", vgap 30, prefix " ", font "standard" %default set the parameters for the line specified in the first argument to the values specified the second and later argments. In the first line, the size is 2% and in the second line the size is set to 7%. Parameters set in previous lines are valid unless overwritten. Therefore, the text in the second line will be white. When MagicPoint shows a particular line, it first refers to the %tab, and then refers to the %default values. After that, it refers to the values set within the body. Values of the previous line remain valid unless set otherwise. Let's take a look at the following example: %page (A space of 2%) TITLE --- size 7% color white and in thick font (A horizontal line) text --- size 5% white thick font %fore yellow, size 4 text --- size 4% yellow thick font %vfont min text --- size 4% yellow standard font %tab is a command that directly associates with the line. In default.mgp it is set as follows: %tab 1 size 5, vgap 40, prefix " ", icon box green 50 %tab 2 size 4, vgap 40, prefix " ", icon arc yellow 50 %tab 3 size 3, vgap 40, prefix " ", icon delta3 white 40 When there is a singular tab at the head of the line, the values of %tab become valid. When there are two tabs at the head of the line, %tab 2 becomes valid, when there are three tabs at the head of the line %tab 3 becomes valid and so on. In other words, 1 tab means text size 5% and the line starts with spaces and green box icon. 2 tabs mean text size 4% and the line starts with spaces and yellow arc icon. 3 tabs mean text size 3% and the line starts with spaces and white delta icon. By using this, it's easy to itemize. Let's take a look at an example: %page Emacs and friends Emacs 20.7 is currently the main stream 21 is coming Mule 2.3 is most used Integrated to Emacs and XEmacs XEmacs 21.1 is most used 21.2 is coming To find out more about the other commands, take a look at SYNTAX or sample/*.mgp. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Life with tgif %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MagicPoint cannot display "tgif" objs but there is a way to sort of get around this. (1) If you cannot use "ghostscript": - make "tgif" create a GIF file for screen display - make "tgif" create an EPS file for printing out (2) If you have "ghostscript": - craete an EPS file from a "tgif" obj file and use that for both cases %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (1) If you cannot use "ghostscript": The image created by "tgif" is displayed "as is" on MagicPoint's screen. This is pretty sad when fonts aren't displayed clearly when viewing with "tgif". Either Mincho or Gothic font is provided for 14, 16, 24, and 26 dot. So it's possible to give "xrdb" something like the following, and then make "tgif" create a GIF file. %%%% Tgif*Background: black Tgif*Foreground: white Tgif.WhereToPrint: GIF Tgif.XpmToGif: xpmtoppm %s | ppmtogif -transparent black Tgif.FontSizes: 8 10 12 14 16 18 20 24 26 32 40 48 64 Tgif.PreeditType: overthespot Tgif.InitialPrintInColor: false %%%% EPS files can be created just by typing: tgif -print -eps *.obj This is convenient when you have a whole lot of files. However, some files might not get the right colors using this way. If you find any files that don't have the right colors, try manually creating the EPS file using "tgif". If corresponding filename.eps exists for filename.{gif,jpg,...}, "mgp2ps" uses filename.eps when creating a PS file. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (2) If you can "ghostscript": Generate an EPS file, again by using tgif -print -eps *.obj command. Paste the EPS file into your presentation by adding %image "foobar.eps" then, mgp will render the EPS file on-the-fly, by invoking "ghostscript". "mgp2ps" will properly include the EPS file into the output. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (3) Distributing presentation materials If you want to bundle two pages into one, you could try this: pstops '2:0R@.6(1.5cm,28cm)+1R@.6(1.5cm,13.85cm)' input.ps > output.ps If you want to bundle six pages into one, you could try this: pstops '6:0R@.33(0.5cm,26cm)+1R@.33(10.5cm,26cm)+2R@.33(0.5cm,18cm)+3R@.33(10.5cm,18cm)+4R@.33(0.5cm,10cm)+5R@.33(10.5cm,10cm)' input.ps > output.ps "pstops" is included the "psutils" package(ftp://ftp.dcs.ed.ac.uk/pub/ajcd). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Tips for better presentation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (1) Refrain from using "vfont", "xfont" and "tfont" directive directly. Use "deffont" in preamble and "font" in body instead. This should allow people to view your presentation in all the configuration of the renderer. (i.e. with/without FreeType, with/without VFlib) (2) Use EPS files for vector image. (3)Install the latest "ghostscript". Configure so that it can generate grayscaled image as output. (4) Before the actual presentation, go through the presentation in the same configuration as "the real thing". It will make rendering faster. (For the included EPS images, pixel image will be generated and be cached). If you execute "mgp" with the "-F" option, "mgp" fetches and caches the next page so that it makes faster to visualize the next page. (5) Check/practice the connection with the VGA projector. (6) Practice your oral presentation well :-) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Mathematical Formulas %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% There are, at least, three way to include mathematical formulas in .mgp file. (1) TeX - Obtain .dvi file for the expression with TeX. e.g. the following code would do: \documentstyle{article} \pagestyle{empty} \thispagestyle{empty} \begin{document} ...formula... \end{document} - With dvips you can obtain .eps file for the dvi. e.g. latex foo.tex ; dvips -f -E foo.dvi > foo.eps - Include .eps file into your presentation as follows: %image "foo.eps" 0 width height (2) "eqn"/"troff" - Obtain .ps file for the expression with "eqn"/"troff". - Convert .ps file to .eps file. (e.g. "pstoepsi") - Include .eps file into your presentation as follows: %image "foo.eps" (3) Bitmap (not recommended) - Obtain .ps file for the expression with TeX or "eqn"/"troff". - Convert .ps file to .pnm file.(e.g. "pstopnm") - Convert .pnm file to .pbm file (e.g. "pnmcrop") - Include .pbm file into your presentation as follows: %image "foo.pbm" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Pasting foils onto the web %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% If you wish to paste your MagicPoint presentation, you have three options. (1) If you can assume that the client-side has MagicPoint, you can paste a presentation file after processing that by "mgpembed" program. (1.1) Merge images into presentation file, by using "mgpembed". "mgpembed" generates single archive-like presentation file, which includes images (encoded by "uuencode"). (1.2) Paste the generated file onto the web, under name "foo.mgp". Client side (Browser) needs to be configured as follows: Define "helper application" for extention ".mgp" as, mgp -g 400x300 -S You can specify any screeen size as you want. Here, -S is REALLY important for security, since MagicPoint presentation can include arbitrary shell command. -S option disables invocation of any external process from MagicPoint. If you need to configure content-type for ".mgp", use "application/x-magicpoint". I believe "text/plain" would be a last resort. (2) If you cannot asuume that there's no MagicPoint at the client's site, you'll need to convert presentation into a html file. Use the -D option for this. (3) You may convert your presentation as postscript file, after processing it with "mgp2ps". It would be nice if you would like nobody to reuse your work at ease. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% kit/USAGE.jp010064400237450000000000000316450767331122500123640ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .mgp $B%U%!%$%k$N$$$$2C8:$J=q$-J}(B $B;3K\OBI'(B 2001$BG/(B3$B7n(B14$BF|(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .mgp $B%U%!%$%k$N%3%^%s%I(B(directive) $B$O(B "%" $B$G;O$^$j$^$9!#$H$j$"$($:!"(B /usr/X11R6/lib/X11/mgp/default.mgp $B$,$"$k$3$H$r3NG'$7$?$i!"(B.mgp $B%U%!%$(B $B%k$N:G=i$K0J2<$N9T$rF~$l$F2<$5$$!#(B %include default.mgp $B$3$l$G3F%Z!<%8$N%G%U%)%k%H$N%9%?%$%k$,@_Dj$5$l$^$9!#3F%Z!<%8$O!"(B%page $B$G$O$8$a$^$9!#(B %page $B$3$3$,%?%$%H%k(B $B$3$3$+$iK\J8(B MagicPoint $B$O9T;X8~$G$9!#%G%U%)%k%H$N%9%?%$%k$G$O!"(B1 $B9TL\$r2hLL>e$NM>(B $BGr$K;H$$$^$9$N$G!"2?$b=q$+$J$$$G2<$5$$!#(B2 $B9TL\$,%?%$%H%k$G$9!#(B3 $B9TL\$O!"(B $B2#K@$K2=$1$^$9!#(B4 $B9TL\$+$iK\J8$G$9!#(B $B9TF,$K(B % $B$r=q$/$H!"0J9_$,%3%^%s%I$K$J$j$^$9!#%3%^%s%I$O(B "," $B6h@Z$C$FNs(B $B5s$G$-$^$9!#Bg$-$5$r2hLL$N(B 7 $B!s!"?'$r2+?'$K$9$k$K$O0J2<$N$h$&$K$7$^$9!#(B %size 7, fore "yellow" $B$3$N9T$OBg$-$/$F2+?'$G$9!#(B $B9TF,$K$,(B % $B$N9T$O!"EvA3I=<($5$l$^$;$s$7!"9T$H$7$F%+%&%s%H$5$l$^$;$s!#(B $B?'$dBg$-$5$J$I$N9T$NB0@-$O!"0J2<$N$b$N$,MQ0U$5$l$F$$$^$9!#(B $BJ8;z$N?'(B %fore $BGX7J$N?'(B %back $BJ8;z$NBg$-$5(B %size $BJ8;z$N0LCV(B %center, %leftfill, %rightfill $BJ8;z4V(B %hgap $B9T4V(B %vgap $B%U%)%s%H(B %font $B$^$@B>$K$b$"$j$^$9$,!"$H$j$"$($:$3$N$/$i$$$G$$$$$G$7$g$&!#$A$J$_$K!"(B default.mgp $B$G$O0J2<$N$h$&$KDj5A$5$l$F$$$^$9!#(B %default 1 leftfill, size 2, fore "white", back "black", font "thick" %default 2 size 7, vgap 10, prefix " " %default 3 size 2, bar "gray70", vgap 10 %default 4 size 5, fore "white", vgap 30, prefix " ", font "standard" %default $B$OBh(B 1 $B0z?t$G;XDj$5$l$?9T$NB0@-$K!"Bh(B 2 $B0z?t0J9_$NCM$r%;%C%H(B $B$7$^$9!#(B1 $B9TL\$O!"%5%$%:$,(B 2$B!s!"(B2 $B9TL\$O(B 7 $B!s$G$9$M!#e=q$-$7$J$$8B$jA0$N9T$N@_Dj$OM-8z$G$9!#$G$9$+$i!"(B2 $B9TL\$NJ8;z$N?'$OGr(B $B$K$J$j$^$9!#(B MagicPoint $B$O$"$k9T$rI=<($9$k:]$K!"$^$:$=$N9T$N(B %default $B$N@_Dj$rH?1G(B $B$7$^$9!#Gr(B) $BBg$-$5(B 7 $B!s$GGr?'$GB@;z$N%?%$%H%k(B ($B2#K@(B) $BBg$-$5(B 5 $B!s(B $B$GGr?'$GB@;z$NJ8;z(B %fore yellow, size 4 $BBg$-$5(B 4 $B!s(B $B$G2+?'$GB@;z$NJ8;z(B %font standard $BBg$-$5(B 4 $B!s(B $B$G2+?'$GI8=`$NJ8;z(B $B$"$H!"9T$HD>9T$9$kL?Na$K(B %tab $B$,$"$j$^$9!#(Bdefault.mgp $B$G$O0J2<$N$h$&$K(B $BDj5A$5$l$F$$$^$9!#(B %tab 1 size 5, vgap 40, prefix " ", icon box green 50 %tab 2 size 4, vgap 40, prefix " ", icon arc yellow 50 %tab 3 size 3, vgap 40, prefix " ", icon delta3 white 40 $B9TF,$K(B 1 $B$D%?%V$,$"$k$H(B %tab 1 $B$N@_Dj$,M-8z$K$J$j$^$9!#(B2 $B$D$"$k$H(B %tab 2$B!"(B3 $B$D$"$k$H(B %tab 2 $B$,!"8=:_$NB0@-$K>e=q$-$5$l$^$9!#(B $B$D$^$j!"(B $B%?%V(B 1 $B$D$GBg$-$5$,(B 5 $B!s!"F,$K6uGr$HNPH"%"%$%3%s(B $B%?%V(B 2 $B$D$GBg$-$5$,(B 4 $B!s!"F,$K6uGr$H2+4]%"%$%3%s(B $B%?%V(B 3 $B$D$GBg$-$5$,(B 3 $B!s!"F,$K6uGr$HGr;03Q%"%$%3%s(B $B$H$J$j$^$9!#(B $B$3$N5!G=$r;H$&$H!"(Bitemize $B$r4JC1$K=q$+$1$^$9!#Nc$r8+$F$_$^$7$g$&!#(B %page Emacs $B$N$J$+$^$?$A(B Emacs $B8=:_$O(B 20.7 $B$,$N%3%^%s%I$KIU$$$F$O!"(BSYNTAX $B$r8+$?$j!"(Bsample/*.mgp $B$r8+$?$j$7$F2<$5(B $B$$!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tgif $B$H$N@83h(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MagicPoint $B$O(B tgif $B$N(B .obj $B%U%!%$%k$rD>@\I=<($G$-$J$$$1$l$I!"9,$;$K$J(B $B$l$kJ}K!$O$"$j$^$9!#(B (1) $B2hLLI=<($K(B ghostscript $B$rMxMQ$7$J$$$J$i(B - $B2hLLI=<($K$O(B tgif $B$,EG$$$?(B GIF $B$r;H$&(B - $B0u:~$K$O(B tgif $B$,EG$$$?(B EPS $B$r;H$&(B (2) $B2hLLI=<($K(B ghostscript $B$rMxMQ$9$k$J$i(B - $B2hLLI=<((B/$B0u:~6&$K(B tgif $B$,EG$$$?(B EPS $B$r;H$&(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (1) GIF and EPS tgif $B$GI=<($5$l$?%$%a!<%8$,$=$N$^$^!"(Bmgp $B$N2hLL$KI=<($5$l$^$9!#$@$+$i!"(B $B%U%)%s%H$,(B tgif $B$G$-$l$$$KI=<($5$l$F$$$J$$$HHa$7$$$G$9!#$H$j$"$($:!"(B14$B!"(B 16$B!"(B24$B!"(B26 $B%I%C%H$N%U%)%s%H$O!"L@D+$+%4%7%C%/$I$A$i$+$,$"$j$^$9!#$=$3(B $B$G!"0J2<$N$h$&$J%U%!%$%k$r(B xrdb $B$K?)$o$;$F!"(Btgif $B$r>e$2!"(BGIF $B$rEG$+$;(B $B$k$H$$$$$G$7$g$&!#(B %%%% Tgif*Background: black Tgif*Foreground: white Tgif.WhereToPrint: GIF Tgif.XpmToGif: xpmtoppm %s | ppmtogif -transparent black Tgif.FontSizes: 8 10 12 14 16 18 20 24 26 32 40 48 64 !Tgif.DoubleByteInputMethod: xim Tgif.PreeditType: overthespot Tgif.SquareDoubleByteFonts: \n\ -*-fixed-medium-r-*--%d-*-*-*-*-*-jisx0208.1983-*,H,Ryumin-Light-EUC-H \n\ -*-fixed-medium-r-*--%d-*-*-*-*-*-jisx0208.1983-*,H,Ryumin-Light-EUC-H \n\ -*-fixed-medium-r-*--%d-*-*-*-*-*-jisx0208.1983-*,H,Ryumin-Light-EUC-H \n\ -*-fixed-medium-r-*--%d-*-*-*-*-*-jisx0208.1983-*,H,Ryumin-Light-EUC-H \n\ \n\ -*-fixed-medium-r-*--%d-*-*-*-*-*-jisx0208.1983-*,V,Ryumin-Light-EUC-V \n\ -*-fixed-medium-r-*--%d-*-*-*-*-*-jisx0208.1983-*,V,Ryumin-Light-EUC-V \n\ -*-fixed-medium-r-*--%d-*-*-*-*-*-jisx0208.1983-*,V,Ryumin-Light-EUC-V \n\ -*-fixed-medium-r-*--%d-*-*-*-*-*-jisx0208.1983-*,V,Ryumin-Light-EUC-V \n\ \n\ -*-fixed-bold-r-*--%d-*-*-*-*-*-jisx0208.1983-*,H,GothicBBB-Medium-EUC-H \n\ -*-fixed-bold-r-*--%d-*-*-*-*-*-jisx0208.1983-*,H,GothicBBB-Medium-EUC-H \n\ -*-fixed-bold-r-*--%d-*-*-*-*-*-jisx0208.1983-*,H,GothicBBB-Medium-EUC-H \n\ -*-fixed-bold-r-*--%d-*-*-*-*-*-jisx0208.1983-*,H,GothicBBB-Medium-EUC-H \n\ \n\ -*-fixed-bold-r-*--%d-*-*-*-*-*-jisx0208.1983-*,V,GothicBBB-Medium-EUC-V \n\ -*-fixed-bold-r-*--%d-*-*-*-*-*-jisx0208.1983-*,V,GothicBBB-Medium-EUC-V \n\ -*-fixed-bold-r-*--%d-*-*-*-*-*-jisx0208.1983-*,V,GothicBBB-Medium-EUC-V \n\ -*-fixed-bold-r-*--%d-*-*-*-*-*-jisx0208.1983-*,V,GothicBBB-Medium-EUC-V Tgif.RyuminShowFontChar: \314\300 Tgif.GothicBBBShowFontChar: \245\264 Tgif.InitialPrintInColor: false %%%% EPS $B$O!"(B tgif -print -eps *.obj $B$H$d$l$P:n$l$^$9!#%U%!%$%k$,$?$/$5$s$"$k$H$-$KJXMx!#(B $B$?$@$7!"$3$NJ}K!$@$H?'$r4V0c$&2DG=@-$,$"$k$N$G!"4V0c$C$?%U%!%$%k$O!"(B tgif $B$r>e$2$F%^%K%e%"%kA`:n$G(B EPS $B$rEG$+$;$^$7$g$&!#(B mgp2ps $B$O!"(Bfilename.{gif,jpg,...} $B$KBP$7!"(Bfilename.eps $B$,$"$l$P$=$A$i(B $B$rFI$_9~$s$G(B PS $B$r:n$j$^$9!#$"$"!"$J$s$FJXMx!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (2) EPS only EPS $B$r$D$/$j$^$9!#7+$jJV$7$K$J$j$^$9$,!"(B tgif -print -eps *.obj $B$H$d$l$P:n$l$^$9!#(B .mgp $B%U%!%$%k$NCf$G!"(B %image "foo.eps" $B$H$9$l$P!"%W%l%<%s$N:]$K$O(B mgp $B$NCf$+$i(B ghostscript $B$,8F$S=P$5$l!"(BEPS $B%U%!%$%k$NCf?H$,2hLL>e$KIA2h$5$l$^$9!#(B $B0u:~$9$k>l9g$O!"(B(1) $B$HF1MM$K(B mgp2ps $B$rMxMQ$7$F2<$5$$!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (3) $B;qNA$NG[I[(B 2 $B$D$N%Z!<%8$r(B 1 $B$D$K$^$H$a$k$K$O!"(B pstops '2:0R@.6(1.5cm,28cm)+1R@.6(1.5cm,13.85cm)' input.ps > output.ps 6 $B$D$N%Z!<%8$r(B 1 $B$D$K$^$H$a$k$K$O!"(B pstops '6:0R@.33(0.5cm,26cm)+1R@.33(10.5cm,26cm)+2R@.33(0.5cm,18cm)+3R@.33(10.5cm,18cm)+4R@.33(0.5cm,10cm)+5R@.33(10.5cm,10cm)' input.ps > output.ps $B$H'$($l$P$$$$$G$7$g$&!#(B\^^/ pstops $B$O(B psutils (ftp://ftp.dcs.ed.ac.uk/pub/ajcd) $B$KF~$C$F$$$^$9!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $B>e@\;H$&$N$OHr$1$^$7$g$&!#@k8@(B $BNN0h$G(B"deffont"$B$7$F!"K\J8Cf$G$O(B"font"$B$r;H$$$^$7$g$&!#$3$&$9$k$H!"(B MagicPoint$B$N%U%)%s%HE83+%(%s%8%s$K0MB8$7$J$$(B .mgp $B%U%!%$%k$r:n@.$G(B $B$-$^$9!#(B (2) $B%Y%/%H%k2hA|$K$O6KNO(B EPS $B%U%!%$%k$r;H$$$^$7$g$&!#(B (3) $B%0%l%$%9%1!<%k2hA|$r=PNO$G$-$k(B ghostscript $B$r%$%s%9%H!<%k$7$^$7$g(B $B$&!#(B (4) $BK\HV$N%W%l%<%sA0$K!"0lEYK\HV$HF1$8@_Dj$G%W%l%<%s$rI=<($7$F$*$/$H!"(B EPS $B%U%!%$%k$,E83+$5$l$F%-%c%C%7%e$5$l$^$9$N$GK\HV$G$N2hA|I=<($,B.(B $B$/$J$j$^$9!#(BMagicPoint $B$K(B -F $B$r;XDj$9$k$H!"l=j$Kl=j$Kl9g!"(B3$B$D$NJ}K!$,(B $B$"$j$^$9!#(B (1) $B%/%i%$%"%s%HB&$K(B MagicPoint $B$,$"$k$H2>Dj$G$-$k>l9g$K$O!"(Bmgpembed $B$G:n@.$7$?%U%!%$%k$r$=$N$^$^(B Web $B%5!<%P$GDs6!$9$l$P(B OK $B$G$9!#(B (1.1) mgpembed $B%3%^%s%I$r;H$C$F!"2hA|%U%!%$%k$r(B .mgp $B%U%!%$%kCf$KKd$a(B $B9~$_$^$9!#7k2L$H$7$FC10l$N%U%!%$%k$,$G$-$"$,$j$^$9!#(B (1.2) $B$G$-$"$,$C$?%U%!%$%k$N3HD%;R$r(B .mgp $B$K$7$F(B Web $B%5!<%P$KCV$-$^$9!#(B $B%/%i%$%"%s%HB&$O!"(B".mgp" $B$H$$$&3HD%;R$KBP$9$k30It%"%W%j%1!<%7%g%s$H$7(B $B$F!"(B mgp -g 400x300 -S $B$r;XDj$7$^$9(B($B2hLL%5%$%:$O$J$s$G$b$+$^$$$^$;$s(B)$B!#(B-S$B$r$D$1$k$N$O%;%-%e%j(B $B%F%#>e=EMW$G$9!#(BMagicPoint$B$N%W%l%<%s%U%!%$%k$OG$0U$N%7%'%k!&%3%^%s%I$r(B $B4^$`$3$H$,$G$-$^$9$N$G!"0-0U$N%W%l%<%s%U%!%$%k$r$&$+$D$Kl9g!"(B "Application/X-MagicPoint" $B$r;H$C(B $B$F$/$@$5$$!#(B (2) $BG$0U$N%/%i%$%"%s%H$G8+$?$$>l9g!"3F2hLL$N%@%s%W$r(B GIF $B$KMn$7!"$=$l(B $B$>$l$N(B GIF $B%U%!%$%k$r(B HTML $B$+$i(B "IMG" $B$G;2>H$7$^$9!#(BMagicPoint $B$O(B $B$3$N$h$&$J%F%s%W%l!<%H$r4JC1$K:n@.$7$F$/$l$^$9!#(Bmgp -D $B$rMxMQ$7$F(B $B2<$5$$!#(B (3) $B%W%l%<%s%U%!%$%k$r(B PS $B%U%!%$%k$KJQ49$7$F$+$iE=$k$N$b$$$$$+$b$7$l$^(B $B$;$s!#$3$N>l9g(B mgp2ps $B$G:n@.$7$?(B PS $B%U%!%$%k$r(B Web $B%5!<%P$KCV$/$3(B $B$H$K$J$j$^$9!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% kit/background.c010064400237450000000000000245760706040604500134500ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: background.c,v 1.14 2000/03/05 07:26:29 nishida Exp $ */ #include #include "mgp.h" /* background gradation */ #define G_PI 3.1415926535897932385 #define G_PI2 1.5707963267948966192 static void draw_gradation0 __P((int, int, int, int, int, int, byte *, byte *, int, int, u_int)); static void g_rotate __P((byte *, struct ctrl_grad *, int, int)); /* * generate gradation for single color plane. * x: color plane * y: axis for gradation * z: extra axis */ static void draw_gradation0(x1, x2, y1, y2, z1, z2, p1, p2, dpy, dpz, mask) int x1, x2; int y1, y2; int z1, z2; byte *p1, *p2; int dpy, dpz; /* delta of p in x/y's direction */ u_int mask; { int s, step; int dx, dy; int z; byte *p; dx = abs(x2 - x1); dy = abs(y2 - y1); if (dx > dy) { if (x1 > x2) { step = (y1 > y2) ? 1 : -1; s = x1; x1 = x2; x2 = s; /*swap*/ y1 = y2; p = p2; } else { step = (y1 < y2) ? 1 : -1; p = p1; } for (z = z1; z < z2; z++) *(p + z * dpz) = x1 & mask; s = dx >> 1; while (++x1 <= x2) { if ((s -= dy) < 0) { s += dx; y1 += step; p += (dpy * step); } #ifdef DITHERED_BGRAD for (z = z1; z < z2; z+=3){ *(p + z * dpz) = x1 * (30 + (y1 % 3)) / 32 & mask; *(p + (z+1) * dpz) = x1 * (30 + ((y1 + 2) % 3)) / 32 & mask; *(p + (z+2) * dpz) = x1 * (30 + ((y1 + 1) % 3)) / 32 & mask; } #else for (z = z1; z < z2; z++) *(p + z * dpz) = x1 & mask; #endif } } else { if (y1 > y2) { step = (x1 > x2) ? 1 : -1; s = y1; y1 = y2; y2 = s; /*swap*/ x1 = x2; p = p2; } else { step = (x1 < x2) ? 1 : -1; p = p1; } for (z = z1; z < z2; z++) *(p + z * dpz) = x1 & mask; s = dy >> 1; while (++y1 <= y2) { p += dpy; /*y always inc*/ if ((s -= dx) < 0) { s += dy; x1 += step; } #ifdef DITHERED_BGRAD for (z = z1; z < z2; z+=3){ *(p + z * dpz) = x1 * (30 + (y1 % 3)) / 32 & mask; *(p + (z+1) * dpz) = x1 * (30 + ((y1 + 2) % 3)) / 32 & mask; *(p + (z+2) * dpz) = x1 * (30 + ((y1 + 1) % 3)) / 32 & mask; } #else for (z = z1; z < z2; z++) *(p + z * dpz) = x1 & mask; #endif } } } byte * draw_gradation(width, height, cg) int width; int height; struct ctrl_grad *cg; { int bmask[8] = { 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; byte *pic; const u_int bits = 8; int i, j; int x1 = 0, x2 = 0; int y1 = 0, y2 = 0, dpy = 0; int z1 = 0, z2 = 0, dpz = 0; byte *p1 = NULL, *p2 = NULL; byte mask; pic = (byte *)malloc(width * height * 3 * sizeof(byte)); if (!pic) { fprintf(stderr,"couldn't alloc space for gradation image\n"); return NULL; } memset(pic, 0, width * height * 3 * sizeof(byte)); if (cg->ct_direction % 90) { g_rotate(pic, cg, width, height); return pic; } for (j = 0; j < 3; j++) { /*r, g, b*/ for (i = 0; i < cg->ct_g_colors - 1; i++) { switch (j) { case 0: x1 = cg->colors[i]->r; x2 = cg->colors[i + 1]->r; break; case 1: x1 = cg->colors[i]->g; x2 = cg->colors[i + 1]->g; break; case 2: x1 = cg->colors[i]->b; x2 = cg->colors[i + 1]->b; break; } mask = bmask[bits - 1]; switch (cg->ct_direction) { case 0: y1 = ((height - 1) * i) / (cg->ct_g_colors - 1); y2 = ((height - 1) * (i + 1)) / (cg->ct_g_colors - 1); p1 = pic + j + width * 3 * y1; p2 = pic + j + width * 3 * y2; z1 = 0; z2 = width; dpy = width * 3; dpz = 3; break; case 90: y1 = ((width - 1) * i) / (cg->ct_g_colors - 1); y2 = ((width - 1) * (i + 1)) / (cg->ct_g_colors - 1); p1 = pic + j + 3 * y1; p2 = pic + j + 3 * y2; z1 = 0; z2 = height; dpy = 3; dpz = width * 3; break; case 180: y1 = ((height - 1) * (cg->ct_g_colors - i - 1)) / (cg->ct_g_colors - 1); y2 = ((height - 1) * (cg->ct_g_colors - i - 2)) / (cg->ct_g_colors - 1); p1 = pic + j + width * 3 * y1; p2 = pic + j + width * 3 * y2; z1 = 0; z2 = width; dpy = width * 3; dpz = 3; break; case 270: y1 = ((width - 1) * (cg->ct_g_colors - i - 1)) / (cg->ct_g_colors - 1); y2 = ((width - 1) * (cg->ct_g_colors - i - 2)) / (cg->ct_g_colors - 1); p1 = pic + j + 3 * y1; p2 = pic + j + 3 * y2; z1 = 0; z2 = height; dpy = 3; dpz = width * 3; break; } draw_gradation0(x1, x2, y1, y2, z1, z2, p1, p2, dpy, dpz, mask); } } return pic; } static double cost, sint; static double cos2t, sin2t; static double dcost, dsint; /* rotate graphic */ static void g_rotate(pic, cg, width, height) byte *pic; struct ctrl_grad * cg; int width, height; { byte *pp; double maxd, mind, del, d, rat, crat, cval; double theta, dy, ey, td1, td2; int x, y, cx, cy, r, g, b, bc, nc1; int rot, mode; struct g_color * c1; struct g_color * c2; rot = cg->ct_direction; mode = cg->ct_mode; cx = width/2; cy = height/2; theta = (double) rot * G_PI / 180.0; cost = cos(theta); sint = sin(theta); dsint = sint*sint; dcost = cost*cost; sin2t = sin(2*theta); cos2t = cos(2*theta); nc1 = cg->ct_g_colors - 1; /* compute max/min distances */ if (rot > 0 && rot < 90) { mind = cdist(0, 0, cx, cy, rot, mode); maxd = cdist(width-1, height-1, cx, cy, rot, mode); } else if (rot >= 90 && rot < 180) { mind = cdist(0, height-1, cx, cy, rot, mode); maxd = cdist(width-1, 0, cx, cy, rot, mode); } else if (rot >= 180 && rot < 270) { mind = cdist(width-1, height-1, cx, cy, rot, mode); maxd = cdist(0, 0, cx, cy, rot, mode); } else { mind = cdist(width-1, 0, cx, cy, rot, mode); maxd = cdist(0, height-1, cx, cy, rot, mode); } del = maxd - mind; /* maximum distance */ /* loop start */ td1 = cx - cx*dcost; td2 = cy + 0.5*cx*sin2t; for (y = 0; y < height; y++) { pp = pic + (y * width * 3); dy = (cy-y)*0.5*sin2t + td1; ey = (y-cy)*dsint + td2; for (x = 0; x < width; x++) { d = lcdist(x, y, cx, cy, rot, mode, dy, ey); rat = (d - mind) / del; if (rat < 0.0){ cval = bc = crat = 0.0; } else if (rat > 1.0){ cval = bc = (double)nc1; crat = 0.0; } else { cval = rat * nc1; bc = floor(cval); crat = cval - bc; } if (bc < nc1) { c1 = (cg->colors)[bc]; c2 = (cg->colors)[bc+1]; r = c1->r + crat * ((c2->r) - (c1->r)); g = c1->g + crat * ((c2->g) - (c1->g)); b = c1->b + crat * ((c2->b) - (c1->b)); } else { c1 = (cg->colors)[nc1]; r = c1->r; g = c1->g; b = c1->b; } *pp++ = (byte) r; *pp++ = (byte) g; *pp++ = (byte) b; } } } /* compute distance */ double cdist(x, y, cx, cy, rot, mode) int x, y, cx, cy, rot, mode; { double x1, y1, x2, y2, x3, d ; /* special case */ if (rot == 0) return (double) (y - cy); if (rot == 90) return (double) (x - cx); if (rot == 180) return (double) (cy - y); if (rot == 270) return (double) (cx - x); /* experimental routine for circle patern gradation */ if (mode == 1) { d = sqrt((y-cy)*(y-cy)*cost + (x-cx)*(x-cx)*sint); if (x + y - cy < 0) d = -d; return d; } /* x1,y1 = original point */ x1 = (double) x; y1 = (double) y; x2 = cx + (cy-y1)*0.5*sin2t - (cx-x1)*dcost; y2 = cy - (cy-y1)*dsint + (cx-x1)*0.5*sin2t; x3 = x1-x2; d = sqrt(x3*x3 + (y1 - y2)*(y1 - y2)); if ((rot < 180 && x3<0) || (rot > 180 && x3>0)) d = -d; return d; } double lcdist(x, y, cx, cy, rot, mode, dy, ey) int x, y, cx, cy, rot, mode; double dy,ey; { double x1, y1, x2, y2, x3, d ; /* special case */ if (rot == 0) return (double) (y - cy); if (rot == 90) return (double) (x - cx); if (rot == 180) return (double) (cy - y); if (rot == 270) return (double) (cx - x); /* experimental routine for circle patern gradation */ if (mode == 1) { d = sqrt((y-cy)*(y-cy)*cost + (x-cx)*(x-cx)*sint); if (x + y - cy < 0) d = -d; return d; } x1 = (double) x; y1 = (double) y; x2 = dy + x1*dcost; y2 = ey - x1*0.5*sin2t; x3 = x1-x2; d = sqrt(x3*x3 + (y1 - y2)*(y1 - y2)); if ((rot < 180 && x3<0) || (rot > 180 && x3>0)) d = -d; return d; } Image * make_XImage(pic, width, height) byte *pic; unsigned int width, height; { Image *image; int size; #if USE_COLOR_DEPTH byte *destptr; unsigned int y, maxval; #endif size= height * width * 3; /* make Image structure (stolen from image/new.c)*/ image= (Image *)lmalloc(sizeof(Image)); image->type= ITRUE; image->title= strdup(""); image->rgb.used= image->rgb.size= 0; image->width= width; image->height= height; image->depth= 24; image->pixlen= 3; image->data= pic; #if USE_COLOR_DEPTH #define PM_SCALE(a, b, c) (long)((a) * (c))/(b) /* color depth (future use) */ maxval = 0xff; destptr= image->data; for (y= 0; y < size; y++) { *destptr= PM_SCALE(*destptr, maxval, 0xff); destptr++; } #endif return(image); } kit/config.guess010075500237450000000000001251331010174522300134660ustar nishidawheel#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2004-06-11' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amd64:OpenBSD:*:*) echo x86_64-unknown-openbsd${UNAME_RELEASE} exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; cats:OpenBSD:*:*) echo arm-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; luna88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit 0 ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha*:OpenVMS:*:*) echo alpha-hp-vms exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; *:OS400:*:*) echo powerpc-ibm-os400 exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) # Determine whether the default compiler uses glibc. eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #if __GLIBC__ >= 2 LIBC=gnu #else LIBC= #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` # GNU/KFreeBSD systems have a "k" prefix to indicate we are using # FreeBSD's kernel, but not the complete OS. case ${LIBC} in gnu) kernel_only='k' ;; esac echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) case `uname -p` in *86) UNAME_PROCESSOR=i686 ;; powerpc) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: kit/config.sub010075500237450000000000000746701010174522300131420ustar nishidawheel#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2004-03-12' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | msp430-* \ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nv1) basic_machine=nv1-cray os=-unicosmp ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: kit/configure010075500237450000000000007170401114577676700131130ustar nishidawheel#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="image/imagetypes.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias SET_MAKE build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP AWK YACC YFLAGS LEX LEX_OUTPUT_ROOT LEXLIB mgp_cv_path_perl mgp_cv_path_uuencode mgp_cv_path_gzip mgp_cv_path_uudecode mgp_cv_path_gunzip OPTFLAGS DEPLIBS GREP EGREP LIBOBJS mgp_cv_vflib_a XMKMF USE_IMLIB HAVE_M17NLIB mgp_keywords LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP YACC YFLAGS XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug compile debugging information in. --enable-locale perform setlocale() on invocation. --disable-freetype DON'T use freetype1 routines. --disable-vflib DON'T use vflib routines. --enable-freetype-charset16 use freetype for chaset16. --disable-xft2 DON'T use xft2 libraries. --enable-gif compile gif support in (need libungif). --enable-imlib use imlib2 exclusively to load images. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-searchpath=PATH additional path for searching includes & libaries. --with-vfontcap=PATH use PATH as vfontcap --with-x use the X Window System --with-m17n-lib use the m17n library Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor YACC The `Yet Another C Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6; } if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 echo "$as_me: error: invalid value of canonical build" >&2;} { (exit 1); exit 1; }; };; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6; } if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 echo "$as_me: error: invalid value of canonical host" >&2;} { (exit 1); exit 1; }; };; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } if test -z "$ac_file"; then echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$AWK" && break done for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_YACC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_YACC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { echo "$as_me:$LINENO: result: $YACC" >&5 echo "${ECHO_T}$YACC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_LEX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LEX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { echo "$as_me:$LINENO: result: $LEX" >&5 echo "${ECHO_T}$LEX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { yyless (input () != 0); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { (ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: checking lex output file root" >&5 echo $ECHO_N "checking lex output file root... $ECHO_C" >&6; } if test "${ac_cv_prog_lex_root+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else { { echo "$as_me:$LINENO: error: cannot find output from $LEX; giving up" >&5 echo "$as_me: error: cannot find output from $LEX; giving up" >&2;} { (exit 1); exit 1; }; } fi fi { echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5 echo "${ECHO_T}$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { echo "$as_me:$LINENO: checking lex library" >&5 echo $ECHO_N "checking lex library... $ECHO_C" >&6; } if test "${ac_cv_lib_lex+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat >conftest.$ac_ext <<_ACEOF `cat $LEX_OUTPUT_ROOT.c` _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_lex=$ac_lib else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_lex" >&5 echo "${ECHO_T}$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5 echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6; } if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat >conftest.$ac_ext <<_ACEOF #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_prog_lex_yytext_pointer=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5 echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then cat >>confdefs.h <<\_ACEOF #define YYTEXT_POINTER 1 _ACEOF fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi for ac_prog in perl5 perl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_mgp_cv_path_perl+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $mgp_cv_path_perl in [\\/]* | ?:[\\/]*) ac_cv_path_mgp_cv_path_perl="$mgp_cv_path_perl" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_mgp_cv_path_perl="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi mgp_cv_path_perl=$ac_cv_path_mgp_cv_path_perl if test -n "$mgp_cv_path_perl"; then { echo "$as_me:$LINENO: result: $mgp_cv_path_perl" >&5 echo "${ECHO_T}$mgp_cv_path_perl" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$mgp_cv_path_perl" && break done test -n "$mgp_cv_path_perl" || mgp_cv_path_perl="no" for ac_prog in uuencode do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_mgp_cv_path_uuencode+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $mgp_cv_path_uuencode in [\\/]* | ?:[\\/]*) ac_cv_path_mgp_cv_path_uuencode="$mgp_cv_path_uuencode" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_mgp_cv_path_uuencode="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi mgp_cv_path_uuencode=$ac_cv_path_mgp_cv_path_uuencode if test -n "$mgp_cv_path_uuencode"; then { echo "$as_me:$LINENO: result: $mgp_cv_path_uuencode" >&5 echo "${ECHO_T}$mgp_cv_path_uuencode" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$mgp_cv_path_uuencode" && break done test -n "$mgp_cv_path_uuencode" || mgp_cv_path_uuencode="no" for ac_prog in gzip do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_mgp_cv_path_gzip+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $mgp_cv_path_gzip in [\\/]* | ?:[\\/]*) ac_cv_path_mgp_cv_path_gzip="$mgp_cv_path_gzip" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_mgp_cv_path_gzip="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi mgp_cv_path_gzip=$ac_cv_path_mgp_cv_path_gzip if test -n "$mgp_cv_path_gzip"; then { echo "$as_me:$LINENO: result: $mgp_cv_path_gzip" >&5 echo "${ECHO_T}$mgp_cv_path_gzip" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$mgp_cv_path_gzip" && break done test -n "$mgp_cv_path_gzip" || mgp_cv_path_gzip="no" for ac_prog in uudecode do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_mgp_cv_path_uudecode+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $mgp_cv_path_uudecode in [\\/]* | ?:[\\/]*) ac_cv_path_mgp_cv_path_uudecode="$mgp_cv_path_uudecode" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_mgp_cv_path_uudecode="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi mgp_cv_path_uudecode=$ac_cv_path_mgp_cv_path_uudecode if test -n "$mgp_cv_path_uudecode"; then { echo "$as_me:$LINENO: result: $mgp_cv_path_uudecode" >&5 echo "${ECHO_T}$mgp_cv_path_uudecode" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$mgp_cv_path_uudecode" && break done test -n "$mgp_cv_path_uudecode" || mgp_cv_path_uudecode="no" for ac_prog in gunzip do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_mgp_cv_path_gunzip+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $mgp_cv_path_gunzip in [\\/]* | ?:[\\/]*) ac_cv_path_mgp_cv_path_gunzip="$mgp_cv_path_gunzip" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_mgp_cv_path_gunzip="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi mgp_cv_path_gunzip=$ac_cv_path_mgp_cv_path_gunzip if test -n "$mgp_cv_path_gunzip"; then { echo "$as_me:$LINENO: result: $mgp_cv_path_gunzip" >&5 echo "${ECHO_T}$mgp_cv_path_gunzip" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$mgp_cv_path_gunzip" && break done test -n "$mgp_cv_path_gunzip" || mgp_cv_path_gunzip="no" OPTFLAGS= DEPLIBS= SHLIBEXT=so case $host_os in freebsd5*|freebsd4*|freebsd3*|freebsd2.2.6*|freebsd2.2.7*|freebsd2.2.8*) OPTFLAGS="$OPTFLAGS -DUUDECODEOPT=\\\"-s\\\"" ;; darwin*) SHLIBEXT=dylib ;; esac OPTFLAGS="$OPTFLAGS -DUUDECODE=\\\"$mgp_cv_path_uudecode\\\"" OPTFLAGS="$OPTFLAGS -DGUNZIP=\\\"$mgp_cv_path_gunzip\\\"" { echo "$as_me:$LINENO: checking if debugging is enabled" >&5 echo $ECHO_N "checking if debugging is enabled... $ECHO_C" >&6; } # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then enableval=$enable_debug; mgp_debug="$enableval" else mgp_debug="no" fi if test "$mgp_debug" = "yes"; then OPTFLAGS="$OPTFLAGS -g -DDEBUG -Wall" fi { echo "$as_me:$LINENO: result: $mgp_debug" >&5 echo "${ECHO_T}$mgp_debug" >&6; } { echo "$as_me:$LINENO: checking if setlocale() should be used" >&5 echo $ECHO_N "checking if setlocale() should be used... $ECHO_C" >&6; } # Check whether --enable-locale was given. if test "${enable_locale+set}" = set; then enableval=$enable_locale; mgp_locale="$enableval" else mgp_locale="no" fi if test $mgp_locale = "yes"; then OPTFLAGS="$OPTFLAGS -DUSE_SETLOCALE" fi { echo "$as_me:$LINENO: result: $mgp_locale" >&5 echo "${ECHO_T}$mgp_locale" >&6; } { echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Extract the first word of "grep ggrep" to use in msg output if test -z "$GREP"; then set dummy grep ggrep; ac_prog_name=$2 if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS fi GREP="$ac_cv_path_GREP" if test -z "$GREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 echo "${ECHO_T}$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else # Extract the first word of "egrep" to use in msg output if test -z "$EGREP"; then set dummy egrep; ac_prog_name=$2 if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS fi EGREP="$ac_cv_path_EGREP" if test -z "$EGREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi { echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6; } if test "${ac_cv_header_sys_wait_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_sys_wait_h=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SYS_WAIT_H 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in fcntl.h strings.h sys/file.h unistd.h sys/time.h sys/select.h stdarg.h varargs.h termios.h locale.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; } if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi { echo "$as_me:$LINENO: checking for inline" >&5 echo $ECHO_N "checking for inline... $ECHO_C" >&6; } if test "${ac_cv_c_inline+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_inline=$ac_kw else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 echo "${ECHO_T}$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac { echo "$as_me:$LINENO: checking for pid_t" >&5 echo $ECHO_N "checking for pid_t... $ECHO_C" >&6; } if test "${ac_cv_type_pid_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef pid_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_pid_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_pid_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 echo "${ECHO_T}$ac_cv_type_pid_t" >&6; } if test $ac_cv_type_pid_t = yes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi { echo "$as_me:$LINENO: checking for size_t" >&5 echo $ECHO_N "checking for size_t... $ECHO_C" >&6; } if test "${ac_cv_type_size_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef size_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_size_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 echo "${ECHO_T}$ac_cv_type_size_t" >&6; } if test $ac_cv_type_size_t = yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; } if test "${ac_cv_header_time+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_time=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 echo "${ECHO_T}$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then cat >>confdefs.h <<\_ACEOF #define TIME_WITH_SYS_TIME 1 _ACEOF fi { echo "$as_me:$LINENO: checking for u_int" >&5 echo $ECHO_N "checking for u_int... $ECHO_C" >&6; } if test "${ac_cv_type_u_int+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef u_int ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_u_int=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_u_int=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_u_int" >&5 echo "${ECHO_T}$ac_cv_type_u_int" >&6; } if test $ac_cv_type_u_int = yes; then : else cat >>confdefs.h <<_ACEOF #define u_int unsigned int _ACEOF fi { echo "$as_me:$LINENO: checking for u_char" >&5 echo $ECHO_N "checking for u_char... $ECHO_C" >&6; } if test "${ac_cv_type_u_char+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef u_char ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_u_char=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_u_char=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_u_char" >&5 echo "${ECHO_T}$ac_cv_type_u_char" >&6; } if test $ac_cv_type_u_char = yes; then : else cat >>confdefs.h <<_ACEOF #define u_char unsigned char _ACEOF fi { echo "$as_me:$LINENO: checking for working memcmp" >&5 echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6; } if test "${ac_cv_func_memcmp_working+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_memcmp_working=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = '\100', c1 = '\200', c2 = '\201'; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) return 1; /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) return 1; } return 0; } ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_memcmp_working=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_memcmp_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5 echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6; } test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in *" memcmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; esac { echo "$as_me:$LINENO: checking return type of signal handlers" >&5 echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6; } if test "${ac_cv_type_signal+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_signal=int else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 echo "${ECHO_T}$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in poll strstr _setbufend do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in usleep strsep strdup mkstemp snprintf memcmp strlcpy strlcat do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else case " $LIBOBJS " in *" $ac_func.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;; esac fi done LIBS="-lm $LIBS" # Check whether --with-searchpath was given. if test "${with_searchpath+set}" = set; then withval=$with_searchpath; SEARCHPATH="$SEARCHPATH $withval" fi { echo "$as_me:$LINENO: checking if freetype1 is used" >&5 echo $ECHO_N "checking if freetype1 is used... $ECHO_C" >&6; } # Check whether --enable-freetype was given. if test "${enable_freetype+set}" = set; then enableval=$enable_freetype; mgp_use_freetype="$enableval" else mgp_use_freetype="yes" fi { echo "$as_me:$LINENO: result: $mgp_use_freetype" >&5 echo "${ECHO_T}$mgp_use_freetype" >&6; } if test "$mgp_use_freetype" = "yes"; then # XXX: freetype2 may use freetype-config { echo "$as_me:$LINENO: checking for freetype1 library/header" >&5 echo $ECHO_N "checking for freetype1 library/header... $ECHO_C" >&6; } for dir in $SEARCHPATH /usr/local/freetype /usr/local /opt/freetype /usr/pkg /usr /usr/include/freetype1 /sw; do ac_cv_ft_lib=no ac_cv_ft_include=no shlib=`echo $dir/lib/libttf.$SHLIBEXT* | head -n 1 | sed -e 's/.*\///'` if test x$shlib = x; then shlib=no fi if test -d $dir/lib -a -f $dir/lib/$shlib; then ac_cv_ft_lib="$dir/lib" ac_cv_ft_libpath="$shlib" elif test -d $dir/lib -a -f $dir/lib/libttf.a; then ac_cv_ft_lib="$dir/lib" ac_cv_ft_libpath="libttf.a" fi if test -d $dir/include -a -f $dir/include/freetype.h; then ac_cv_ft_include="$dir/include" elif test -d $dir/include/freetype -a -f $dir/include/freetype/freetype.h; then ac_cv_ft_include="$dir/include/freetype" fi if test "$ac_cv_ft_lib" != "no" -a "$ac_cv_ft_include" != "no"; then LIBS="-L$ac_cv_ft_lib $LIBS" CFLAGS="-I$ac_cv_ft_include $CFLAGS" break fi done if test "$ac_cv_ft_lib" = "no" -a "$ac_cv_ft_include" = "no"; then { echo "$as_me:$LINENO: result: no - not using freetype" >&5 echo "${ECHO_T}no - not using freetype" >&6; } mgp_use_freetype=no else { echo "$as_me:$LINENO: result: $ac_cv_ft_lib and $ac_cv_ft_include" >&5 echo "${ECHO_T}$ac_cv_ft_lib and $ac_cv_ft_include" >&6; } fi if test "$mgp_use_freetype" = "yes"; then LIBS="-L$ac_cv_ft_lib $LIBS" OPTFLAGS="-I$ac_cv_ft_include $OPTFLAGS" DEPLIBS="$ac_cv_ft_lib/$ac_cv_ft_libpath $DEPLIBS" { echo "$as_me:$LINENO: checking for dgettext in -lintl" >&5 echo $ECHO_N "checking for dgettext in -lintl... $ECHO_C" >&6; } if test "${ac_cv_lib_intl_dgettext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_intl_dgettext=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_dgettext=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_intl_dgettext" >&5 echo "${ECHO_T}$ac_cv_lib_intl_dgettext" >&6; } if test $ac_cv_lib_intl_dgettext = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBINTL 1 _ACEOF LIBS="-lintl $LIBS" fi { echo "$as_me:$LINENO: checking for TT_Init_FreeType in -lttf" >&5 echo $ECHO_N "checking for TT_Init_FreeType in -lttf... $ECHO_C" >&6; } if test "${ac_cv_lib_ttf_TT_Init_FreeType+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lttf $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char TT_Init_FreeType (); int main () { return TT_Init_FreeType (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_ttf_TT_Init_FreeType=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_ttf_TT_Init_FreeType=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_ttf_TT_Init_FreeType" >&5 echo "${ECHO_T}$ac_cv_lib_ttf_TT_Init_FreeType" >&6; } if test $ac_cv_lib_ttf_TT_Init_FreeType = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBTTF 1 _ACEOF LIBS="-lttf $LIBS" else echo "Fatal: libttf.a not found" exit 1 fi cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 echo "Fatal: freetype.h not found" exit 1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >>confdefs.h <<\_ACEOF #define FREETYPE 1 _ACEOF { echo "$as_me:$LINENO: checking for num_CharMaps field in TT_Face_Properties" >&5 echo $ECHO_N "checking for num_CharMaps field in TT_Face_Properties... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { TT_Face_Properties x; return x.num_CharMaps; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then result=yes; cat >>confdefs.h <<\_ACEOF #define HAVE_TT_FACE_PROPERTIES_CHARMAPS 1 _ACEOF else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 result=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $result" >&5 echo "${ECHO_T}$result" >&6; } fi fi { echo "$as_me:$LINENO: checking if vflib is used" >&5 echo $ECHO_N "checking if vflib is used... $ECHO_C" >&6; } # Check whether --enable-vflib was given. if test "${enable_vflib+set}" = set; then enableval=$enable_vflib; mgp_use_vflib="$enableval" else mgp_use_vflib="yes" fi { echo "$as_me:$LINENO: result: $mgp_use_vflib" >&5 echo "${ECHO_T}$mgp_use_vflib" >&6; } if test "$mgp_use_vflib" = "yes"; then { echo "$as_me:$LINENO: checking for VFlib library/header" >&5 echo $ECHO_N "checking for VFlib library/header... $ECHO_C" >&6; } for dir in $SEARCHPATH /usr/local/VFlib /usr/local/vflib /usr/local /usr/pkg /usr; do ac_cv_vf_libname=VFlib ac_cv_vf_libdir=no ac_cv_vf_hdrdir=no shlib1=`echo $dir/lib/libVFlib.so* | head -n 1 | sed -e 's/.*\///'` shlib2=`echo $dir/lib/libVFlib2.so* | head -n 1 | sed -e 's/.*\///'` if test x$shlib1 = x; then $shlib1=no fi if test x$shlib2 = x; then $shlib2=no fi if test -d $dir/lib -a -f $dir/lib/$shlib1; then ac_cv_vf_libdir="$dir/lib" ac_cv_vf_libpath=$shlib1 elif test -d $dir/lib -a -f $dir/lib/libVFlib.a; then ac_cv_vf_libdir="$dir/lib" ac_cv_vf_libpath="libVFlib.a" elif test -d $dir/lib -a -f $dir/lib/$shlib2; then ac_cv_vf_libname=VFlib2 ac_cv_vf_libdir="$dir/lib" ac_cv_vf_libpath=$shlib2 elif test -d $dir/lib -a -f $dir/lib/libVFlib2.a; then ac_cv_vf_libname=VFlib2 ac_cv_vf_libdir="$dir/lib" ac_cv_vf_libpath="libVFlib2.a" fi if test -d $dir/include -a -f $dir/include/VF.h; then ac_cv_vf_hdrdir="$dir/include" fi if test "$ac_cv_vf_libdir" != "no" -a "$ac_cv_vf_hdrdir" != "no"; then LIBS="-L$ac_cv_vf_libdir $LIBS" CFLAGS="-I$ac_cv_vf_hdrdir $CFLAGS" break fi done if test "$ac_cv_vf_libdir" = "no" -o "$ac_cv_vf_hdrdir" = "no"; then { echo "$as_me:$LINENO: result: no - not using VFlib" >&5 echo "${ECHO_T}no - not using VFlib" >&6; } mgp_use_vflib=no else { echo "$as_me:$LINENO: result: $ac_cv_vf_libdir and $ac_cv_vf_hdrdir" >&5 echo "${ECHO_T}$ac_cv_vf_libdir and $ac_cv_vf_hdrdir" >&6; } fi fi if test "$mgp_use_vflib" = "yes"; then LIBS="-L$ac_cv_vf_libdir -l$ac_cv_vf_libname $LIBS" OPTFLAGS="-I$ac_cv_vf_hdrdir $OPTFLAGS" DEPLIBS="$ac_cv_vf_libdir/$ac_cv_vf_libpath $DEPLIBS" as_ac_Lib=`echo "ac_cv_lib_$ac_cv_vf_libname''_VF_Init" | $as_tr_sh` { echo "$as_me:$LINENO: checking for VF_Init in -l$ac_cv_vf_libname" >&5 echo $ECHO_N "checking for VF_Init in -l$ac_cv_vf_libname... $ECHO_C" >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$ac_cv_vf_libname $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char VF_Init (); int main () { return VF_Init (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_Lib=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi ac_res=`eval echo '${'$as_ac_Lib'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Lib'}'` = yes; then mgp_cv_vflib_a=$ac_cv_vf_libpath else echo "Fatal: $ac_cv_vf_libpath not found" exit 1 fi cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 echo "Fatal: VF.h not found" exit 1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >>confdefs.h <<\_ACEOF #define VFLIB 1 _ACEOF { echo "$as_me:$LINENO: checking for VFlib configuration file" >&5 echo $ECHO_N "checking for VFlib configuration file... $ECHO_C" >&6; } # Check whether --with-vfontcap was given. if test "${with_vfontcap+set}" = set; then withval=$with_vfontcap; fi ac_cv_vf_fontcap="no" if test -f "$with_vfontcap"; then ac_cv_vf_fontcap=$with_vfontcap; else for ac_dir in /usr/local/lib /usr/local/lib/tex \ /usr/local/lib/VFlib /usr/local/lib/fonts/vf \ /usr/local/lib /usr/local/etc /etc \ /usr/local/libdata/vflib /usr/local/share/VFlib \ /usr/local/share/VFlib/* \ ../../VFlib* ../VFlib* VFlib*; do if test -d $ac_dir -a -f $ac_dir/vfontcap; then ac_cv_vf_fontcap=$ac_dir/vfontcap; break fi done fi { echo "$as_me:$LINENO: result: $ac_cv_vf_fontcap" >&5 echo "${ECHO_T}$ac_cv_vf_fontcap" >&6; } if test "$ac_cv_vf_fontcap" = "no"; then echo Fatal: no vfontcap file found. cannot continue. echo Please use the option --with-vfontcap=PATH to specify the path to vfontcap. exit 1 fi cat >>confdefs.h <<_ACEOF #define VFCAP "$ac_cv_vf_fontcap" _ACEOF fi if test "$mgp_use_freetype" = "yes"; then { echo "$as_me:$LINENO: checking if freetype-charset16 is enabled" >&5 echo $ECHO_N "checking if freetype-charset16 is enabled... $ECHO_C" >&6; } # Check whether --enable-freetype-charset16 was given. if test "${enable_freetype_charset16+set}" = set; then enableval=$enable_freetype_charset16; mgp_use_freetype_c16="$enableval" else mgp_use_freetype_c16="no" fi { echo "$as_me:$LINENO: result: $mgp_use_freetype_c16" >&5 echo "${ECHO_T}$mgp_use_freetype_c16" >&6; } if test "$mgp_use_freetype_c16" = "yes"; then cat >>confdefs.h <<\_ACEOF #define FREETYPE_CHARSET16 1 _ACEOF fi fi if type pkg-config > /dev/null 2>&1; then for pnglib in libpng libpng12 libpng10 do if pkg-config $pnglib; then LIBS="$LIBS `pkg-config --libs $pnglib`" OPTFLAGS="$OPTFLAGS `pkg-config --cflags $pnglib`" cat >>confdefs.h <<\_ACEOF #define USE_PNG 1 _ACEOF break fi done fi if test "$use_libpng" = ""; then for i in $SEARCHPATH /usr/pkg /usr/local /usr; do if test -f $i/include/png.h; then if test -f $i/lib/libpng.a ; then DEPLIBS="$DEPLIBS $i/lib/libpng.a" elif test -f $i/lib/libpng.so ; then DEPLIBS="$DEPLIBS $i/lib/libpng.so" else break; fi LIBS="$LIBS -L$i/lib" OPTFLAGS="$OPTFLAGS -I$i/include" { echo "$as_me:$LINENO: checking for png_read_image in -lpng" >&5 echo $ECHO_N "checking for png_read_image in -lpng... $ECHO_C" >&6; } if test "${ac_cv_lib_png_png_read_image+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpng $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char png_read_image (); int main () { return png_read_image (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_png_png_read_image=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_png_png_read_image=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_png_png_read_image" >&5 echo "${ECHO_T}$ac_cv_lib_png_png_read_image" >&6; } if test $ac_cv_lib_png_png_read_image = yes; then LIBS="$LIBS -lpng" cat >>confdefs.h <<\_ACEOF #define USE_PNG 1 _ACEOF else { echo "$as_me:$LINENO: checking for png_set_gray_1_2_4_to_8 in -lpng" >&5 echo $ECHO_N "checking for png_set_gray_1_2_4_to_8 in -lpng... $ECHO_C" >&6; } if test "${ac_cv_lib_png_png_set_gray_1_2_4_to_8+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpng -lz $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char png_set_gray_1_2_4_to_8 (); int main () { return png_set_gray_1_2_4_to_8 (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_png_png_set_gray_1_2_4_to_8=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_png_png_set_gray_1_2_4_to_8=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_png_png_set_gray_1_2_4_to_8" >&5 echo "${ECHO_T}$ac_cv_lib_png_png_set_gray_1_2_4_to_8" >&6; } if test $ac_cv_lib_png_png_set_gray_1_2_4_to_8 = yes; then LIBS="$LIBS -lpng -lz" cat >>confdefs.h <<\_ACEOF #define USE_PNG 1 _ACEOF fi fi break fi done fi for i in /usr/pkg /usr/local /usr; do if test -f $i/include/libmng.h; then if test -f $i/lib/libmng.a ; then DEPLIBS="$DEPLIBS $i/lib/libmng.a" elif test -f $i/lib/libmng.so ; then DEPLIBS="$DEPLIBS $i/lib/libmng.so" else break; fi LIBS="$LIBS -L$i/lib" OPTFLAGS="$OPTFLAGS -I$i/include" { echo "$as_me:$LINENO: checking for mng_initialize in -lmng" >&5 echo $ECHO_N "checking for mng_initialize in -lmng... $ECHO_C" >&6; } if test "${ac_cv_lib_mng_mng_initialize+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmng $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char mng_initialize (); int main () { return mng_initialize (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_mng_mng_initialize=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_mng_mng_initialize=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_mng_mng_initialize" >&5 echo "${ECHO_T}$ac_cv_lib_mng_mng_initialize" >&6; } if test $ac_cv_lib_mng_mng_initialize = yes; then LIBS="$LIBS -lmng" cat >>confdefs.h <<\_ACEOF #define MNG 1 _ACEOF else { echo "$as_me:$LINENO: checking for mng_readdisplay in -lmng" >&5 echo $ECHO_N "checking for mng_readdisplay in -lmng... $ECHO_C" >&6; } if test "${ac_cv_lib_mng_mng_readdisplay+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmng -ljpeg $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char mng_readdisplay (); int main () { return mng_readdisplay (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_mng_mng_readdisplay=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_mng_mng_readdisplay=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_mng_mng_readdisplay" >&5 echo "${ECHO_T}$ac_cv_lib_mng_mng_readdisplay" >&6; } if test $ac_cv_lib_mng_mng_readdisplay = yes; then LIBS="$LIBS -lmng -ljpeg" cat >>confdefs.h <<\_ACEOF #define MNG 1 _ACEOF fi fi break fi done { echo "$as_me:$LINENO: checking for X" >&5 echo $ECHO_N "checking for X... $ECHO_C" >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) { { echo "$as_me:$LINENO: error: Cannot use X directory names containing '" >&5 echo "$as_me: error: Cannot use X directory names containing '" >&2;} { (exit 1); exit 1; }; };; #( *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /lib) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # We can compile using X headers with no special include directory. ac_x_includes= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 LIBS=$ac_save_LIBS for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { echo "$as_me:$LINENO: result: $have_x" >&5 echo "${ECHO_T}$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" != yes; then if test "$x_libraries" != ""; then LIBS="$LIBS -L$x_libraries" fi if test "$x_includes" != ""; then OPTFLAGS="$OPTFLAGS -I$x_includes" fi fi { echo "$as_me:$LINENO: checking if Xft2 is used" >&5 echo $ECHO_N "checking if Xft2 is used... $ECHO_C" >&6; } # Check whether --enable-xft2 was given. if test "${enable_xft2+set}" = set; then enableval=$enable_xft2; mgp_use_xft2="$enableval" else mgp_use_xft2="yes" fi { echo "$as_me:$LINENO: result: $mgp_use_xft2" >&5 echo "${ECHO_T}$mgp_use_xft2" >&6; } if test "$mgp_use_xft2" = "yes"; then if type pkg-config > /dev/null 2>&1; then if pkg-config xft; then OPTFLAGS="`pkg-config --cflags xft` $OPTFLAGS" LIBS="$LIBS `pkg-config --libs xft`" cat >>confdefs.h <<\_ACEOF #define USE_XFT2 1 _ACEOF mgp_xft2_found="yes"; fi fi if test "$mgp_xft2_found" != "yes"; then { echo "$as_me:$LINENO: checking for xft2 and ft2 and fc header.." >&5 echo $ECHO_N "checking for xft2 and ft2 and fc header..... $ECHO_C" >&6; } for dir in /usr/include /usr/include/Xft2 /usr/X11R6/include \ /usr/X11R6/include/freetype2 \ /usr/local/include /usr/include/freetype2; do if test -f $dir/X11/Xft/Xft.h; then ac_cv_xft2_hdrdir="$dir" fi if test -f $dir/fontconfig/fontconfig.h; then ac_cv_fc_hdrdir="$dir" fi if test -f $dir/freetype/freetype.h; then ac_cv_ft2_hdrdir="$dir" fi done if test -z "$ac_cv_xft2_hdrdir" -o -z "$ac_cv_fc_hdrdir"; then { echo "$as_me:$LINENO: result: no - not using xft2" >&5 echo "${ECHO_T}no - not using xft2" >&6; } mgp_use_xft2=no else { echo "$as_me:$LINENO: result: $ac_cv_xft2_hdrdir and $ac_cv_ft2_hdrdir and $ac_cv_fc_hdrdir" >&5 echo "${ECHO_T}$ac_cv_xft2_hdrdir and $ac_cv_ft2_hdrdir and $ac_cv_fc_hdrdir" >&6; } if test $ac_cv_xft2_hdrdir != "/usr/include" ; then OPTFLAGS="-I$ac_cv_xft2_hdrdir $OPTFLAGS" fi if test $ac_cv_ft2_hdrdir != "/usr/include" ; then OPTFLAGS="-I$ac_cv_ft2_hdrdir $OPTFLAGS" fi if test $ac_cv_fc_hdrdir != "/usr/include" ; then OPTFLAGS="-I$ac_cv_fc_hdrdir $OPTFLAGS" fi fi if test "$mgp_use_xft2" = "yes"; then { echo "$as_me:$LINENO: checking for xft2 library.." >&5 echo $ECHO_N "checking for xft2 library..... $ECHO_C" >&6; } { echo "$as_me:$LINENO: checking for XftFontOpen in -lXft" >&5 echo $ECHO_N "checking for XftFontOpen in -lXft... $ECHO_C" >&6; } if test "${ac_cv_lib_Xft_XftFontOpen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXft -lfontconfig $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XftFontOpen (); int main () { return XftFontOpen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_Xft_XftFontOpen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_Xft_XftFontOpen=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_Xft_XftFontOpen" >&5 echo "${ECHO_T}$ac_cv_lib_Xft_XftFontOpen" >&6; } if test $ac_cv_lib_Xft_XftFontOpen = yes; then LIBS="$LIBS -lXft -lfontconfig" cat >>confdefs.h <<\_ACEOF #define USE_XFT2 1 _ACEOF mgp_xft2_found=yes fi fi fi fi if test "$mgp_xft2_found" = "yes"; then { echo "$as_me:$LINENO: checking for iconv.." >&5 echo $ECHO_N "checking for iconv..... $ECHO_C" >&6; } { echo "$as_me:$LINENO: checking for iconv_open" >&5 echo $ECHO_N "checking for iconv_open... $ECHO_C" >&6; } if test "${ac_cv_func_iconv_open+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define iconv_open to an innocuous variant, in case declares iconv_open. For example, HP-UX 11i declares gettimeofday. */ #define iconv_open innocuous_iconv_open /* System header to define __stub macros and hopefully few prototypes, which can conflict with char iconv_open (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef iconv_open /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char iconv_open (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_iconv_open || defined __stub___iconv_open choke me #endif int main () { return iconv_open (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_iconv_open=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_iconv_open=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_iconv_open" >&5 echo "${ECHO_T}$ac_cv_func_iconv_open" >&6; } if test $ac_cv_func_iconv_open = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_ICONV 1 _ACEOF else { echo "$as_me:$LINENO: checking for iconv_open in -liconv" >&5 echo $ECHO_N "checking for iconv_open in -liconv... $ECHO_C" >&6; } if test "${ac_cv_lib_iconv_iconv_open+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char iconv_open (); int main () { return iconv_open (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_iconv_iconv_open=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_iconv_iconv_open=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_iconv_iconv_open" >&5 echo "${ECHO_T}$ac_cv_lib_iconv_iconv_open" >&6; } if test $ac_cv_lib_iconv_iconv_open = yes; then LIBS="$LIBS -liconv"; cat >>confdefs.h <<\_ACEOF #define HAVE_ICONV 1 _ACEOF else { echo "$as_me:$LINENO: checking for libiconv_open in -liconv" >&5 echo $ECHO_N "checking for libiconv_open in -liconv... $ECHO_C" >&6; } if test "${ac_cv_lib_iconv_libiconv_open+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char libiconv_open (); int main () { return libiconv_open (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_iconv_libiconv_open=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_iconv_libiconv_open=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_iconv_libiconv_open" >&5 echo "${ECHO_T}$ac_cv_lib_iconv_libiconv_open" >&6; } if test $ac_cv_lib_iconv_libiconv_open = yes; then LIBS="$LIBS -liconv"; cat >>confdefs.h <<\_ACEOF #define HAVE_ICONV 1 _ACEOF fi fi fi fi for ac_header in fontconfig/fontconfig.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking if gif handling is enabled" >&5 echo $ECHO_N "checking if gif handling is enabled... $ECHO_C" >&6; } # Check whether --enable-gif was given. if test "${enable_gif+set}" = set; then enableval=$enable_gif; mgp_gif="$enableval" else mgp_gif="yes" fi { echo "$as_me:$LINENO: result: $mgp_gif" >&5 echo "${ECHO_T}$mgp_gif" >&6; } if test $mgp_gif = "yes"; then { echo "$as_me:$LINENO: checking for DGifOpenFileHandle in -lungif" >&5 echo $ECHO_N "checking for DGifOpenFileHandle in -lungif... $ECHO_C" >&6; } if test "${ac_cv_lib_ungif_DGifOpenFileHandle+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lungif $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char DGifOpenFileHandle (); int main () { return DGifOpenFileHandle (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_ungif_DGifOpenFileHandle=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_ungif_DGifOpenFileHandle=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_ungif_DGifOpenFileHandle" >&5 echo "${ECHO_T}$ac_cv_lib_ungif_DGifOpenFileHandle" >&6; } if test $ac_cv_lib_ungif_DGifOpenFileHandle = yes; then gif_ok=yes GIFLIB="-lungif" cat >>confdefs.h <<\_ACEOF #define USE_GIF 1 _ACEOF else { echo "$as_me:$LINENO: checking for DGifOpenFileHandle in -lgif" >&5 echo $ECHO_N "checking for DGifOpenFileHandle in -lgif... $ECHO_C" >&6; } if test "${ac_cv_lib_gif_DGifOpenFileHandle+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgif $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char DGifOpenFileHandle (); int main () { return DGifOpenFileHandle (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_gif_DGifOpenFileHandle=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gif_DGifOpenFileHandle=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_gif_DGifOpenFileHandle" >&5 echo "${ECHO_T}$ac_cv_lib_gif_DGifOpenFileHandle" >&6; } if test $ac_cv_lib_gif_DGifOpenFileHandle = yes; then gif_ok=yes GIFLIB="-lgif" cat >>confdefs.h <<\_ACEOF #define USE_GIF 1 _ACEOF else { echo "$as_me:$LINENO: checking for DGifOpenFileName in -lungif" >&5 echo $ECHO_N "checking for DGifOpenFileName in -lungif... $ECHO_C" >&6; } if test "${ac_cv_lib_ungif_DGifOpenFileName+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lungif -L$x_libraries -lX11 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char DGifOpenFileName (); int main () { return DGifOpenFileName (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_ungif_DGifOpenFileName=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_ungif_DGifOpenFileName=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_ungif_DGifOpenFileName" >&5 echo "${ECHO_T}$ac_cv_lib_ungif_DGifOpenFileName" >&6; } if test $ac_cv_lib_ungif_DGifOpenFileName = yes; then gif_ok=yes GIFLIB="-lungif" cat >>confdefs.h <<\_ACEOF #define USE_GIF 1 _ACEOF else { echo "$as_me:$LINENO: checking for DGifOpenFilename in -lgif" >&5 echo $ECHO_N "checking for DGifOpenFilename in -lgif... $ECHO_C" >&6; } if test "${ac_cv_lib_gif_DGifOpenFilename+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgif -L$x_libraries -lX11 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char DGifOpenFilename (); int main () { return DGifOpenFilename (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_gif_DGifOpenFilename=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gif_DGifOpenFilename=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_gif_DGifOpenFilename" >&5 echo "${ECHO_T}$ac_cv_lib_gif_DGifOpenFilename" >&6; } if test $ac_cv_lib_gif_DGifOpenFilename = yes; then gif_ok=yes GIFLIB="-lgif" cat >>confdefs.h <<\_ACEOF #define USE_GIF 1 _ACEOF fi fi fi fi if test "x$gif_ok" != "xyes"; then echo 'FATAL: You need libungif to use gif images. pass proper LIBS to configure.' exit 1 fi for i in /usr/pkg /usr/local /usr; do if test -f $i/include/gif_lib.h; then gif_h_ok=yes OPTFLAGS="$OPTFLAGS -I$i/include" break fi done if test -f /usr/include/gif_lib.h; then gif_h_ok=yes fi if test "x$gif_h_ok" != "xyes"; then if test "${ac_cv_header_gif_lib_h+set}" = set; then { echo "$as_me:$LINENO: checking for gif_lib.h" >&5 echo $ECHO_N "checking for gif_lib.h... $ECHO_C" >&6; } if test "${ac_cv_header_gif_lib_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi { echo "$as_me:$LINENO: result: $ac_cv_header_gif_lib_h" >&5 echo "${ECHO_T}$ac_cv_header_gif_lib_h" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking gif_lib.h usability" >&5 echo $ECHO_N "checking gif_lib.h usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking gif_lib.h presence" >&5 echo $ECHO_N "checking gif_lib.h presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: gif_lib.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: gif_lib.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: gif_lib.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: gif_lib.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: gif_lib.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: gif_lib.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: gif_lib.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: gif_lib.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: gif_lib.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: gif_lib.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: gif_lib.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: gif_lib.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: gif_lib.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: gif_lib.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: gif_lib.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: gif_lib.h: in the future, the compiler will take precedence" >&2;} ;; esac { echo "$as_me:$LINENO: checking for gif_lib.h" >&5 echo $ECHO_N "checking for gif_lib.h... $ECHO_C" >&6; } if test "${ac_cv_header_gif_lib_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_gif_lib_h=$ac_header_preproc fi { echo "$as_me:$LINENO: result: $ac_cv_header_gif_lib_h" >&5 echo "${ECHO_T}$ac_cv_header_gif_lib_h" >&6; } fi if test $ac_cv_header_gif_lib_h = yes; then gif_h_ok=yes fi fi if test "x$gif_h_ok" != "xyes"; then echo 'FATAL: cannot find gif_lib.h. pass proper CPPFLAGS to configure.' exit 1 fi fi USE_IMLIB=0 { echo "$as_me:$LINENO: checking if imlib is used" >&5 echo $ECHO_N "checking if imlib is used... $ECHO_C" >&6; } # Check whether --enable-imlib was given. if test "${enable_imlib+set}" = set; then enableval=$enable_imlib; mgp_imlib="$enableval" else mgp_imlib="yes" fi { echo "$as_me:$LINENO: result: $mgp_imlib" >&5 echo "${ECHO_T}$mgp_imlib" >&6; } if test $mgp_imlib = "yes"; then if type pkg-config > /dev/null 2>&1; then if pkg-config imlib2; then LIBS="$LIBS `pkg-config --libs imlib2`" OPTFLAGS="$OPTFLAGS `pkg-config --cflags imlib2`" cat >>confdefs.h <<\_ACEOF #define USE_IMLIB 1 _ACEOF USE_IMLIB=1 fi else { echo "$as_me:$LINENO: checking for imlib_load_image in -lImlib2" >&5 echo $ECHO_N "checking for imlib_load_image in -lImlib2... $ECHO_C" >&6; } if test "${ac_cv_lib_Imlib2_imlib_load_image+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lImlib2 -L$x_libraries -lX11 -lXext $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char imlib_load_image (); int main () { return imlib_load_image (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_Imlib2_imlib_load_image=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_Imlib2_imlib_load_image=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_Imlib2_imlib_load_image" >&5 echo "${ECHO_T}$ac_cv_lib_Imlib2_imlib_load_image" >&6; } if test $ac_cv_lib_Imlib2_imlib_load_image = yes; then imlib_ok=yes LIBS="$LIBS -lImlib2" cat >>confdefs.h <<\_ACEOF #define USE_IMLIB 1 _ACEOF USE_IMLIB=1 fi if test "x$imlib_ok" != "xyes"; then echo 'FATAL: You need libImlib2 to use Imlib loading. pass proper LIBS to configure.' exit 1 fi for i in /usr/pkg /usr/local; do if test -f $i/include/Imlib2.h; then imlib_h_ok=yes OPTFLAGS="$OPTFLAGS -I$i/include" break fi done if test -f /usr/include/Imlib2.h; then imlib_h_ok=yes fi if test "x$gif_h_ok" != "xyes"; then if test "${ac_cv_header_Imlib2_h+set}" = set; then { echo "$as_me:$LINENO: checking for Imlib2.h" >&5 echo $ECHO_N "checking for Imlib2.h... $ECHO_C" >&6; } if test "${ac_cv_header_Imlib2_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi { echo "$as_me:$LINENO: result: $ac_cv_header_Imlib2_h" >&5 echo "${ECHO_T}$ac_cv_header_Imlib2_h" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking Imlib2.h usability" >&5 echo $ECHO_N "checking Imlib2.h usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking Imlib2.h presence" >&5 echo $ECHO_N "checking Imlib2.h presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: Imlib2.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: Imlib2.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: Imlib2.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: Imlib2.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: Imlib2.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: Imlib2.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: Imlib2.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: Imlib2.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: Imlib2.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: Imlib2.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: Imlib2.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: Imlib2.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: Imlib2.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: Imlib2.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: Imlib2.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: Imlib2.h: in the future, the compiler will take precedence" >&2;} ;; esac { echo "$as_me:$LINENO: checking for Imlib2.h" >&5 echo $ECHO_N "checking for Imlib2.h... $ECHO_C" >&6; } if test "${ac_cv_header_Imlib2_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_Imlib2_h=$ac_header_preproc fi { echo "$as_me:$LINENO: result: $ac_cv_header_Imlib2_h" >&5 echo "${ECHO_T}$ac_cv_header_Imlib2_h" >&6; } fi if test $ac_cv_header_Imlib2_h = yes; then imlib_h_ok=yes fi fi if test "x$imlib_h_ok" != "xyes"; then echo 'FATAL: cannot find Imlib2.h. pass proper CPPFLAGS to configure.' exit 1 fi fi fi if test -n "$GIFLIB"; then LIBS="$LIBS $GIFLIB" fi # Check whether --with-m17n-lib was given. if test "${with_m17n_lib+set}" = set; then withval=$with_m17n_lib; fi if test "x$with_m17n_lib" = "xyes"; then # Extract the first word of "m17n-config", so it can be a program name with args. set dummy m17n-config; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_HAVE_M17NLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$HAVE_M17NLIB"; then ac_cv_prog_HAVE_M17NLIB="$HAVE_M17NLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_HAVE_M17NLIB="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi HAVE_M17NLIB=$ac_cv_prog_HAVE_M17NLIB if test -n "$HAVE_M17NLIB"; then { echo "$as_me:$LINENO: result: $HAVE_M17NLIB" >&5 echo "${ECHO_T}$HAVE_M17NLIB" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$HAVE_M17NLIB" = "xyes"; then cat >>confdefs.h <<\_ACEOF #define USE_M17N 1 _ACEOF OPTFLAGS="$OPTFLAGS `m17n-config X --cflags`" LIBS="$LIBS `m17n-config X --libs` -lm17n-core" fi fi mgp_keywords=`$mgp_cv_path_perl $srcdir/keywords.pl $srcdir/globals.c` ac_config_files="$ac_config_files Imakefile image/Imakefile sample/Imakefile contrib/mgp2html.pl contrib/mgp2latex.pl contrib/mgpnet mgpembed.pl" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Imakefile") CONFIG_FILES="$CONFIG_FILES Imakefile" ;; "image/Imakefile") CONFIG_FILES="$CONFIG_FILES image/Imakefile" ;; "sample/Imakefile") CONFIG_FILES="$CONFIG_FILES sample/Imakefile" ;; "contrib/mgp2html.pl") CONFIG_FILES="$CONFIG_FILES contrib/mgp2html.pl" ;; "contrib/mgp2latex.pl") CONFIG_FILES="$CONFIG_FILES contrib/mgp2latex.pl" ;; "contrib/mgpnet") CONFIG_FILES="$CONFIG_FILES contrib/mgpnet" ;; "mgpembed.pl") CONFIG_FILES="$CONFIG_FILES mgpembed.pl" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim SET_MAKE!$SET_MAKE$ac_delim build!$build$ac_delim build_cpu!$build_cpu$ac_delim build_vendor!$build_vendor$ac_delim build_os!$build_os$ac_delim host!$host$ac_delim host_cpu!$host_cpu$ac_delim host_vendor!$host_vendor$ac_delim host_os!$host_os$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim CPP!$CPP$ac_delim AWK!$AWK$ac_delim YACC!$YACC$ac_delim YFLAGS!$YFLAGS$ac_delim LEX!$LEX$ac_delim LEX_OUTPUT_ROOT!$LEX_OUTPUT_ROOT$ac_delim LEXLIB!$LEXLIB$ac_delim mgp_cv_path_perl!$mgp_cv_path_perl$ac_delim mgp_cv_path_uuencode!$mgp_cv_path_uuencode$ac_delim mgp_cv_path_gzip!$mgp_cv_path_gzip$ac_delim mgp_cv_path_uudecode!$mgp_cv_path_uudecode$ac_delim mgp_cv_path_gunzip!$mgp_cv_path_gunzip$ac_delim OPTFLAGS!$OPTFLAGS$ac_delim DEPLIBS!$DEPLIBS$ac_delim GREP!$GREP$ac_delim EGREP!$EGREP$ac_delim LIBOBJS!$LIBOBJS$ac_delim mgp_cv_vflib_a!$mgp_cv_vflib_a$ac_delim XMKMF!$XMKMF$ac_delim USE_IMLIB!$USE_IMLIB$ac_delim HAVE_M17NLIB!$HAVE_M17NLIB$ac_delim mgp_keywords!$mgp_keywords$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 76; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$ac_file_inputs $ac_f" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input="Generated from "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi /bin/rm -f Makefile image/Makefile echo "be sure to generate Makefile from Imakefile, by xmkmf and make Makefiles" kit/configure.in010064400237450000000000000355161114577676700135160ustar nishidawheeldnl NOTE: dnl This 'configure' and 'Imakefile.in' are written to be directory dnl independent (using srcdir), however, xmkmf and Imake.tmpl do not dnl allow us to switch compilation directory. dnl dnl $Id: configure.in,v 1.105 2009/02/15 11:35:19 nishida Exp $ AC_INIT(image/imagetypes.c) dnl Checks for programs. AC_PROG_MAKE_SET AC_CANONICAL_HOST dnl AC_PROG_CC cannot be specified here, since imake may not like the dnl compiler probed by AC_PROG_CC (i.e. gcc). dnl AC_PROG_CC AC_PROG_CPP AC_PROG_AWK AC_PROG_YACC AC_PROG_LEX AC_PATH_PROGS(mgp_cv_path_perl, perl5 perl, no) AC_SUBST(mgp_cv_path_perl) AC_PATH_PROGS(mgp_cv_path_uuencode, uuencode, no) AC_SUBST(mgp_cv_path_uuencode) AC_PATH_PROGS(mgp_cv_path_gzip, gzip, no) AC_SUBST(mgp_cv_path_gzip) AC_PATH_PROGS(mgp_cv_path_uudecode, uudecode, no) AC_PATH_PROGS(mgp_cv_path_gunzip, gunzip, no) OPTFLAGS= AC_SUBST(OPTFLAGS) DEPLIBS= AC_SUBST(DEPLIBS) dnl AS_15_01_2005: Added Variable SHLIBEXT which contains extensions of shared libaries SHLIBEXT=so case $host_os in freebsd5*|freebsd4*|freebsd3*|freebsd2.2.6*|freebsd2.2.7*|freebsd2.2.8*) OPTFLAGS="$OPTFLAGS -DUUDECODEOPT=\\\"-s\\\"" ;; darwin*) SHLIBEXT=dylib ;; esac OPTFLAGS="$OPTFLAGS -DUUDECODE=\\\"$mgp_cv_path_uudecode\\\"" OPTFLAGS="$OPTFLAGS -DGUNZIP=\\\"$mgp_cv_path_gunzip\\\"" dnl Checks for debugging option. AC_MSG_CHECKING(if debugging is enabled) AC_ARG_ENABLE(debug, [ --enable-debug compile debugging information in.], [mgp_debug="$enableval"], [mgp_debug="no"]) if test "$mgp_debug" = "yes"; then OPTFLAGS="$OPTFLAGS -g -DDEBUG -Wall" fi AC_MSG_RESULT($mgp_debug) dnl Checks for locale option. AC_MSG_CHECKING(if setlocale() should be used) AC_ARG_ENABLE(locale, [ --enable-locale perform setlocale() on invocation.], [mgp_locale="$enableval"], [mgp_locale="no"]) if test $mgp_locale = "yes"; then OPTFLAGS="$OPTFLAGS -DUSE_SETLOCALE" fi AC_MSG_RESULT($mgp_locale) AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(fcntl.h strings.h sys/file.h unistd.h sys/time.h sys/select.h stdarg.h varargs.h termios.h locale.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_TYPE_PID_T AC_TYPE_SIZE_T AC_HEADER_TIME AC_CHECK_TYPE(u_int, unsigned int) AC_CHECK_TYPE(u_char, unsigned char) dnl Checks for library functions. AC_FUNC_MEMCMP AC_TYPE_SIGNAL AC_CHECK_FUNCS(poll strstr _setbufend) AC_REPLACE_FUNCS(usleep strsep strdup mkstemp snprintf memcmp strlcpy strlcat) dnl Checks for libraries. LIBS="-lm $LIBS" dnl AS_15_01_2005 dnl Addes Path Variable for Libs/Includes searching AC_ARG_WITH(searchpath, [ --with-searchpath=PATH additional path for searching includes & libaries.], [SEARCHPATH="$SEARCHPATH $withval"], []) AC_MSG_CHECKING(if freetype1 is used) AC_ARG_ENABLE(freetype, [ --disable-freetype DON'T use freetype1 routines.], [mgp_use_freetype="$enableval"], [mgp_use_freetype="yes"]) AC_MSG_RESULT($mgp_use_freetype) dnl echo $target if test "$mgp_use_freetype" = "yes"; then # XXX: freetype2 may use freetype-config AC_MSG_CHECKING(for freetype1 library/header) for dir in $SEARCHPATH /usr/local/freetype /usr/local /opt/freetype /usr/pkg /usr /usr/include/freetype1 /sw; do ac_cv_ft_lib=no ac_cv_ft_include=no shlib=`echo $dir/lib/libttf.$SHLIBEXT* | head -n 1 | sed -e 's/.*\///'` if test x$shlib = x; then shlib=no fi if test -d $dir/lib -a -f $dir/lib/$shlib; then ac_cv_ft_lib="$dir/lib" ac_cv_ft_libpath="$shlib" elif test -d $dir/lib -a -f $dir/lib/libttf.a; then ac_cv_ft_lib="$dir/lib" ac_cv_ft_libpath="libttf.a" fi if test -d $dir/include -a -f $dir/include/freetype.h; then ac_cv_ft_include="$dir/include" elif test -d $dir/include/freetype -a -f $dir/include/freetype/freetype.h; then ac_cv_ft_include="$dir/include/freetype" fi if test "$ac_cv_ft_lib" != "no" -a "$ac_cv_ft_include" != "no"; then LIBS="-L$ac_cv_ft_lib $LIBS" CFLAGS="-I$ac_cv_ft_include $CFLAGS" break fi done if test "$ac_cv_ft_lib" = "no" -a "$ac_cv_ft_include" = "no"; then AC_MSG_RESULT(no - not using freetype) mgp_use_freetype=no else AC_MSG_RESULT($ac_cv_ft_lib and $ac_cv_ft_include) fi if test "$mgp_use_freetype" = "yes"; then LIBS="-L$ac_cv_ft_lib $LIBS" OPTFLAGS="-I$ac_cv_ft_include $OPTFLAGS" DEPLIBS="$ac_cv_ft_lib/$ac_cv_ft_libpath $DEPLIBS" AC_CHECK_LIB(intl, dgettext) AC_CHECK_LIB(ttf, TT_Init_FreeType, [], [echo "Fatal: libttf.a not found" exit 1]) AC_TRY_COMPILE([#include ], [], [], [dnl echo "Fatal: freetype.h not found" exit 1]) AC_DEFINE(FREETYPE) AC_MSG_CHECKING(for num_CharMaps field in TT_Face_Properties) AC_TRY_COMPILE([#include ], [TT_Face_Properties x; return x.num_CharMaps;], [result=yes; AC_DEFINE(HAVE_TT_FACE_PROPERTIES_CHARMAPS)], [result=no]) AC_MSG_RESULT($result) fi fi AC_MSG_CHECKING(if vflib is used) AC_ARG_ENABLE(vflib, [ --disable-vflib DON'T use vflib routines.], [mgp_use_vflib="$enableval"], [mgp_use_vflib="yes"]) AC_MSG_RESULT($mgp_use_vflib) if test "$mgp_use_vflib" = "yes"; then AC_MSG_CHECKING(for VFlib library/header) for dir in $SEARCHPATH /usr/local/VFlib /usr/local/vflib /usr/local /usr/pkg /usr; do ac_cv_vf_libname=VFlib ac_cv_vf_libdir=no ac_cv_vf_hdrdir=no shlib1=`echo $dir/lib/libVFlib.so* | head -n 1 | sed -e 's/.*\///'` shlib2=`echo $dir/lib/libVFlib2.so* | head -n 1 | sed -e 's/.*\///'` if test x$shlib1 = x; then $shlib1=no fi if test x$shlib2 = x; then $shlib2=no fi if test -d $dir/lib -a -f $dir/lib/$shlib1; then ac_cv_vf_libdir="$dir/lib" ac_cv_vf_libpath=$shlib1 elif test -d $dir/lib -a -f $dir/lib/libVFlib.a; then ac_cv_vf_libdir="$dir/lib" ac_cv_vf_libpath="libVFlib.a" elif test -d $dir/lib -a -f $dir/lib/$shlib2; then ac_cv_vf_libname=VFlib2 ac_cv_vf_libdir="$dir/lib" ac_cv_vf_libpath=$shlib2 elif test -d $dir/lib -a -f $dir/lib/libVFlib2.a; then ac_cv_vf_libname=VFlib2 ac_cv_vf_libdir="$dir/lib" ac_cv_vf_libpath="libVFlib2.a" fi if test -d $dir/include -a -f $dir/include/VF.h; then ac_cv_vf_hdrdir="$dir/include" fi if test "$ac_cv_vf_libdir" != "no" -a "$ac_cv_vf_hdrdir" != "no"; then LIBS="-L$ac_cv_vf_libdir $LIBS" CFLAGS="-I$ac_cv_vf_hdrdir $CFLAGS" break fi done if test "$ac_cv_vf_libdir" = "no" -o "$ac_cv_vf_hdrdir" = "no"; then AC_MSG_RESULT(no - not using VFlib) mgp_use_vflib=no else AC_MSG_RESULT($ac_cv_vf_libdir and $ac_cv_vf_hdrdir) fi fi if test "$mgp_use_vflib" = "yes"; then LIBS="-L$ac_cv_vf_libdir -l$ac_cv_vf_libname $LIBS" OPTFLAGS="-I$ac_cv_vf_hdrdir $OPTFLAGS" DEPLIBS="$ac_cv_vf_libdir/$ac_cv_vf_libpath $DEPLIBS" AC_CHECK_LIB($ac_cv_vf_libname, VF_Init, [mgp_cv_vflib_a=$ac_cv_vf_libpath], [echo "Fatal: $ac_cv_vf_libpath not found" exit 1]) AC_TRY_COMPILE([#include ], [], [], [dnl echo "Fatal: VF.h not found" exit 1]) AC_DEFINE(VFLIB) AC_MSG_CHECKING(for VFlib configuration file) AC_ARG_WITH(vfontcap, [ --with-vfontcap=PATH use PATH as vfontcap]) ac_cv_vf_fontcap="no" if test -f "$with_vfontcap"; then ac_cv_vf_fontcap=$with_vfontcap; else for ac_dir in /usr/local/lib /usr/local/lib/tex \ /usr/local/lib/VFlib /usr/local/lib/fonts/vf \ /usr/local/lib /usr/local/etc /etc \ /usr/local/libdata/vflib /usr/local/share/VFlib \ /usr/local/share/VFlib/* \ ../../VFlib* ../VFlib* VFlib*; do if test -d $ac_dir -a -f $ac_dir/vfontcap; then ac_cv_vf_fontcap=$ac_dir/vfontcap; break fi done fi AC_MSG_RESULT($ac_cv_vf_fontcap) if test "$ac_cv_vf_fontcap" = "no"; then echo Fatal: no vfontcap file found. cannot continue. echo Please use the option --with-vfontcap=PATH to specify the path to vfontcap. exit 1 fi AC_DEFINE_UNQUOTED(VFCAP, "$ac_cv_vf_fontcap") AC_SUBST(mgp_cv_vflib_a) fi if test "$mgp_use_freetype" = "yes"; then AC_MSG_CHECKING(if freetype-charset16 is enabled) AC_ARG_ENABLE(freetype-charset16, [ --enable-freetype-charset16 use freetype for chaset16.], [mgp_use_freetype_c16="$enableval"], [mgp_use_freetype_c16="no"]) AC_MSG_RESULT($mgp_use_freetype_c16) if test "$mgp_use_freetype_c16" = "yes"; then AC_DEFINE(FREETYPE_CHARSET16) fi fi if type pkg-config > /dev/null 2>&1; then for pnglib in libpng libpng12 libpng10 do if pkg-config $pnglib; then LIBS="$LIBS `pkg-config --libs $pnglib`" OPTFLAGS="$OPTFLAGS `pkg-config --cflags $pnglib`" AC_DEFINE(USE_PNG) break fi done fi if test "$use_libpng" = ""; then for i in $SEARCHPATH /usr/pkg /usr/local /usr; do if test -f $i/include/png.h; then if test -f $i/lib/libpng.a ; then DEPLIBS="$DEPLIBS $i/lib/libpng.a" elif test -f $i/lib/libpng.so ; then DEPLIBS="$DEPLIBS $i/lib/libpng.so" else break; fi LIBS="$LIBS -L$i/lib" OPTFLAGS="$OPTFLAGS -I$i/include" AC_CHECK_LIB(png, png_read_image, [LIBS="$LIBS -lpng" AC_DEFINE(USE_PNG)], [AC_CHECK_LIB(png, png_set_gray_1_2_4_to_8, [LIBS="$LIBS -lpng -lz" AC_DEFINE(USE_PNG)], [], [-lz])]) break fi done fi for i in /usr/pkg /usr/local /usr; do if test -f $i/include/libmng.h; then if test -f $i/lib/libmng.a ; then DEPLIBS="$DEPLIBS $i/lib/libmng.a" elif test -f $i/lib/libmng.so ; then DEPLIBS="$DEPLIBS $i/lib/libmng.so" else break; fi LIBS="$LIBS -L$i/lib" OPTFLAGS="$OPTFLAGS -I$i/include" AC_CHECK_LIB(mng, mng_initialize, [LIBS="$LIBS -lmng" AC_DEFINE(MNG)], [AC_CHECK_LIB(mng, mng_readdisplay, [LIBS="$LIBS -lmng -ljpeg" AC_DEFINE(MNG)], [], [-ljpeg])]) break fi done dnl Checks for header files. AC_PATH_X if test "$no_x" != yes; then if test "$x_libraries" != ""; then LIBS="$LIBS -L$x_libraries" fi if test "$x_includes" != ""; then OPTFLAGS="$OPTFLAGS -I$x_includes" fi fi AC_MSG_CHECKING(if Xft2 is used) AC_ARG_ENABLE(xft2, [ --disable-xft2 DON'T use xft2 libraries.], [mgp_use_xft2="$enableval"], [mgp_use_xft2="yes"]) AC_MSG_RESULT($mgp_use_xft2) if test "$mgp_use_xft2" = "yes"; then if type pkg-config > /dev/null 2>&1; then if pkg-config xft; then OPTFLAGS="`pkg-config --cflags xft` $OPTFLAGS" LIBS="$LIBS `pkg-config --libs xft`" AC_DEFINE(USE_XFT2) mgp_xft2_found="yes"; fi fi if test "$mgp_xft2_found" != "yes"; then AC_MSG_CHECKING(for xft2 and ft2 and fc header..) for dir in /usr/include /usr/include/Xft2 /usr/X11R6/include \ /usr/X11R6/include/freetype2 \ /usr/local/include /usr/include/freetype2; do if test -f $dir/X11/Xft/Xft.h; then ac_cv_xft2_hdrdir="$dir" fi if test -f $dir/fontconfig/fontconfig.h; then ac_cv_fc_hdrdir="$dir" fi if test -f $dir/freetype/freetype.h; then ac_cv_ft2_hdrdir="$dir" fi done if test -z "$ac_cv_xft2_hdrdir" -o -z "$ac_cv_fc_hdrdir"; then AC_MSG_RESULT(no - not using xft2) mgp_use_xft2=no else AC_MSG_RESULT($ac_cv_xft2_hdrdir and $ac_cv_ft2_hdrdir and $ac_cv_fc_hdrdir) if test $ac_cv_xft2_hdrdir != "/usr/include" ; then OPTFLAGS="-I$ac_cv_xft2_hdrdir $OPTFLAGS" fi if test $ac_cv_ft2_hdrdir != "/usr/include" ; then OPTFLAGS="-I$ac_cv_ft2_hdrdir $OPTFLAGS" fi if test $ac_cv_fc_hdrdir != "/usr/include" ; then OPTFLAGS="-I$ac_cv_fc_hdrdir $OPTFLAGS" fi fi if test "$mgp_use_xft2" = "yes"; then AC_MSG_CHECKING(for xft2 library..) AC_CHECK_LIB(Xft, XftFontOpen, [LIBS="$LIBS -lXft -lfontconfig" AC_DEFINE(USE_XFT2) mgp_xft2_found=yes], [], [-lfontconfig]) fi fi fi if test "$mgp_xft2_found" = "yes"; then AC_MSG_CHECKING(for iconv..) AC_CHECK_FUNC(iconv_open, [AC_DEFINE(HAVE_ICONV)], [AC_CHECK_LIB(iconv, iconv_open, [LIBS="$LIBS -liconv"; AC_DEFINE(HAVE_ICONV)], [AC_CHECK_LIB(iconv, libiconv_open, [LIBS="$LIBS -liconv"; AC_DEFINE(HAVE_ICONV)])])]) fi AC_CHECK_HEADERS(fontconfig/fontconfig.h) AC_MSG_CHECKING(if gif handling is enabled) AC_ARG_ENABLE(gif, [ --enable-gif compile gif support in (need libungif).], [mgp_gif="$enableval"], [mgp_gif="yes"]) AC_MSG_RESULT($mgp_gif) if test $mgp_gif = "yes"; then AC_CHECK_LIB(ungif, DGifOpenFileHandle, [gif_ok=yes GIFLIB="-lungif" AC_DEFINE(USE_GIF)], [AC_CHECK_LIB(gif, DGifOpenFileHandle, [gif_ok=yes GIFLIB="-lgif" AC_DEFINE(USE_GIF)], [AC_CHECK_LIB(ungif, DGifOpenFileName, [gif_ok=yes GIFLIB="-lungif" AC_DEFINE(USE_GIF)], [AC_CHECK_LIB(gif, DGifOpenFilename, [gif_ok=yes GIFLIB="-lgif" AC_DEFINE(USE_GIF)], [], [-L$x_libraries -lX11])], [-L$x_libraries -lX11])])]) if test "x$gif_ok" != "xyes"; then echo 'FATAL: You need libungif to use gif images. pass proper LIBS to configure.' exit 1 fi for i in /usr/pkg /usr/local /usr; do if test -f $i/include/gif_lib.h; then gif_h_ok=yes OPTFLAGS="$OPTFLAGS -I$i/include" break fi done if test -f /usr/include/gif_lib.h; then gif_h_ok=yes fi if test "x$gif_h_ok" != "xyes"; then AC_CHECK_HEADER(gif_lib.h, gif_h_ok=yes) fi if test "x$gif_h_ok" != "xyes"; then echo 'FATAL: cannot find gif_lib.h. pass proper CPPFLAGS to configure.' exit 1 fi fi USE_IMLIB=0 AC_SUBST(USE_IMLIB) AC_MSG_CHECKING(if imlib is used) AC_ARG_ENABLE(imlib, [ --enable-imlib use imlib2 exclusively to load images.], [mgp_imlib="$enableval"], [mgp_imlib="yes"]) AC_MSG_RESULT($mgp_imlib) if test $mgp_imlib = "yes"; then if type pkg-config > /dev/null 2>&1; then if pkg-config imlib2; then LIBS="$LIBS `pkg-config --libs imlib2`" OPTFLAGS="$OPTFLAGS `pkg-config --cflags imlib2`" AC_DEFINE(USE_IMLIB) USE_IMLIB=1 fi else AC_CHECK_LIB(Imlib2, imlib_load_image, [imlib_ok=yes LIBS="$LIBS -lImlib2" AC_DEFINE(USE_IMLIB) USE_IMLIB=1], [], [-L$x_libraries -lX11 -lXext]) if test "x$imlib_ok" != "xyes"; then echo 'FATAL: You need libImlib2 to use Imlib loading. pass proper LIBS to configure.' exit 1 fi for i in /usr/pkg /usr/local; do if test -f $i/include/Imlib2.h; then imlib_h_ok=yes OPTFLAGS="$OPTFLAGS -I$i/include" break fi done if test -f /usr/include/Imlib2.h; then imlib_h_ok=yes fi if test "x$gif_h_ok" != "xyes"; then AC_CHECK_HEADER(Imlib2.h, imlib_h_ok=yes) fi if test "x$imlib_h_ok" != "xyes"; then echo 'FATAL: cannot find Imlib2.h. pass proper CPPFLAGS to configure.' exit 1 fi fi fi dnl add GIFLIB to LIBS if test -n "$GIFLIB"; then LIBS="$LIBS $GIFLIB" fi AC_ARG_WITH(m17n-lib, [ --with-m17n-lib use the m17n library]) if test "x$with_m17n_lib" = "xyes"; then AC_CHECK_PROG(HAVE_M17NLIB, m17n-config, yes) if test "x$HAVE_M17NLIB" = "xyes"; then AC_DEFINE(USE_M17N) OPTFLAGS="$OPTFLAGS `m17n-config X --cflags`" LIBS="$LIBS `m17n-config X --libs` -lm17n-core" fi fi dnl keyword substitution. mgp_keywords=`$mgp_cv_path_perl $srcdir/keywords.pl $srcdir/globals.c` AC_SUBST(mgp_keywords) AC_OUTPUT(Imakefile image/Imakefile sample/Imakefile contrib/mgp2html.pl contrib/mgp2latex.pl contrib/mgpnet mgpembed.pl) /bin/rm -f Makefile image/Makefile echo "be sure to generate Makefile from Imakefile, by xmkmf and make Makefiles" kit/ctlwords.awk010064400237450000000000000003770643272755700135430ustar nishidawheelBEGIN { counter = 0; # 0 origin printf("/* generated by ctlwords.awk. do not edit by hand. */\n"); } /^\/\*CTL\*\// { word = substr($0, index($0, "CTL_")); word = substr(word, 0, index(word, ",") - 1); printf("#define\t%s\t%d\n", word, counter++); } kit/ctlwords.c010064400237450000000000000021130666165300100131530ustar nishidawheel/* * ctlwords.c * From: Luigi Rizzo */ #if 0 used to extract and create tokens for mgp Reads globals.c, produces ctlwords.h. Lines started by /*CTL*/ and containing an identifier CTL_* generate tokens with increasing value. The perl code follows: BEGIN { counter = 0; # 0 origin printf("/* generated by ctlwords.awk. do not edit by hand. */\n"); } /^\/\*CTL\*\// { word = substr($0, index($0, "CTL_")); word = substr(word, 0, index(word, ",") - 1); printf("#define\t%s\t%d\n", word, counter++); } #endif #include #include main(int argc, char *argv[]) { char buf[1024]; char *p, *q; int i = 0, l ; printf("/* Generated by ctlwords.c from globals.c. Do not edit. */\n"); while (fgets(buf, sizeof(buf)-1, stdin)) { if (strlen(buf) > 12 /* there must be enough data... */ && !strncmp(buf, "/*CTL*/", 7)) { /* found marker */ p = strstr(buf+7, "CTL_"); if (p) { for (q = p; *q && (isalnum(*q) || *q=='_'); q++) ; *q = '\0'; /* must exist */ printf("#define %s\t%d\n", p, i++); } } } exit(0); } kit/sample004075500237450000000000000000001114712475300123605ustar nishidawheelkit/sample/.cvsignore010064400237450000000000000000230647077540100144340ustar nishidawheelMakefile Imakefile kit/sample/Imakefile.in010064400237450000000000000003620676243566600146720ustar nishidawheelInstallNonExecFile(default.mgp,$(LIBDIR)/mgp) InstallNonExecFile(mgp1.jpg,$(LIBDIR)/mgp) InstallNonExecFile(mgp2.jpg,$(LIBDIR)/mgp) InstallNonExecFile(mgp3.jpg,$(LIBDIR)/mgp) distclean:: clean -/bin/rm -f Imakefile Makefile all:: depend:: kit/sample/README010064400237450000000000000013700726547116200133220ustar nishidawheelThis directory contains the following sample presentation files for MagicPoint. default.mgp Style file mgprc-sample A sample file of .mgprc sample.mgp Short demonstration of MagicPoint features tutorial.mgp Operation guide of MagicPoint gradation.mgp Samples of gradation v6.mgp A sample of presentation material sendmail6.mgp A sample of presentation material multilingual.mgp A sample of multilingual features embed.mgp A sample of mgpembed Visualize these samples beautifully, TrueType fonts are necessary. (1) Create "~/.mgprc" whose contents are: tfdir "/path/to/truetype/fonts" (2) Copy "standard.ttf", "thick.ttf", "typewriter.ttf", "kochi-mincho.ttf" and "goth.ttf" to "tfdir". ftp://ftp.mew.org/pub/mgp/ttf.tar.gz kit/sample/README.jp010064400237450000000000000015600726547116200137330ustar nishidawheel$B$3$N%G%#%l%/%H%j$K$O!"(BMagicPoint $BMQ$N%5%s%W%k!&%W%l%<%s%F!<%7%g%s!&%U%!(B $B%$%k$,CV$+$l$F$$$^$9!#(B default.mgp $B%9%?%$%k!&%U%!%$%k(B mgprc-sample .mgprc $B$N%5%s%W%k(B sample-jp.mgp MagicPoint $B$N$*$*$^$+$J5!G=$N%G%b(B tutorial-jp.mgp MagicPoint $B$NA`:nJ}K!$N@bL@(B gradation-jp.mgp $BGX7J$N%G%b(B v6-jp.mgp $BH/I=%U%!%$%k$N%5%s%W%k(B sendmail6-jp.mgp $BH/I=%U%!%$%k$N%5%s%W%k(B multilingual.mgp $BB?8@8l5!G=$N%5%s%W%k(B embed-jp.mgp mgpembed $B$N%5%s%W%k(B $Be:No$KI=<($9$k$K$O(B TrueType $B%U%)%s%H$,I,MW$G$9!#(B (1) "~/.mgprc" $B$r:n@.$7!"$=$NCf$K(B "tfdir" $B$r@_Dj$7$F2<$5$$!#(B tfdir "/path/to/truetype/fonts" (2) "tfdir" $B$K(B "standard.ttf"$B!"(B"thick.ttf"$B!"(B"typewriter.ttf"$B!"(B "kochi-mincho.ttf"$B!"(B"goth.ttf" $B$r%3%T!<$7$F2<$5$$!#(B ftp://ftp.mew.org/pub/mgp/ttf.tar.gz kit/sample/cloud.jpg010064400237450000000000001003370676156115500142570ustar nishidawheelÿØÿàJFIFÿÛC     ÿÛC   ÿÀ,ô"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?úöâõ¢—vNsÛ·ùþžÔÑ©˜€ÍëÁÿ>ß­V¹‰Žq‘ÐÿŸ¯è*?' ÁÜØèz:W֨ǖÇL$ì]û[*m$àþ#üâ™ç¼œ œtõÅD.r{òÏùþªÎž0Ç=©ÇD]Á%¹ÉÎ2jxd!I'z犩æ[Œã8¥Ë©ÈŒwª÷ƒ_¸°.pÇæeô?J·öÆ-œ·Cßéþç¥eƒ¸d~•<*{ôu©·CDÚ¶¦ªÜ´yùóۃϯ¯?Ïyü>c®3ùÕ˜º-ù“QôïÛüŠ\©•tÝËò\40l‚9ãÛóüª¹¹lç'ó9ôçßHs’yýýë7‡ŠlÍ®§ Ã®L+õ çüñŠ+Î¥¹iÏŽUã®­Ïõi™Y÷"7LsŒÿJ¤QŽÕ­«G†ÎIç½eH õÁôæ½x^ÇmÈü³Ðtö楎Ø?Ÿ¨ü©Ê8»t¥GÈàOóÅZwØi&J–A°Kóþ½úT¢ÑY6¨$CžßýaùÔ&ãoÈ8ƒÉÿ?¥ tÇ<žsþÏ4Ét4ðœóëÎM?ÊQÐdøÏ¯N}½D$=s“ÐŽÄzŸj79Ür;“ÏçF¬Ÿul9¡r§¯OaÛóÿëÐqÆÉ?¿­Ä_¡#žúöþ½èpw`dö7Žƒð©(F‹ öŒŠcC“Ô`ŒŒŽÔü«‘Œàò84› ^¼yÿ?ýzWx@ÏHõíI´ûg·OóÚ§ÁÈ>®ÞþÙ)܆ˆ\–ÏRª†àóëRc‚?•=c-Ð}…°ÎØ©c\ž½‰ñüªx­‰öôõ=ÿOþµI¸mÞ˜ýq×µ ±\¡(HÎ01–ãñü½ºTF6«@[± ò^yÿ=ÿ^™%®ç,zœóùu4¯aÛC9Î1QÉ)#oõ«&݉l Øëýj­¶äd8«Jär܇cIÈSâm¤‚qV"\HöŸgKÆr{Rõ †/“vç?ýzO(íN?—çZ^H0óÇùëNФŒp;ÿž?*Ì¥ ¡lØÈ'üö©cAÉ+Æ=±þ}ëN[efÁù±Ð{ÿ*dvÙqÁ“–àƒßóª¿rÔm©ND,‹‘€8Ûñç¿¥*[gž{Ïáþy­ˆ {ƒÏåùTI Ü20@Ç9Î?ý^ô“oaÛ¨Èâ_ûëŽ?íI°sžO~}ñ×ßÿ¯ÍY]»Í÷ºs×ÿ¯ô§ìÝÉ$ŽŸ­;‚EF„çq‚{ÿ‘L’  q•'åÀúÿŸòjùý¸¨ÄeÜgg•$ô‘Ibù€ÁÏ8¿O˶*À góôô«[| .qÿÖýj³¸až[éõ⛓™r@]z '¿×ò皈X1=Ç×üÿ‘[Ëf‘¦3ëüéM¨ŽÉüÿ_Š)S¹Í›i"”\QéWàú“×üš¿qÌ8>•Pc#ƒÆ9hæLŽDBªBã‘Ûµ'—±F3Àè?Â¥UÜJ…ÁõÜÿŸÆ¬C3yÿg8¤Ý…dµ)5¿€GOZŠ[pPçÉ9¯çZòü½¤äþUP®[rß_­4ÛKsX™XŽ‹ëH°;´t<÷­y­Ô1ç“ùÿ.ß*ÛaxlW{-DâeĬT€7d`úU‹PT>sÇÿ¯ÓƬ¼I_þ½ÕÁ8%½9ôéÅ[u%±ïÓÛ?çò<Ô$`à‚3ëÆGùãñ5h,5P1;²NqŽO¹ÇùïRFª¸Îdvúg§ùÏ4=3ž8ãŽã*a:Ÿ©ÈRL á\7§ñýjcŒd1ÜÕ`Jc OÐr:ÿúªgÆFO9ϯôÿ?”òõ4D±ª—Æyíþ{RÉ `RóùÕH]÷uëùžkNß!yPxàp21M«jRÔ¥ö@™Ü¿<Ž*),·ôÈ==;bµJ''¿n?Ö™$a†ôö¡6RŠØÊ½Ý’W®?ƉBÆÛ¯¶:÷­#Æ1Ð׿¯µVšÙ‹ò{`tëRÞ¦Mt+!vp ÀïןóøSÔØ–;G|’p8ëžÉ©0§ #¨¤˜)ÈÎ3ÇCI´;4„•ÎCgãƒÏõúÕ9nÈ?)¹Ç8ü¿ÎjÓ¡~02;ß皣".ý¹¾^}ÿÏãW}Im±ñÞ°Îïcþ}?ZE•db3†þ~ÿýo¯­"Û…!À,§Ôæ²³>å,QПϧ§ù‘š“z…·±î$u'üúÿž*â¿—Áç8ëQÅfĹ'¾Ï·ùâŸ%´ˆcÇ8ÿ?•'$]ï¢&G2p2;àŠ“zä nîÏ¿çMŠØ€:ëŠY#ÞÛ@ûý I½ NîÅ…Ld;qŸóïV#P‰’>lsT"±Æ =LóéVQ䔂<‘ØSv¹¥ÑnWU r«Ï9‡¯è]$¦¸ëøŽ€‘H¥dûÿ&ãóž~n~nO¡Ïׯv¤ «Ç8è9ÀíŸNý}G¯¥†ªÙj:K`ÉœŽ{xÿ"©Ëjî ¥[pv­ÀÈU7ÆÍ»æQÉSõ?:Jû´µ!†!Ðué†éÛüÿžñˆÃ1nqß©ýib’f6Ú{cÓžßÓ¾{ÔÒ*0ć¿AF»³ŠîOMŠfBϸ’ýuÞ H rÇõÿþ½-á•e F dƒíý{ZÊ¿¶‘eR»Ÿ'¿×ë[ÒI»2©É´âÍ¿ó†G*pAϰúÔbîEc»žý©E èKOfî1ëþQNeP‚FæéŽÕO”çI7¡$—*ꤞ£ ÿ>Ôø2S“ÓºtëúU§HdSœ©äcùÖý¦œ¢ ØÆ9Ϧ?Ï·¡Ä8ÆíÛVPh žäŽÙ#?çŠã Nîy#Ž ÷þ_ýzÒ{fÝÎ9ì:ÔmhØÈ­J–¢(mŽ6 Çèj&r­•çåÓŸo¯ùëi­ðA ñÀíÅ;ÈÀ¤{ú»U] jÊ›|ìdc§8ÇLr:Õ&pr=EkŽyž2=yÿiµ-–ç'𦤓 ;Ü ¬PAÇéßü*x£¬z¸þŸ×󩤶ع8ã¨UQ×==>:Ö„¦ÐUK/úg8ôéýÜû1'^3Ççw#ôÿõW3‘J*Úä–ì‡TöüúŠ«4Á;và×§ùâºY¬|´ÈU÷ÇãÇãÀüO1™-¯Jy„n õçNÿ_ÂÓL–µ1 ‚zŒu#¥Fa˹Éïþò+TÚã;—ê}jXôò‡;I'¦{ôéút«½ƒÂpc#èçÿ­O‚ܻВ3ƒþ*ÖK#½OEnW$ƒ…ävàÿ/Ïëç·hÇ)•ë8ÿ>õ$ÖûcÉ^‡Ýxü}—å^ÐÑ´ô2£°Xã-‚¾„g'§LãÓ¿éÒ³æÓ\&dô`ýÓÐ}3õô­ðN\qÔñíÚ—ÈóAQÑíÀã§5*n,É'³9û}!@mÈD„Œ±'‚qéОxÇqïQÜh’JÂ@ž_ 1=3žÃÿךëFžrÛˆ.A¸Ž9íý{¡AåçŒgqÁ8ÀëÁãòú =®·D+ÂW‰È‹92¤Æ\G?Èúà÷Ǧ—Gíð#Ã`’\sÜzp>aÎ9Çððk¦ŽÅž¼Ô`ŽqëÈÙé[ò¢³>Lãæ×·òü*c !ÛÎìà?–~„Ö®³I]—(Æ1HçLJǛ¸•^ÿ/?Ïäô©n­£Œ>Ø÷2B€Häwìp éÚµfŠ~ !f9ÆA9ÿ'±ÚÁ`0Wpç'8ý8õæiÖã•’RLÀ6H~làg®qÇoÓ­V’ÛËïøã¦}?_Nk¡¸·Ú@¨6ñCÔcòõª¯bdLáWÿœõûv£Ÿ¸´¶º/ ó€ Žëϯ?ýn*Ø~\óŒã‚Gÿ®·¦µ1ÇstûÍÉãõê#¿j¢#ÏÌ ó’TmÏbôöèjã+ì%{èfýœÆ2}yüiélTçiôýóúV‰·ß‚Ž2vI{t>ü ’;}„§©á¿÷ºôúU¹š^èÆš-Çæ?ÏøÕSm¶P^Et“Z‰efÀa€Å‡$ôöàuç׿¾œ€ÚÙpGOÓ óŽj•Q[S&ú˜l½HëêNÏ4M …™ÿ<{{WIqg±1Èì1‘ëù¯5Qôü©%Iã‚JÒ3KR<Ù™b„rqÁéŒúÿi*ç$g=1׊‘4í‡'Î7çӱ榎܀ 2qÜã©Àÿõ{Vs’Ý ;lG$($g=IUËPFŽÙà)ã8=¿‡Ÿ~x¤V{ÁÃs€pHÀà‘ùŽ}°}³vÊܵÁ(wÝ\tÁÏ`}LŸ¡ÉÉ4NèžÜN±)]Áä²0POÐŽ8Æ=±EjE¦‡\ˆãú•¢±öˆÇšŸTb\éè7”;ò~^@ã×'¯þ}0L0Gó¶ö œäc õÏnß˜ëœ ¯°ˆK*œà’@:`töõâ ’Í‹‚K@àƒ» AÎ;{Wbž–=¹(k©s œ•Ù¼0xÎâqÓóç¥V†7”.Hç§§ÿª·d¶2Ü`go*ãŒgòÁôíÆ§µŠÆÐø8wƒÇ§Ðôã>‚«žÊÄ;¤`íŒ8Î8¦½²3qÐÍ_{,ÈxnþG¿zŒÄRT 1Ï$gñà÷éVšèh¢·°¶öß#1ÈIêqÇùÿõÕÝ>Ý'á×$q‘Ž¿ê?ý¯[Ú,–¼1žœ`ãóè9þT¶Ö& å“pÆOnxÆ®?àGðÅÏrdÒÑÿ<øç8ÿy!\8,OcÉÿÓëJ°”äÇ© ÷Àç9¨ï§;6Ç€r2Áð9Ûùã“YzVÖ.ÕF<Ôdgœñõ泦HáÆNFWäç}Ž8§#=Kk¿:Eó·l'-œävîy?kO‰ÛUÜÌÝù¸§PNzcóìMü;œõêºvH|Ÿl²óñ¸ =:ú{UK«$¼ Ùã'$ãðíÉÿõ×c $h±‚?{¯n™ãŸç\ÿˆ¬effŽ"T/QÏg#ß®O¥aN«”¬ÍiÔrV‘ÏM7ÙÔ¦T‚{ãéÏáþ>õ=šµêû¥”`·ò1“ëžüçžâ¢T;ж#¯nHàÿœ¨» «iÈÔg88Ú@=¸ÉëœöØWkÛMΧÈ!ò$ î`aô< ŽOCŽø§[Ûo¹Ûœ…äñÁôõôÇF5ghœ)S¸m~èå8þœw÷Ëá‰å>à鵉8#üõ•ÌÚl†öØ@¡Á$Tåˆ$¿^üŸº*f×PƒæÇ;zóƒä9¿wl¯R,qÇ<úíxííÍ62#@‡*Gý{ŽŸ¥J“±”wk©Œº{Âä•<çàŸ_óÞ´â´u [nqßž3ùñǶjXHrÌ (y÷ß‚áVb„î$×ÐôÈ?§ZR“êk¡öLIÀà ÇóùsÖ£k}êAÝ‚wëÇNþ£úÖì±FqÉ7½yÆ;ñß½@ð#@'¹#¾:g”‰rOÝhÇ6å8ûœ ýOÈT±ZpƒŒ§ ôÛúç×õéVÒ6.rK Jÿù#ëV¢µ.rIÁçÛ¦}€ÿF)IØN6ؤÖ€w1@ÈáÏNOÒ’=Œ@AžF}:à}N?Gªc]£j‚IÊä“ì1þ×óü:!€ùÝmÛx?.~£üâ²æoFL[Z|¤oFpCœúã½éËpN0M§#ÏBÏåR•M½G¨Îp9Áéþ{Òƒ"_%NX’3•È=8Í M‚ÖìC61Œã¹ïøçµX‰ÎÜ—ÁP~P¤(üyãå?L㎔†20BŒpXN=3ÓúzÒæèdƒlg$ܞǓÏá×רÍ5B²¹éÓÏàôî=H6–ÊÁ€'ÆïМg¦?J(„}âAÿë§OJIô*ä1ÅȬHÁàAŸ¯¾?’aðp2BþCŒ‚rãò8ât`©, _Ç=x1鎴’D}ÏâÈÉ#<õÏÓÔõæÅrª l‚Xã$Ÿ^ÿ\öë× ¡–OâôÉÈ9úñÔã¿PzTÉN¼ó–<SÉN½sœ‘ãz`cØtïÓŽƒ‘ÇéCzŽä1㌒7y<öì}:}*X§Û’Ä–dœ~éŸRþ8ÿëV“Ä7䀨9,1ïúŸçÅFê0 ¹$ã…ü}€ýxÅi̬&º˜×‘gnÔ'¹ã§ÿÒ«-‘(£ž?18ö#Ÿþ¿JÙ„?Î@AÝý7OùíNxB¨Ú ïÓ8`tïùqí¢••^ÚDÊkF1íÆ ÏÞÜ~}x¨˜y819=IôïžäËñèâ´QˆÁÆW!y</NœOnC6Ìž}Øc‘é×’?¡ëIUè‚/{"ÐO—“œpOÿHö[°@<ààÇ9®:Õ‘ PPm+нAƒùtªÒ^:ÈÁä\gŸâ”™¾Æ<¶{z¹ç§N:àwã>ßJ`µÈ ª#¨øà{úövü"ò˜ÀàcžÃñãõªÓDÉ&Ô®:Ž9õÏùü*ù¯ ¹¹•ŒIm<Ö‚qÀÁã®;gۨ㡶úvr­‚xxüÁž¼V¸³f'pÈÆ9'ÿ×øûûÕ "··i%]ª vÉ>¿Î«¥d+¥¢ÜώعÀaÎz瞣žÇß¾O¥O´êêpXã©ÎGùÆ1íß5%©¸¿lF~ï¯<ç©sÏ~½9ÚÓ¬.eV[•SÀôsÛ9ü+)¿fºΓµŒèÚLFzó€h­7Ó ¹>Añ’ÌA{ *y¢Íù`dÉ.ÓÉè£?©#æé“÷C7O~ý>ŸÊž¶§ÍÆþ½½=»uõZ%@ޤx6îG™öÈ®Žkìor³"G– Ãâ{~¸¨¥ˆ:ɸt £¸éü½ªëDd;”dKc©Ï¹úþ^Æ›å˜T“ó¯!†8ã§¡ÿõ\Sæúo±3æ Ì8ÛÇ'Û¯^ßýf­œW À½ˆÉãƒïúŸ^'½²Wœ19‰IËçåluÏáéü…Xg#¹5¯6—F­ÝH„i±28ÆzäœýzÿúóLv'3)ç•ÿ?*¯%ù#ÓÞ‰1#ŽIÜqž;ÿ:Ï©Ž‹I0 ÆâIÿ>Ÿ…A0#œn»cž9Æ.r!¸n>Zç?8 cëÛ?/Qß×£í®âh‹.õÁG_A’{‘õÍV¨NVVFŽ¢E‰æAæ¶Üxô÷üǰ¨gsËomX€@~1Ó?–qŠq¶Õ¯nÈEò`8¿%ºŽ¿¯ZÒ´Ò&µö‰[€ Ÿò+™ÍGYJìòåYÊVhe½Œ’æÉÈã ¤Ž˜?LóÓÛžõ4¶®vqœ•ÎáÆ ÷ü1ÐuÀ«6×v× pB:õÜsžçŸZ° IÂ(úž;ʹeRIêt©édr:Þ›©%ڨ܌L¸bTƒ€Nê:v'­eÛÙ1† åð¸Ç8޽ú‘ü‡#½î›öÒò™Ç»¾ÿ?ç¯7}¡Ol…à“|@çb§+ÎIïŸ Çø÷Q¬œynuÑ©hò¶2} ¼FXœw<š ³ÙÏ×ÔûûÿžÍŠp#`ÌN:\c·##·qR«dr„}zÿ:ÛS[°HðŒNyùK>ÜÿžÔÓj)Â)É'ôþ\ŸÌÒ‰ØÁ\°8ÇžýGøýj[ffo—ÿ'“œ‡ëRîµ-Æ4f6 Œsž˜ÏlþŸ¥]ˆ¤‘òNþ­žG#ž}Çò9=Å` 9<ðïüùã·­M v'n@ÉÀƒÜñþ{Žs“º$X~`2qÝ0:õ$qŽ?O¡¨$P ØN9côö=ûŒ÷©er$%xÚIâã’zwÏééPö‰[¦0Ì>ƒüþ•+¸‰"…N@;Pó’qÇלzò:f“Ë9+œ³9õnH9çœÓ– v|¸Ï ôêxõÿ'­2?2жÃ-×ÿ8§óU‹ÖÐå±É,æÏ9ÿ€ÿœáÓ¦Pîg·Lcû¿§aÈuÁP àpqž¹ü¹==sšŠUó"Î3X˜ÈêqëŸaÇ熷¹ $î<*ÁÆöHçŒÇnqÓè=19‰Ë…-ÉéÁàœv'žøüi|ÔuEoL9ÁÈãž:cùàU¦*Öù”qƒœñÏ|g§ZmÛqë}IÔ),ÝIäœþ·J¦nÌNÏ›¦9ê\g±ÿ<ÔÌRs‚O#¯ÍøþŸQQAoÙTÀnsÆ~ƒÛÓÖ¢)nÈK•ÝŽ„•ˆ’sÔ¼NO<õí×J|väKç¢þŸÔõúSÞ2+’GCž@Ço_Æœ³2ŒdÔvÇëþ}(¿bÛ8¶òN:aAàœÿ/JŒÛ–s“øžxä¯þ{¿Í>a\ ô߯_§åøÒ!v}ÝœŒAÿõù4j€¯$[$ ‚AÎHñÇÿïúš´Ts¼ØÇLd“ÓÿÕHbÜ0Hã8÷ãÓšG)0¸9åòý:hnúÇ}ÌnlÓ“þOÊ¢•AÎ í GËÆ:ã׿N:Âæ“ò£Žîy8íøzuöÅI°°Ém­ÇLñþyý=(Ûq=7!²Ì¬pGpOý:ûšp@Ãåe`ÞäcŒÿ?óÊ#²0Ë&‚¸÷$œzõΧ'÷¤ÛC¹]£Ë:ùƒ'€«Œ·sŸSÏùÉ©<°ÈCç×§ùäÐXïV?ÄOOÏ­I’ßtǾëClMÛVCÜ…È`6ž€û~];SÛ~â8<ƒ×çü* 7!_ºUéìvöõJ’) 6á¿»Çùì{Ó}ÉM7tA2Ü °ÁϹ¶}yã¯^œu¶sÆ?Á>þôSŠ–îVãC3iÈ9ëøžÔì ÀãŸZŠ]í€8ç?N£õíú‡ Ê`äc×üóE´ êø\‚zg<ŽO~¿­8¨ ƒÈ9àóHÛÕz`ŽÞ”§ sIØ›$îˆcEGÀ#¯ xÇ^ƒ·×¾)î9ù‘_üzVŽ›c Þáå†Á`ÙÜzsù~••?†®îÞ) >Cî(8QžÙž½ñŒ×G¦£ÀKGµ:‚wý}zþµÏVIFñzžMJÓö­=!½ðÔl™†_³Èys^@ ÷Ïùç'G±]ÃË2Ÿ‘ïÝÆwtäò}ÀÍvpOÔCŒt<æ¸ïh³Ý\[IL_2á~÷LðÐþ•ÏF«›tæír]i%h«Üìá“Ì$’ ö=³þzTµÊi×/o÷ó¸ó·€ÁÁôtõ­¯¶³Ý… g‘ßÓ­rJž…Ê‹ÜÃñMŒ±Jש`~f#+øœÐzõÆ2*xõg±Ò#‘ (üîGÁl‘œgñ8­·¹ŽH0HpÃÓ9ý+ Py~ÊB I ¼/§áþ⺩ËÚEBK`„гiª BÝ^L,È\ñŽŸ¯Òž²%Äm°†3èzÔZE·Ú-ùC»ø˜çköϧ~jÝÌKik$¬ü(,I(s“Ú¦\ª\¨Ù4—+9¦·ß\ÚTHH¶FõÏ¿¿½ ó¶ÕùŽqë\ì"ÔçžæXôÉלּí‰q`–ÉØr=ýzsØG¢Ì?˜$vØ=3ë×ôäšô¦½•¹ÙÐ’‡R·YTm8lŒg'¯_§òÇÔ…„D‚zøóŒñý%žÂâÍ!ÎàÙ'üôëT¶åÎýãæÀVn~œôïÍs¶¤·So} A„­æ„ À#>¼óž½N¸Ï^*Sœà†èyì~‹€y>¢,Þ<‚¨!Ï'·qï׎zóŠp|Æw ®F9?^IÿëתvM!Á6(ÜC(ëò ¤ñÓŽ‡ô9$ WærH ŽO'Žäg¨ç§QM,]Á'?Ž=‹¨<õôÍ>F 8˜só îxèpA${ô&§Ú\"®µÓ6ç Ù`rIÙÏüG½I+o]ê9Ï'üãÓ>„sPElÄå?€q¹FTútäzò1žÙ•âo/ 2>Ÿýaž€þ°­ÔÓ±.Ãux©ì;Ž:}OqŽ3lɶ2’ìy÷?\ûcÛéL‰Ñ™UeÎ \wüÿ2xïS£œ}åÓ¥[·va‚ »Ïç¥T–€Öš’²AÉÆ)8Ýóð7uãÓó©‚‘zqŸ×éPH7Dãnìƒòç¬Ó¹ ][åŸåÁãiîyÁôéÛëÅYªâ"’ïÈÀ ñ“þIÿës™x(¼éÔsõ«v-€Eb[† 9îÿ?Ξh¤cøŽÙ©Üž¢C`A$óÏáFBr¹ö`qÜ‚ƒœ€£«z}iCƒ>”¸Œ;˜«ž=?ÏÒ‘\“•ÏfÇlR°ÊŸ§®?Zd ¶>Ä“Î=±øc…>€’D„àééJ G–‰z~'ú‘RRÐ0¤ Èž¦œ¤Ù¥,§¶=ÇÓ¥1NåVÍHÌ»qߎ{Sœ~dv¦©ùFîLô¢×'u¨Ž]ŽLc“åNlF„žÙ$güjT*",œŒƒžÙ*3»—‚0zÿžÏA6ݬ$ì´E/dŽ@¡‹1ä¨\mãþy¦Å Ïv¥ÎàÜßçëZ‰j0r7ûŸð«[¢œÈ8È?ç?ãŸJ¿j–‰ƒ›½Â=>/€98è=ªâF±çh>•ÈJà ÇëþÏzž¸¤ÛÜ,“!º„ÜF¶sK4’G={Ô´TÝÚÀ&9Ïzá+(uÀAÉ竜ڰÕÙ‹"åI>ØæŠºCgå`¸Ïõ¢´öŒèUY‡è‹$/©ëÇþ‡>Üž*œ­#Ê0„Àä’ ?™üÖ¶.Ê£ùÖmÄ€v«êÏ©þ˜­ãY-Θ4–ÂE‘~uÞddqô?Ÿ_\óÏ5®mл3&T°“ü]O¯9ôãñ«‹ Á 㓃‘QÜN»ˆ ¦\3éÓŸQ’8÷õ1®Û5W{ û”fT$ç…8ö÷ãßõ¨áÖ,ôÛ”G÷²’¨#çœú÷©í®G—ÈIù{`™Ï~üQžÄöÓßC$„CÀÝŒŒsîqý½)*’äžÇ*U)BñÜô˜:Á!‡CŒsßHʲ© Á«“Ò§5»k¨’vÊz÷¡®YÒœ«F{Ñ5  *Ž€SgˆL€0ÎqŠx!†AzŠZÆí;š'mŽjêÅ ¹Ôôlà|ŽÝÏ?‡ÖÒÛoèI8;‰?Aú‘Z²Ä’däñÐÿŸóõ¤‰`ǦsÓ¯ÿ^¶çÐíöÍÄÍ·µ™¤ËŸROðßúÕÍJÉní¼²vŒŒ°ÀÀ?ýjå P§{þ5Ÿ©ßâÞxáݼ8 ?ž—ó“i¢/9É4Kmr‡lVèV4ÈÊò¼zuçñÎsï&¡cý…Ŵ䈦C€ÅrìÝsî=*¦˜ÚÀ…”žG ­â;ãj",Yb‘ÌlêÀcå'sùS³S÷YR¨íkØÚZøcBŠ·}–ÝÒ¸ô=jCÕ.5„šI,¤²*ÛT9åÆ~÷ÐÿJ—E¿ŽúÝÃ,f.Bú‘ÇQþzUËÝB;)"‰‘›x={þuNM·uy>£mÆé­Hî.àVxä–=ßí0=¿Jæïn#ó]b˪c$|Û}8=½?.çbïL´Ô¦’,¹9Ü[iüº÷þ•œb·ÍwK2œ)‰Ž öÏ¿?‡bk4Ôw;©rÅ^/RÌÊ2FÒ7`1=~¿ùæ—\g”€£ëßÜòsÅrÊZ‘³ÔQÇ'·éJ Éíøÿ/ziäóëúÒç#ßóÖ¡L|¤‚b-ׂOn}º÷=sýgŽS!b¬È[…ù·XöÎ;ŽÝªew÷ôÅ?qNÄžÕ¼fe5µ‹ÈUXÍ–8ÝÁ'‚@ãØgŸ_z3Îwu?{Ò³ÖVß’v¾ †3ïÛñÆ*q2ÂKmÛ’AwÉ=½ÈéžükKÜÁÅ–r@e™àÿŸóÞž /N¥Ff œŒ¸ÏN3Í1nw7ÝÈÆw‘Œãüyôù›&Ì”BªÄóøŸOëÇZl©É`ØÇñg§¯oóŠcO¸3Üúÿ°þµ—`ÏØq§¹áÞ—;¾ “ܰÑ ½ã€0(X֑φìà¯n¿Ï­EÏÌ@ÉäcžßZrܨɏ=? 9Ýõ%+lGmÁ‰ê8oÏüÿ€©3UÚUCËrG\Ò™½`Oluÿ?þª®vÃr[©ŽÌ‚QÔŽ>¾ÿJlE€!³œçŸùíUÍÆNöÛÿ×î:ûû€¦àùœL™ÓŸÆ¥JÚ——BÁrr@ïIeqœãרôÏáUýrO'·ÿ«4÷`q‘“Ï\éþEÎÖ¯¡mœB©Ç¯CøR£3œqÔ ¥ö’¦=sžzzcÓÓ¿áVsœ vñïõü½¹|ãå,f¢[8Ü<`ãÛ§¹üé¢àwäçøN{g_§_œx'ï1Î@éŽßýò*ÔÅf‡e‡êÔDÀŽNùúÕ;¸l»x^ UÚàÂ:¸8ì}ÿúý)òó- #%¹®H'MÞ$“ò+,²·üòQïÏùÿ>Õ©yIŒØúóôúb¦På!¨­¹`sÛdûTsåû³Žž•,Y+“‘žÇµCMjFƒè¢Š2/†$’NzuÏÕÕE=ÌQ z‘þ?Ïü+¦¤jQ{ž,&šq’ÑÆ"‰TrïYwRÜ V0§äéÅ2æiÖ‹ œzÖG„|Oq¯ßΓÛìXÛå~ÇüŒtö¥ Rå•MÒÜ™U2§³{€=3Á=³Q\*ªÀjjÁñ5ô¶q¯–­&îÊ~ï¿ÿª¹©ÅÎVGc—&£5;¹m &3m)òƒ±<èç×Ò¨ 9-äiYÌÜ"Fû¸äãÓš}å¬×ú2”sѰ‘s»ý»óÇÖ’âõ ° mb¹(8Á IØÇ·Ô`×jZyËšVåÙî-¶¡uöì‹üJ1³ðÎØÍjö¸ãó#*ÊÛ±!Á¶yüËÒ.#µŽâåT±ü+Œõ=½=±éÚ ½ñ;É}f–ˆ¯ç{³¡/·ëÏãÏŦݬkìÔª~ïKh2)Æ—y=½¼4 ren@ã$ÏÍÓ©ô=í^Jg¹Q,âÕ©Fè§8矯$zsÆ)u]Z"Ââîâ71Ä 2Eó?§üõªz‹t»ë61NbD\‘*ò‹Û#ÓúÔãÍ%Ï¢5”}§Mve÷Ô&‰WÊ;PâÏ>¼ŸJ¯»Ëu#Êd,@Á/§ùýzâ]ø«I{Iy]åM¦0ì;‚xÎqèsëÈ­M'P·¾…Þ' 0£$ƒõÇן圵)F<î"…9SZ“2wè~”Ò0==sSÈ…9æ¢a·Ç¥yrÔê„®†Ïùÿ=ÏçFIsþúô``œqKŒžyïþ_γ4öïëþ}éYwóÀÇ4tã¾k›ñ¬tmÙCÅUùu*0•Gh«³£I62WÜqS¨$õÀ¾ß§_zùçOýª,å¸ÝZ¨$äílŸo×ó¯Wð‡Ä]+ƃgp»Ôs# ÷ÿ´ÒùÏ”Üç çÐP¹öÿÖŽb”= R†+’8ÿôÐqŽçµ.3Ç8ªR%Á$¸ú`ƒßüÏNrõ‘UF#8Ü#ŸÔòxëìrs[?O¥87| téþÏá['s'u¹u·ûÇ‘‚H=©ëŒAݘàd÷õïרªû‰N¹$c_oÇüòøÎ÷'äÿõÿ϶ 2’,Gp^3ÛúÔ‘¹s^Äç§ÿ^£TèG €sƒþZµÙóc‘ÜÕÅØÍèIn»Ý }'üÿõédnI,:öî}x¨¾ÕMÃïcÿŸQPÞJ¿gb¬mú‘ÓÞœS”¬Ì­w¨]êʪV6 z€r;óŠÌžöäÆR/Û•ü;_§~x¬éÖäfF;œ äãŒqõÉëÐwÆ+¢Ó¦‰aŽP7Hƒô#éÚ½ÒWJäJËDT²Òe†yCœá˜Ÿ ÉÏù9­«iÊB˜AÓoAÛóÞ¥†øLÝ€}¿ÏùëN’Ý']Ê6“ÎG®9Ôr~ú2õX®UÕˆËüÿSVjˆºhX+üØ•£Š Þ÷o‘NzÖªéðŽ|µÜ3Œž¸ÍvÃ’;«ž-iÔ—ÂìUÒìã˜-Æ îäuü>•®½ë> d…ÙvmN{÷«ÑL³W±Ç4M;Üå‹V°ÛÈ|ûi#8ÁJäô™›Hº•Ly'8 ¯ç]•súݘ·ßprWÓ·ùé[á䵦ög=x;ª‘Ý6×KsÊPÜ Ñq M€é¸ØÎ}«FÕZuQåíãœðqž3éœ~†¶^ágxÉèw{zJÊtÜ%duÓ÷¢˜ @mQÁô÷ÿ=ýk.ïFƒÌYVYC)ùvŸ”œcŸÃ?­j;]Ã8äçG?çßQ–`äŽOjIµÔì¦ä¶g>t[ø„¢;•ØÇˆäbÛG±ݸ‘ãµB¯#«È)ã ö篹ëÞµ.nKÀå8ÊŒõ®NÖ9¤viÐÇ)c_y<ާ>Ù­ãWJúXô)Rö’æ} õ Ùe”(ò|¼F=¹ü8ú×3`WV»ŽÚÙºAó  n³žž˜â´õ©ê+¥é ”B<év‚±ç×Ó±õàz}¼^ñ%Å£‡*°©BÃqbFÿ>‡Ž¾Ýô"£OÍ«›U¯Qhê´ÿèÑ&ùíÅĤä´Ãw8!O{ Öû4Pªùj±¢ *¨û£üâ«ÛÈ µ2”ÈÇSÎÎjÝŒ³\!ÂíÅyµe)Ý7sÈSoY;²Â‚XàñÛüñTÙGÌV½ëÉn¼¦yéëY«t·c)=qþäý+Áµ{0žºÊ3׎½ &B{ðÅO$&éœò=ëÄ:’i|÷1TD, 8íÓëX5mNêoÚK•Ï|i‘ @²…'†?Ò¾fñÏä¼’UYƒ©8òÔœóž™ëõ÷üñGâ*ÜÉ+ Ó-“œü zu>ß§Ò¼GTÖÞPÌÀ }Üóǯÿ?C\s»Ñ•åñ‚S’-k!VÔÑ]÷¡`@ÎCsùsüˆ§x—VK%µ¼FŒgfTýŸåÈäZŸ‰]õp8c°–Oá×õïÍtr^=ΜöS°bgl£ºGOLô¯*s³hýž–1¾Ö;›ÝRÞâ5(ònteÊ;c¿«¥Ð¼g6ðêš˪Ç%¹<)÷=Ç—a^%áMn[[‰í¤VhÀÁRCmç¨^ãùu­?øˆøĦ“7-唜g8`qÛÛž*cVÍ1UÁ©ÆP’½¿~üøÅkñLH¶] Ã©ë»×ß5ê²Â#L޹é_ÿ µíCÀÞ;±Héåðrý:ú±_ N¤u-> ÉÿX¹üëÙ¡VU¯cñ¼ï.Ž º•5îËRe9ltǵ9ÀÛéM'çàÿŸóý('8ý?/óþMt¶Ï ÁžÇ>”Éþ½ÿÏÖã#¨ôâ“?þºW*žN{güÿ_Ò€zcóþÏC9÷ÿ?ç󣯿ùÿ?H8Æ; çËüÿœQŸÿ_ùüèöïéý?Ï¥(=9ëÔçüö¥˜íéMÈëŸ~½¿Î)FœU “Žyï×üÿ“Géîi7qÇéÛüñFqÛëÛ¢v!Æã³Ó?¯çSFß 'tÍU.A'9ãüÿ4L8ÉýZÕ3Iîl[ËëÍ>i Q³œ;ž•BÎñ€Í»ør9éëéôúŸ¦¬–ââ!Á±ã±üë¢+•§#–M-Œe#lª(úóþ÷íê8¯fÄ!Æ6ñðÿ9ªgKÊ20O;qƒÔúu–}«nÊÐZĿֺ*Î)i¹„¥dsú¦†ÛwíÊŒä˜þcÐóžŸS±•…ÊÇ/® °Ï ÎF¯ëè@ìÝ©V²n´–@Ê@¶ÓùS§]5Ë2︪»Xc$I?ÌÿœÕëVÊžNî§ŒÿŸþ½P:mÂ'–„ç9ôýzúÕ›H'€|çrsÐ\sÍc;5¹#îÕeBÀá”ã¯Z¦nÚ"‹.$n‹ýO¥OqÉòî 7TõöÇøþ”«k Rœžù<þõ…cf‘¼ZŠÔ¬'•Bã°É«ã|€cpƒÆÎ?Ȫ·zKÝa€å àÔ¶¬Y<6°=½f¤Ôµ 8µx–AãaŒ1Óçµÿ£¸,xÎÑÓ?þªk—àÔçüûãÿÕÑ“_¢È¨$€p2:Õ˜rÝßrØ!—úRQÑ@ü*1p6‚zœãçüûP× 0*lO+&¢ª™Ð’| yïE+ ä‘‡ö d 1Én‡üÿZ®š#Ç!òæö`WQ$H ã*%¶WÈÎIç?§øÖ1¤£¥ÎõŠ’8½R;•™TFÄp6€sÔé[¶6 6$ß¹ÿ>•·![=qÜý=;TÁp08úS…?gÔU1nQP¶Åxã)»'«cžú~•` {ûÑA!FOJÛs»‘­ÔO/–® úTŠ¡F{U/²Aopn3–èOop%'è¥T’û$Æ2³mÖ~¸û,¹ôõíýjù`:;Õk…[¸Ù:¡àž¹íôïþ{ÒI‡/2há®Ë [¨ç `ËùpjúÞ™åU‘Î3ʆç¸üÀ­Ïì’"»wÀËsÓsõý+UÓÖ%óœã–Ç·ç9?Læ»§V^îŒÛ EɨÉÜ¿¨Œ¡{ž„ô=»þ?ýlÔaîXì`8Ç9#ÿ×YöÃÊË2uëŸóïúVýŽÁºòì9nÿ…p]Éèz5anȧ&r 6+Ñ›ŸÇƒ¬$¶PÈ$ýÌØùOP=ò?ŸCÙᜀ¹$þ5«xsûbHÒg £æ Ôƒëùd~4éF<éËc/¬Nœm?ص–š¡ÎéÏ+“’ÄôÉÿ=+ORðí¦§sopë¶hr—¸=·z¹cd–ɺ$œ“øÒ^ÎР 9lŒúV²©)ÔrSÍ”åni½D‚Ú" 8ÇH*2aЍ ?…S¶¬Ë¾FÛèÝ3V.7ÄlÅŸºqQ%®£ŒœÞ¦v¤Ó}œ¦sŒc޼úœT‰lÓ`²ü½‰ééR-„ñÊìzÿ$gùSL²Ã¸2ôŒr?*º׺´Hï­ÿÑYˆ?/#¿OzòoŽçÉøy¨M“ò à ö<úuì2––,<`Ôþuå­$¾øu«ZÛÆeÂX¼(×ê1Œõðœ‹hô2é[ ÷?9|Qâ .uW;‚ !ÉÎ'ÔñúuèNc%„“ Ç#€0Gn{téX$½û=ì‘ÈOŸ3:Èr çèzþ‡µZÓuDm5&ˆ‰$vÉ`esÀ#ø‡Aê+–-;Ÿ´ºr„"Ñç"+V%–dðpùÇ<žk°Ðµ„¸Šs>É̬~éaŽzð{‚=Á®Å×Oý©&â3ïùšM?Sž0ª®B¸Tà†Æ1Æ?,~¿9Q®v}’¦åN ö:íVê{_†*DÊÝ"A¸¶{c¹þ¦¶uÛ«i䲸…“vA, à—Çô®:ûP[ëûoÞˆNî\ŸºßÏvü«KRÔZql0¾j¸VxÀØ£~#ú×=ô7p÷¢ü|ÑŸ^Ñç,(·$‚22^ãÜ ýðmÎt 4`Á„jpGN9þ_JüïøWvu_èåwe )Œ’8çÐôü»Wè—‡aé6ûw íÇÒ½¼#nò? âeiÂ/ÌÜÝ•ç§ô£vO=NsüñQƤŒšN:àW¡«gÂØqÏoÃüþTìûûõÿëÓT’¯qJ ³ƒÁ¤‰§ŸóþƃÏùÿ>õ!ˆÿÖÿ>¦˜ô4Éæ[‰žp:ÿŸþµ/\Ç ©#¶gÎ;þ=©E»g<ã½RBsŠêF2zg=ºñIŽ+DË‚FGRGcšB›?½SMj%4ö" ‘žøïþÏÐþ‡ªÃÀqÇ9ÿ?ãL{VUݵ³ïL¥8•.oAíÒ£™±fÌ$Ø[?¼Ç@3Ûõ§Í ÉÁè;žµfPtЇ!ßæÝœgÐÚˆ4ª$Å]Ú—»¹SI„´ê»68»sœgÐ|À{z×c¦6ûzW/bÎq‘Û©Éë]o½Æ8éÖ½Šªöì|Ò©{¢Ô’¤)R@8Î;óúÕ r3U¡EH·±ž‡5Q¯^æãˉÉç‚8ã×é\2ìk9jjÔ7‚­†#ëþ­Il@¹Î;šuI+FT†é·²IÃÒªÝj +쌂ִeˆJ¤­bOlÑÎÌG^øÿõÖ´Ò“4rIs%©j!³©ö JÐ…0 ðO@}ªºnr@ëþEN·j‡i$ànúS˜—4ÕËe€ u'µdKr ¹)*àƒŒµjy2¸á÷=øõüª·Ø† UŽèãLüÄc5Îì×™µ4£¬…»ÔX±ªîoâî*©@$îv9%&¯%„HJªz ±Éüÿ¥C6Ÿ u|üƒª°ÎÓíþ'»f±”VˆX›*r¹ÿ8¥[“#€sל T3##‡q<`àöïúÔÐA’¤gqëÏ'¯_óÛ½RÑ\†É¨«k 7ŒŸ­62çEY.Qîv«Ž1Ý_óøÕ¤d…K>õÁÜê{&‘ƒóg¨ö=2>§¡«qês-ËìŒÍ&JŽGøŽþ•¿)«§tv ÓŠZËÓ¯¶DJ6:¯F?>¿ç­h†cŒAêsÒ¡¦ŽW‡ÔiË«•óŠtр̼tê€l`ð}áInTR{‘ê8@v™QGbçÜo6<Ð\GlúS5»®õÕ%eß‚Àtn™ü­dxÇIu¹´’Èe¢$í,9={þ—åßN”&ã-YÕ´ËxÒÊ{Ó Å3 m¾nÏn‡ßÛ¿nµÓY’ñ‡(Søv‘ïךç´Í.Ú/c‰w± Èl|Äþ_ÏÞºx›zœž‡ëYWtÓ妬MnUð™ÀŒóÇCY7j !ƒrNqž¯zן„Ýœäg¥gM°‚Çaóý{W>ñКNÇ/©ÝEk&ÇÎ À˜ñ‘ï×ñ®šÑÒâhH*p?/ç^}â I®n[fíÿtžžƒ¯l§‡õ»6àEŽÎ–‰²@äÇ^øïéÔ€:!EÊææ•kÅ­z¤WìñtÉ?xç¯ùéXí©Ëw¨,0 …`]”p;g?‡ù5Qµ™åeÃyqœËÜ{u9ÿ ÓÑئ!ÆNqëøÿÿZ§‘ÓM´pó§¢z—¥»òœ©\Ÿ­K2†Œ†qëL2£?Ž„Ÿ­=¦@¹l€}EauÐ|¯©RHP³Ÿ“qþGùüi$ ˆ˜îÇ¡õïøÑ¨Üí†P€1¸“Îk0&øŽ )²O<óÿë­S¾¥F<­k$¾K@ Æ9è:õö«GP€‚åˆ#µ8… €Tgü÷¬m¦¤K“‹†–?~9ø ïÀÞ9Ôtë°B‰B®NÇàg¶sÁè+Ê´]PAtѳ˜ß$vãÜÇ^•ú£ûT~ÎVŸôYu$Xõh•'øÀ矧ùÏJü¼ñ§ƒïpyÁÏ~•[E) ÁœnPyÿ?Ïük±øyá¡ã?[E·|>fç(8#=9õÿãönÖGmjñ§z“øb¨dŸ†jWÖz­ÒXÿÕ‚9þ÷ééŠû©m>Ën«ÐÏùü+ξ x=4=Õ×Fƒž»@þœžõéæO2-§€{ÿžÕô8jNµçÜë2xÜSô* /œâ¥8íøbœÑüüDZüþç—Dq,¬®æüCîû{×g²šW>~uàºêÖDòß*óÇþµY[o/ ç<íhy@þ¹§<F8¡§÷9e[™Ý”d‰ •8Ï àŠË’9¼}ÑÜñøÖµÌNbi¶NrpqþsO¹³Ý0QÂŽ8®ÈSQzœ¯Ì½Ö:Ò B¥°µ)„È<㪶lÇ£=©,…Ì—c3m=øQì÷Äôh¼ Î;ÔéØmè¥GR?¨­X×Ì@Äà±8è?Éãüõ§˜Î@õè5ÎãÐÙVhÊ[b¹çŸAõ§ˆ>o@Š®›<6QÙGeíTå”y¸aᎪ…;»ÚÜlZlC÷›w“ÐuðéZ)n›åØŒñøÓ- uÎx©ëŸÖ¬ÐÒLÊso©FçLIÏ@G½9,<¸¶©ãŒô«y>ÔÉf+Ûñ5|òµŒ9Uîdêå­m]˜•Ú¸¥ðáßj®Í–#hëÎÿZ®Ïû蘓÷y9ŠÏ´+fÎ#8MÙÀ=>žßýz5{ѳ¤áÔÜ¢ ·¸3ƒÀã®(–î8ÁÇÎGe¨³ØäqiØ™˜($œÉ5(q’í~NÆ#ñÅGwj;wÎÐÆ§ˆâ# é»?Ëÿ¬iÐÙ€O^P½p=j’”d™ªŒy}ç©“ÔÉŸ÷Ç€)Óζñ—`H'kžm}œ|éµá}+XÓ”ÓhÅÕ„çeØÐM6ÖÆÖà‚85r,[9N3õÅcGpd‘ƒÓ¡çü÷©í.KÜÄœtÏSøÓP’™¬êŽ ê)¾bx~&ŠÄ›{{Æã‚v°ÈNz‘Æ;œcõüjÛi²ãçPHù»nÈç8ý<š¿«Ì%’eÂà“É\©ãßÿÕý3²;*±a´óԜ˂pk¥-N:£¡Ñ`t`­nÍ]Ü‚ÓП^z¨Â€ œãžk”Òõ&€4²¸c‡÷ÏN㯧ã[âô; )€W8lwõ¨’¹ÉQ6ËìáOJªnŸåàdã–è)·w!mÜöœw?ç¿J£¥j¢[“ „ù§æ‡=?‘ý)Æ›år±ŽØÒM>!yö¬±r;ý1ŸÊ¡ŸH[“!‘ÈÜÙ{}}ÏáùæâL’ªÀ¶3Š’£žIîG3L¨–‘AÄ D µxç­NŠ–è@8““Xž#»ºHˆ´Ú ë$8EÌóé\âjº¡€£ºùªOÝS¹ c<õ;Žœ×L0ò©k™N­™Ôë:²Á@ríÀÀü öë\½ÇŠÖÞ_-ÃgwÝÇO~¸ÂæòÚIÉ0¸ËÈN;{sí’{U‹]ÕXIäDe•à{Óüý+xÆ7ijg)Ê׋±ÆÞëRÝêyÆ xÏ‘Œzúã'­A¦K®¥ÃïX˜l‘<~ÇüžþŽö;›¯…2÷Ãö÷ñ’Ð'›Žo'Û?lëSÑ%`¥&“æÔŽûIþÐŽ%Œ‡æàðÙþ}¿•\µÑÚÉPòGoóëLÓŠ[F‘8òxÁùAö>õ£$*WxlsÔóþMqJ¤¾è(SMóIjI ÇE‰P¨HàóÅT¹ÖmR@2Ìz £©Æ*¥Á’i>lˆ×¢ÿ_åT^ÃΓzîü*}–—¹¢««înL‘ÝZîvŸàëþOZÍy·ÌŒÛ”ýÔnAúÔvâD‹›¦+zÎ0ñFí÷‚ãçšÍÇ‘jkÎïa¶Ð±U“jt*xéì*ÊF¨§LóŠ}‹wØQHFj…ÝÓÂBr:ãž?Jq3²%»Õ¥Hì¤,rØáA<þð‡í™ðÂÞ=;þ[h|«‚äHPAü=8¯·+‹Év„;AÎõ5埴OÃI¼kðïP´@žrÇæ¢˜¹õîjqT©´·GÐdx×…ÅÂW´[×ÑŸ’V ö[‹«6ˆ%‚ͽT AÈëÿë%¼P±ifá’C”|ž™íSx¯HŸÂ!tŠÈÈèã^‡œç=.õZÄóØ2G‚Urx=¡íÎxôô¯OFD´êClÿ3:ö!hÒ»Nr2ry÷¯vý•<>5oB>c!‘X¸;‚}:þUáR[K}2Cé\9}úÕ÷ìmðkQ²ÒÒúâ&òeÃ)wÂŽœô? ÎqéÄч=d’Ðñ¸õ<ºNþó>½Ó€¶Òa¶^# î8¢ §K¶[$“œóßš»§è <ÇiÛ®(:?ÏôÔI¶…qöxAÇËPGéî:ûq*w?š~±V¢obŽ“*Ü>ÒA( Ç_óÿÖ­+KuG,)=qÆsÞl>ÌÀ¢…Šâ¥{¶’@ ‚8?áXÊ)¿uh*uš^ûÔ¾¿*–e½ ÇçùSn]&Le³ þ_Ò°¯5É­·².qþ×j¥³%Ø öçß4G +st"X¨ìcÞÄú~¦nó´î!Ç~ã#Øgþ"» ?TŽæÙ.x Ø?çëXÓh’ßm’]ê~ðéó{cÜ>µ¤¶ÞËÉœŽ'>Þý«yµ8¤÷)/äFÒ]Gs·Ž›úf¤ŽÕTªÇaÔVN‘¥Ïo¸Èä)=é×õõ­x£òÇN{œ×Ò‹´Y¼nã¨ð00:RÑEdPÉså¶ãéëT¯­ä”*!<òxïïŽ*þ9ëøRÕÆ\º¡•íÔ[…‡(á½Ïô©eLgŒ÷UŒŸÇ üMgi:Ôº«Î·VRÁÄhèq낾:óšéK‹aQ°#ÀŸÆ²&Ò ¸)˜Ç˜§åte>Ä~WJäkÝFnN-\¸'iv€³ÏoÏÒ™ub‘¢—‘ƒç8À~54aâýÞàØêØj²ÑùH®Ë—õ=G°ô8¤ß+V¤ï{¡Tˆ2§–1Ç?{§¯o­@Ê\ddäô#òú÷üªµÍÛ\\¬FOì?·lç¦ùÿ"Ž[jwSM®fKfN[žøïÒ¯Uf$€£Û§ãW•ƒ ŠÂw¹·¡ºwO^jR@< ¤uE„+×ßšQM½•´¿!€` KpIºFrj «o-™ÀùIéKlDˆc?xô­l¾$d›¿,†T‘Û¡®oZ·û,á×">kªûžÞ•Ö”·P0 :g¹kE{o+8íÛŒzt¬ÿìÑ Ã¸P0¿/Ý=¿¯åZVÓ«NAô=½‡§ÿ^›4!0Ù\7LtúÖq“ކŽ·"‹E³·zÒ…(HÏAŽÿ…0ü¹'·zϹԶÊHäô<þ5v¹1NF”…@ÆAçŒUinŠpì{žÀÕ½¸†úà`~u]fš&ÏÌÏò¡hkn÷f©³ûHÞã ŽAö©bE@QÓŠ“E•î ýâò½úSî# &GÝnEJzØÎ|ÉÞå+‰ Š{c¹ÿõS!¸X_çéÒŸs€ Àª—yž[.BŽÙÑ?uœsŸ'¼µ/Iz‚NÊI­ K¸ßådò1Ò³x€î;ZO)£Bwg½g(Å«F£z›Àädt¥¬‹k¹(òŸ_éVädr$g$t$×7!µìX’d@rÀ‚j¬Ë=Á’R6ò¨î9ëÇÒ³bº->~\ãt­õ€|U5ȽE)]!»H ІöÉ/at~C `޵`g¿çA8=++š&Ö¨øoâWìÓiñãGŒ<7 ¼Vm¦izv­û²g[¹o‚1Æ×³nÚ¯<;ð«BñLúLzeÔÂ=Sû<Ú íXy‚ö)¥·dRÞLç€T ô¯¾ X†ù^ݧ2’s~´ÙßtŸ àûՉʹàß5\^ûªÌCÅzjïSæ¤ÔU¯aò@V<㚊;3‡Ç#ŒŽ¸4. “9L2Æ:ŸÖ¢—X‚Î@œ±ÀÁéõ¦”öD¾G«w¤#£†\uÆ>•–È^ Éé^•2\›„?/PÏ>ôëi‡›•%œ¹=ÏùÅW4ÔZ¹.œ9¯bÄÖ¬Ï÷‡©?ãúÓ€EhÔœç¿ÿ>ôÛ‹ƒå€{gëUD»Ø+6p:Ó=ë›Zž…:_hÖR ‚áëëKUí‰#æ#=qßëþýv+¬Ìä¬ìR/|ŒZDŒgÚIÎzç¥7íQgÅUžR6ç è(6[»`7ÖµQVEÝö%’õgž¦§ŽE|§ÜŠ£»MŒ &y÷Õn8B ÝÉ·4IEhŠWêKŒÓDHB.~”†a»hV'Ó¿9ç…k=P‰÷½j†¯8D ÔÖˆàOÒ²õxÈ`ãÇOZÖ–²W*Ú2¶œ£ïí$–çåëÀϧùÅO$ ¹†zûz~µ^ÚP£k~gŸ@Oçÿê’iÖ“‚{‚qÇùõ®–½ã¥H´›vŒ‘Ç8ãÓ¯z¶ŠS®;÷ÿ?çñ¡n­p7”ç’O¯Ö´ˆ* Ó?þªçžŽÄ͉8& 8è+!åNQŽKî5¬Ay‚î#9^Ý={{T†Þ6 •Éõõ¥r+3EY&9T^Øô¤"¶à œR¢„AÏÔÓ«!=Š)†TX~t„>šìNõ ^ $(,Jz¹qÈ+ƒ×ÍUšîH:Q@9¢¤>¹© 6p3ÿ×éN·œc ôÀç§áÒ®jp£9“vÐ '¦1šÌiLy8Vã ‘œcÛ©?JÝ’Õ~Ñå°Ü¬1ÆåÏLž?ÉŠKâ¬BÏÁ|Å³Ø û~™ìjC/ÚÀmá²Êäã±üG­XÓôò’àŽ£òïëÈüɪ¹:´‘;6|â dŒ dþýjè¢Þ [>ÿ_ÿ_ùÅVŠ#eÎ:€r?ÀÐÚœP±Rã*㾞¿çŠÍêsË]‹ži Øœã®÷˜¬›ÛÉYÊ Ìÿž•¡Úºò~aÏ#8íÚ°5Ú)Ø“wÒZ1F:ìH‘HÌ ¶îI ½ÏjÔ‚vT*ãsÉœúã½ré|‡Í´Ž9Ç>•¯§æ(I |¹Çùü½ªÍ%æ¨H@RÙ>ƒüÿ‘Q Û›žj{9c™Gw\:úÿŸJ·PäÖ‡;÷v1.¬ž•vzçüÿõê²ü’`ääòúqþ{ôl¡Ô‚2j§pÖöã î¤ÿ5"Ô¯¥‡X8Á<:{T³"H¥ `ƒ“޵œ$šè¨Pã8\žÿYŠÒUsç®ašÖ÷ º‰öêÄ0lp1Þ£žÀ°9ô÷­»=Hï‚)Äך=¤‘ÌéÅèÑJ,'Í×¶éS-”`‚y?ΧÀ¥©slµ¶)Mb$”¹8\çéïÖž–@u$Õª(çadS:j·CéVÔNO­€AèsIÉËq(¥°µ’&ÖÀì{ãÖ¤¨å${þt‘GÀŸa]cöÓ\¼ŸN°´²ÕlÞü+.)Ò‰ÕKbX=«ã~Íþ6ø£ñâÓÄ_ôÝS¶±ØÅöÈ#{yïbón¼¨Ö/%"3ÆY÷HçåYÁ²c¯ÕoÚÃ0É¡¦ –Юif0I3_3ØêN/#}>øÚ«¸äôê3ŽÝúžµàÔ©[ Zé)+ßTï¾×LöãNž"›iù5÷ÚÆÁ #Xý•ì<_à};ÂvòÈu8.ìõY$ÌW0›E-®ÿÞ­ÆpB‡gÂŽþÓð3NÒ[PÐôÛ %|9yöÙõMNH‚¯Ûî;¤`€yŽØ»ØP2kMJòІñØÛç!bE: sÓó5ëô·ñíõ– .Îë÷›§o¯ò¬i×\BM(Ýê£×ÕïòÛÈÖtÕ:;·e¥ú~Ÿ=Ï¥®mÝÔà’(Çéúþ5Ÿs(·„çŠÐ’íâ¸òü¬Fz“Ò‹ý?í òž¸ÿ úØË–ÜÛ1(ÝÞ;œbêÍ«yb&UP œç<ú~¥ek Þ¥®!0@Á8ÈöÇøçÔæ½ßD†6ÞÜçÞ¥—IŠIDƒåaÒº£ŠTåxö05ó3aà#öÚyÇlTÞTqÅœü¤OB3øýJ³:„LmŒgóÏåíT܆s·rGåŒñ×ÍÌÞ§¥K–¬<Ï7Ÿ{³c‘ÇøÔ‚=­ÀÁ#©ïþy¦ÚÚ’êYB’rÛF uçÞµ|€d$‚çüþ_­K’G\棠An"$޼Ã5)¥¢¹Û¹ÂÛnì(¢ŠB lˆ$]§¥:Š@ Z( ¥G<¾Zº¤'5…&©ç]Ê‹ªpIàuõúž+XA͌յmÌĶXö©gˆMÞž‡=*­àç®’^)KI ’ir+ü “Ð}{lýqïHÖåg]Ã0r:uÏÓ¯Ò·{€>†£¸€N gt­gÔ¾m,S€ˆ—  gÐóþzþuoí*-€k>HÜ.ÂJàðiîåÂîçŽÔ8ÝŠ2‹V‘½ÿϵT!“!Š‚yÁÆ¿éüên4îÎUæàTðYOÊ?È#ñéëbØ*ýÒǸüqZ’iÑ»‘¸'§qŒv÷õ«öš")É ñÍ]ÑRš ƒol ÿ?J´5.€ñõïUo-„N  ÿ'Z¯.Üð1ÈÿŸ_ҢəY=KWz›¸ÚƒNþƲ •æ˜n;‡8ÏN‡üúÖ¬–¿&0¨íUÅïUØŠG#“Çÿ®©šŠ6,£ Çz±QÁ·`‚@椬^ç,ÝÄ##ž3ÈëÓßéëDó¬jrʸ;ùúÖiºó' AÏ_OÆ©-.ËŒ/¹®=9¡˜.2@æ›P<6ÈØûqRgml6[ˆáûî£þу Á=ˆ¬{»°db§œóŽ;ÿúª‘“/´äuÆ8ü*ùQ·³GH×ñ€ÇÈ¥KØX“¸:žõÎ’SžP4¬q–8ÏLš,†é­Ñ× ˆÎ~n”ã"އ?C\jÝ3sœã¸&¦[Çzr;Rå§Øèïô«]NÖKk¨Vh`£þµy­û5iz“Ém!‚ÝÎí½óïëÿÖü+Ñ¢¿uÁÏùuïþzÖͤí"áÏÌ:’1YÔ¥ŠÒW\黦y…‡ìçáèŽë§–}ØÜ€ñÓ‘^—£è–>±ŽÓOµŽÚÞ5$jp1WXn¤ ·ÙG½g Téü ÄN¬ê|Lo’ ²Äw©)7 ã½€8ÈÏ¥m¹E¸È©ã â¥# ƒÐÒ*„PjCNÆT£k·ç ¤†( e‡¨^ÎjüЖùAëÓ?OóïK Ž%ÇNw`ƒ‘×ü+g-4:ý§» –±ycüÝxèGùô«Žù¦Up¾¹âžar=«&ï©Í&Û¸´QMnÀuëŒÒ u— åÎ8ÏJ….AeÃcœ‘ÓüÿžôìR‹eº@sA'<ÄÒÒ$) =4µÞZÚ@‡æÇcM+»DêveQ¹HÎqþHý+%wùí*çž„g×óÿ8«:y!äÝÈüN?ÏëVZ(¢˜FöîH'¯LýOëøWz´.’7Œz²Î,! )ÚÔcš³ù’·9ÇJŽÞÙ7mÚÇ©çÓ<-ïCòúÕË+6ìD­t·EG¢UÈQ3„^[oó¬­­ˆ¶¶HÄŠAô¨ÖÕ碡:€< ïéV ”J¼uiê‘N.:’ÒN)²aòœw<Ô’1ÆÞz×çüñToovq‚;ýiÚß”6’G­cJÍ+ïþzU¤÷7‚êËétec“Ôñõÿ9­8fÊà’qÜúzÖ5­¼ƒ§«n•ž™ÈïTÞ;nÉϯ¯JZh@#üÿœS«#†TS†`§ÜâŠvϽô UùŸðsžŸç·ÿ^’7ÚÜý0×ü)fÊ’[ž§bü£<òëšØÓ¢f˜nÿ?SÁ¢é"^…Ÿ=@%¹õväýhŽtBz“œdõÇOZKËVAóêGøVdÎñžãáÿ?ç¯)ê®GÅ¢5n5ˆ­—NóÉéYRkÒJÌ mõ;O¶yïÔV}Ù:üÅyíÇ×üö«M› W‡*1´ç©ÿ?Ê„ŠPH¿½ÅÉË8àc¸ç×Ü~Ur F€‚s†¹Ïùæ´"@ªãžÇ×ëšIÂ…cÁîAÉÿ=*[¾ŒÉÊîÈX£Ü­•¡?•d^Þ1ã8úvéúQ=Ë”1ǨëëYÒ‚ùÆÏn+XÒµÙHÄç8éVl­|׳Æü;ŠŽI¼{VÖŸ§PíþÏQW{¤’i©$dž¿¯Ö¨\ia Á ztõãô®‡;AÉÎ'¦) ¨3ÈÈëQ}Lc9/3—:l¤€0H>ŸÓüõ©"Ò¦'8tæ´ï/T—;G$}*ŠjO‘† 7_×õü¯V®n®Ñ<:cFÀ“Èç=?ýU§k”¹êqÈ«6£»ƒ×Åk£nUàò3š‡tg6ìG%ÀQŒNŸ×·ÿZ©]Þ9‰‚dduçüóVf…ÙÉìxëTä°•I8È=… Û²RV±Š×Ó¬™măסëRNwÆAÏ]ý[}=ÃW©ì?Lkg\‚‡qçãñ­“³OAÖz“,aK7ò­[šfÎXŽäñŸóéõ¬Q@pqÐþucíOd+:Rz¢U4žŒÒ½»Êôîô¬É/Ý±È ž?§ùÿ"/=åbKrz’j[{WŸT*ÚQ‡pà·3ù_ζ ÎÒJíϯZ­o§,awsŽÞ•s*˜; †úͧ°I ‰76qÇAšÊ¾¾VfUÈP:ô>ÿçùU›ëñ ciäŽÕÎË1‘÷n$ýO¯ÿZª*ÅFYa®f¸rÍÔqÏZÔ±Ë2–@ù¹À¬›vPsƒŒäóþÏáZÐ]o-üýiµsG±¦N(cœóšo˜¬¼g؃P,»· žßγ9”nÁ!˜²ž½óŒS"ŠA *y99šÚš†Æ:¥1ïÃã2+U}˜(]’\XàïAœg×ÿ¯ÿê¬Ë·™_#¨*½O¹ýzãñ­{Y²¸À'€Ïåþ [›5Ÿ'Þ‡§§ò«Œù]¤]ù}Ö2ÑÛgnàdÿžÿç)œ¼£ò}1øV|pÏ Þvõóõþ_çµ;ë¹ðÁF Ï?çóþ•RwJ[š“êQ[‚«€ÎGjι¼i[99Çÿ?¥gny>VV,zŒãÛüGò«Û³ŒŒ [¹ühÑû4µ%‹qb>½:ÖÕŒl©–öþµ®Ÿå(-µŽ9QþÎ*îV<ã'œ –Õ´2”›ÑU{©ž%ÊàZœÓ%ˆJ„`d÷¨Z=L–ú˜ÈÒçæ$søÔÚ}©Æõ q*wÒ¤ÞHÁ8µ^µ¶'ÍhÞšs+˜×(”ª¡vÀõ§R㎵™Æ4êŒy'†áGN{äVEäÇvÖ±ÁúT¶“ù²{ãßô«åFÊŸsXCEÓŠ+3…¸Q–Ã{Ž çüÿ“PñQÏüãô÷§JÃ~8䑎<ÿùìw‘¸õçò­ÎññüÊOBG žÿçvQÁ,ÜöPH‰ª##œgçüŒÓÒ`óõnHï”nöÇù÷¦Ec#¾Û“€Gqôÿ ‰nYoÏœõªÍ¾¬ñ±èqþÏÒjjXi¦Ü–`:8=8üêž©"‰NN1Ó=joíõØTŸsúÿžõ—s?šåŽ=T`ç¥-YV:$•U†AíŒñšÙ|S®Ñ…lpýu »*~céóÞ­G¨H !ûôíŸóš wè^]+ÊrÊxÏPpzÿú¿É­ 8<¥,ì c¡#Óÿ¯Xk©ºŸ½ÏNOùÿ'Þžº´ˆ~ðži=´!ó=ÙÑË2ù-·ž;Ž>•Ïêx87 :~´Ã«1·×ÔGAÆ<¬žÊÈÜJäÜt®ŽÞÙ-Îsƒ“ë\´wæ6q×hÏ×8íZVš©ÚwbøÿŸÊ”¼…8¶oTS¡‘và¨$Ÿþ½VQ/œ…àãƒþ}é[QSÀÏ|äŽ:ÒQkSžÍdÓ›~O};ŸÎ¦M0 pî:ý Yk¤Øç>½þŸ—ëQ¥Ú3($çüÿœ{Ówf·“C’Ê4|à䎵8PŸ18Çœ÷÷ªïz7d@Æy§Áx“1PpGòíIßvC¿R9ß Ì¡ö>ÿþ¿~µ‘s;7`c&·Ú! ç¹ÏJ} M’Ó±£›¡P”baJYŸ©àç9ö¨”rIõ­±£¹b ]£ëU.tÙQþéÆ=8ý*®mΙN)YNGcœ ÝÓî‰A“Æ@Æ:}?ϯұE›ƒžxõ­M?÷,»ŽÎØü}hvµFª üÜséÞœEDn£EÉl㩪ÇS†6l2ã¿=È›9¹Yw©ÈǽE0R!vžžýÿÏÿ^¨Z,õ$’3œsþzT3êÊH+œÿžŸýz¨­MT5<˜åLõâªË§«‚žÉéíÿתƒZòМÙÏëQ¾¨fÊŒŒŒØUY‚Œ÷±Ëãç«gåˆÀSž2>žßç­aiy^sßóŠ–0Ã;÷¡ê‡(ßC "³¯gÞJ3žr1š—r$ÛEÑÀ¨Œ8”8?Z~H ¹íëHó,I¹þ_jÎÆ:¢J¯"G*Í´Ž9¬ÛÝo`ÛÃuÏZĚ園Xdþ_äU¨÷-Sos§}^Ýz6ãè)ÑjPÊxpErcqÉ>Þõ<•e*Ã×çð§Êj©£² dG¨ IÀ÷¬K]PDÞÿÏ­%æªÒFFоæ¥+™:m= ×ó‡sÀÎÕÍO¤°…À §ZÈ.ÌÄ’Nx<óZZHÌÀpõ«m,lÖ‡IEWk†è>¸çõ¢±åg?#8ÙX€y_Jb©(öät'ü?¥Yläö8íÍ5G|ã=ÏZÔ뽈 ÁÉÇ#ü?óÒ2`uöüÿŸÊ¬Ë9†pj‰£U\œüÿ„40±<“žùÏëþ}}¨''9÷þ¹þ¿…9—kã¯#ú‰¦n<û þ™þbÜsÏ®OáA$Œ3þÇõö¤èH'ò8¥@m½³åþ&˜ »#¯ž?_óš SúžŸ‡äÐä¡nã§éþ&•›nqØg¯¾?•”ÕAòÿº¥Rì:A±dݾݠãñ¦ ßp9<ý? ‹ œ‘R¡‰Ï8Ïõ£b-rÂ^:¦ôãÛÔ}h®9ÎF}x'ôö¤†%p™òÍ[޹ÿ ‚Q‡Ç°?¥6ƒ•ý©ÎNsÇz»ex±ž+:2ƒß5h ¬3Ôíô¨kKŒÛRv>Áÿ=jE¼Sמõ€£÷A½FqÚ‚ìÿ<ÿ….R9Л¨Éäæš÷KÎpLûŸóü«ŸbD„8GæØÍ> ZHÃHãëO’ÊáÈ’¹5Ôë»p$O>}x㊥-ÙÙœŸ_åSH7°ROnÿZ©,J¬ª8 …à)–¶× z±Æ1×µ0ÌO\œóÐÓ‚e‡'ŸjnÀaÐâùˆd$¿‡†lœOOóÇZp@zÿ{úštjF} }FK½sÏZ–-ÆqÇqüÍ5ÀIG@õî*G‰UuÊAºN?J¤j\Š@û¤þcÿ¯W#·E$çƒÏ'§ÿZ³âo–B8Æ1ùOI HÊ@Àþ¤J<ˆó6£¼‚%*w=&šu(ƒòp3ùöÏùþ•Š\§¦í½)¬çc@*,ˆäOVojB$œrj©H$äz ÖN\Ó#DÍ”Õäg-ÆÀ}¸¨î5Œ0 1þ•d‰›®}hi[x\ñžÜR±j)l\[paÏÞü5îN8#¦0MU2žO½‰$tÉ'úS +Ü´.];‰äg¯øÿžõ±†ã®süê0ž=qøš|nK¬gätçµ$X3÷Iç uö©M’6ãŸçÚ¡7N…@ ŒŽÞÆ’;§!OÓð¢Ú\5.‹vãiç¥_·]»A!Wß¿^õ‘ö—†È$×ñÿ?F·²–sŸº2:ú☎¢k¨£U×úÖ§|fc´ã°çüÿ“Tüù6[üäC¼ÈŠOR?*I[b#.xõÁþTŸxF@É>ÿÎ)û@>¼šxÆyïÏjf¤bÐý8§¬{O'$Ÿ_óïH§?˜í¼!ÏUÏÐíÍ \.,rãI#–lþéNˆSÇLçþ¬<+‡€,J õ«Ö?) Íž2:vüÿ^¡†5‚Ã9b?/ÿUX€‘‚&M¿øö?ÏÖª)ÜMØ×†r±ÈÄž~ö1íEF¬"B†äÿŒ}ç¯ùŸÿÙkit/sample/dad.eps010064400237450000000000001264410643233470300137040ustar nishidawheel%! %%BoundingBox: 41 689 350 775 %%Title: dad %%CreationDate: Wed Nov 12 17:29:05 1997 %%Creator: Tgif-2.16J-p12 by William Chia-Wei Cheng (william@cs.UCLA.edu) /tgifdict 37 dict def tgifdict begin /tgifarrowtipdict 8 dict def tgifarrowtipdict /mtrx matrix put /tgifarrowtip { tgifarrowtipdict begin /dy exch def /dx exch def /h exch def /w exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y translate dy dx atan rotate 0 0 moveto w neg h lineto w neg h neg lineto savematrix setmatrix end } def /tgifsetuserscreendict 22 dict def tgifsetuserscreendict begin /tempctm matrix def /temprot matrix def /tempscale matrix def /concatprocs { /proc2 exch cvlit def /proc1 exch cvlit def /newproc proc1 length proc2 length add array def newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval newproc cvx } def /resmatrix matrix def /findresolution { 72 0 resmatrix defaultmatrix dtransform /yres exch def /xres exch def xres dup mul yres dup mul add sqrt } def end /tgifsetuserscreen { tgifsetuserscreendict begin /spotfunction exch def /screenangle exch def /cellsize exch def /m tempctm currentmatrix def /rm screenangle temprot rotate def /sm cellsize dup tempscale scale def sm rm m m concatmatrix m concatmatrix pop 1 0 m dtransform /y1 exch def /x1 exch def /veclength x1 dup mul y1 dup mul add sqrt def /frequency findresolution veclength div def /newscreenangle y1 x1 atan def m 2 get m 1 get mul m 0 get m 3 get mul sub 0 gt {{neg} /spotfunction load concatprocs /spotfunction exch def } if frequency newscreenangle /spotfunction load setscreen end } def /tgifsetpatterndict 18 dict def tgifsetpatterndict begin /bitison { /ybit exch def /xbit exch def /bytevalue bstring ybit bwidth mul xbit 8 idiv add get def /mask 1 7 xbit 8 mod sub bitshift def bytevalue mask and 0 ne } def end /tgifbitpatternspotfunction { tgifsetpatterndict begin /y exch def /x exch def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def xindex yindex bitison { /onbits onbits 1 add def 1 } { /offbits offbits 1 add def 0 } ifelse end } def /tgifsetpattern { tgifsetpatterndict begin /cellsz exch def /angle exch def /bwidth exch def /bpside exch def /bstring exch def /onbits 0 def /offbits 0 def cellsz angle /tgifbitpatternspotfunction load tgifsetuserscreen {} settransfer offbits offbits onbits add div setgray end } def /pat3 <8000000008000000> def /pat4 <8800000022000000> def /pat5 <8800220088002200> def /pat6 <8822882288228822> def /pat7 def /pat8 <77dd77dd77dd77dd> def /pat9 <77ffddff77ffddff> def /pat10 <77ffffff77ffffff> def /pat11 <7fffffff7fffffff> def /pat12 <8040200002040800> def /pat13 <40a00000040a0000> def /pat14 def /pat15 def /pat16 def /pat17 <038448300c020101> def /pat18 <081c22c180010204> def /pat19 <8080413e080814e3> def /pat20 <8040201008040201> def /pat21 <8844221188442211> def /pat22 <77bbddee77bbddee> def /pat23 def /pat24 <7fbfdfeff7fbfdfe> def /pat25 <3e1f8fc7e3f1f87c> def /pat26 <0102040810204080> def /pat27 <1122448811224488> def /pat28 def /pat29 <83070e1c3870e0c1> def /pat30 def /pat31 <7cf8f1e3c78f1f3e> def end %%PageBoundingBox: 41 689 350 775 tgifdict begin /tgifsavedpage save def 1 setmiterlimit 1 setlinewidth 0 setgray 72 0 mul 72 11.70 mul translate 72 128 div 100 mul 100 div dup neg scale gsave % POLY/OPEN-SPLINE 0 setgray gsave newpath 152 204 moveto 152 248 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 276 204 moveto 276 248 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 400 204 moveto 400 248 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 92 193 moveto 128 226 lineto 176 199 lineto 140 166 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 92 193 moveto 92 199 lineto 128 232 lineto 128 226 lineto closepath gsave pat27 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 128 226 moveto 128 232 lineto 176 210 lineto 176 199 lineto closepath gsave pat6 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat6 8 1 0 72 300 32 div div tgifsetpattern newpath 127 227 moveto 127 219 lineto 172 194 lineto 172 199 lineto 127 227 lineto closepath eofill grestore gsave newpath 127 227 moveto 127 219 lineto 172 194 lineto 172 199 lineto 127 227 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 127 219 moveto 91 186 lineto 91 194 lineto 127 227 lineto closepath gsave pat27 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 91 186 moveto 127 219 lineto 172 194 lineto 139 163 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 128 209 moveto 128 212 lineto 101 187 lineto 101 184 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 101 184 moveto 128 209 lineto 164 193 lineto 137 168 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 128 209 moveto 128 212 lineto 164 195 lineto 164 193 lineto closepath gsave pat6 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 108 157 moveto 108 193 lineto 153 173 lineto 153 137 lineto closepath gsave grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 105 151 moveto 96 136 lineto 96 160 lineto 105 195 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 96 136 moveto 105 151 lineto 156 129 lineto 119 124 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 117 162 moveto 117 206 lineto 168 184 lineto 168 140 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 117 206 moveto 139.00 202.67 156.00 195.33 168 184 curveto closepath eofill grestore gsave newpath 117 206 moveto 139.00 202.67 156.00 195.33 168 184 curveto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 105 151 moveto 117 162 lineto 117 206 lineto 105 195 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 105 151 moveto 117 162 lineto 168 140 lineto 156 129 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 105 151 moveto 156 129 lineto 168 140 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 105 151 moveto 117 162 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 168 140 moveto 168 184 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 120 165 moveto 165 148 lineto 165 181 lineto 120 201 lineto closepath gsave pat7 8 1 0 72 300 32 div div tgifsetpattern eofill grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 120 165 moveto 138.00 163.00 153.00 157.33 165 148 curveto closepath eofill grestore gsave newpath 120 165 moveto 138.00 163.00 153.00 157.33 165 148 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat7 8 1 0 72 300 32 div div tgifsetpattern newpath 120 201 moveto 138.00 199.00 153.00 192.33 165 181 curveto closepath eofill grestore gsave 3 setlinewidth newpath 120 201 moveto 138.00 199.00 153.00 192.33 165 181 curveto stroke 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 120 165 moveto 120 201 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave 3 setlinewidth newpath 165 148 moveto 165 181 lineto stroke 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave pat3 8 1 0 72 300 32 div div tgifsetpattern newpath 117 162 moveto 139.00 158.67 156.00 151.33 168 140 curveto closepath eofill grestore gsave newpath 117 162 moveto 139.00 158.67 156.00 151.33 168 140 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave 3 setlinewidth newpath 76 248 moveto 620 248 lineto stroke 1 setlinewidth grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 420 211 moveto 415 206 lineto 415 207 lineto 420 212 lineto closepath gsave pat7 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 420 211 moveto 420 212 lineto 428 208 lineto 428 206 lineto closepath gsave pat7 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 349 203 moveto 344 198 lineto 344 199 lineto 349 204 lineto closepath gsave pat7 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 349 203 moveto 349 204 lineto 357 200 lineto 357 199 lineto closepath gsave pat7 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 344 190 moveto 378 223 lineto 428 198 lineto 394 164 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 378 232 moveto 373 227 lineto 373 228 lineto 378 233 lineto closepath gsave pat7 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 378 223 moveto 378 232 lineto 428 206 lineto 428 198 lineto closepath gsave pat6 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 344 190 moveto 344 198 lineto 378 232 lineto 378 223 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 378 232 moveto 378 233 lineto 386 229 lineto 386 227 lineto closepath gsave pat7 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 383 213 moveto 383 216 lineto 358 191 lineto 358 188 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 358 188 moveto 383 213 lineto 417 197 lineto 392 171 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 366 160 moveto 366 197 lineto 406 177 lineto 406 141 lineto closepath gsave grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 347 138 moveto 347 171 lineto 380 155 lineto 380 121 lineto closepath gsave grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 366 160 moveto 347 138 lineto 347 171 lineto 366 197 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 347 138 moveto 366 160 lineto 406 141 lineto 380 121 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 375 166 moveto 375 211 lineto 420 188 lineto 420 143 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 375 211 moveto 393.67 207.00 408.67 199.33 420 188 curveto closepath eofill grestore gsave newpath 375 211 moveto 393.67 207.00 408.67 199.33 420 188 curveto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 364 155 moveto 375 166 lineto 375 211 lineto 364 199 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 364 155 moveto 375 166 lineto 420 143 lineto 408 132 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 364 155 moveto 408 132 lineto 420 143 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 364 155 moveto 375 166 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 420 143 moveto 420 188 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 378 169 moveto 417 152 lineto 417 185 lineto 378 205 lineto closepath gsave pat7 8 1 0 72 300 32 div div tgifsetpattern eofill grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 378 169 moveto 392.67 167.00 405.67 161.33 417 152 curveto closepath eofill grestore gsave newpath 378 169 moveto 392.67 167.00 405.67 161.33 417 152 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat7 8 1 0 72 300 32 div div tgifsetpattern newpath 378 205 moveto 392.67 203.00 405.67 196.33 417 185 curveto closepath eofill grestore gsave 2 setlinewidth newpath 378 205 moveto 392.67 203.00 405.67 196.33 417 185 curveto stroke 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 378 169 moveto 378 205 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth newpath 417 152 moveto 417 185 lineto stroke 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave pat3 8 1 0 72 300 32 div div tgifsetpattern newpath 375 166 moveto 393.67 162.00 408.67 154.33 420 143 curveto closepath eofill grestore gsave newpath 375 166 moveto 393.67 162.00 408.67 154.33 420 143 curveto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 383 213 moveto 383 216 lineto 417 199 lineto 417 197 lineto closepath gsave pat6 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 250 229 moveto 250 234 lineto 296 215 lineto 296 208 lineto closepath gsave pat6 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 254 214 moveto 298 194 lineto 298 211 lineto 254 231 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave pat5 8 1 0 72 300 32 div div tgifsetpattern stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 250 211 moveto 220 183 lineto 266 165 lineto 296 191 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 250 211 moveto 254 214 lineto 298 194 lineto 296 191 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave pat3 8 1 0 72 300 32 div div tgifsetpattern stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 254 214 moveto 250 211 lineto 296 191 lineto 298 194 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat3 8 1 0 72 300 32 div div tgifsetpattern newpath 254 214 moveto 271.33 210.00 286.00 203.33 298 194 curveto closepath eofill grestore gsave newpath 254 214 moveto 271.33 210.00 286.00 203.33 298 194 curveto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 250 211 moveto 254 214 lineto 254 231 lineto 250 229 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 254 231 moveto 271.33 226.33 286.00 219.67 298 211 curveto closepath eofill grestore gsave newpath 254 231 moveto 271.33 226.33 286.00 219.67 298 211 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 298 194 moveto 298 211 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 254 224 moveto 271.33 219.33 286.00 212.67 298 204 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 272 218 moveto 272 225 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 220 183 moveto 220 208 lineto 250 234 lineto 250 211 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 250 232 moveto 250 210 lineto 294 190 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 296 201 moveto 292.00 203.00 288.67 205.33 286 208 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray newpath 290 205 moveto 292.00 206.33 293.33 205.67 294 203 curveto closepath 1 setgray eofill 0 setgray gsave newpath 290 205 moveto 292.00 206.33 293.33 205.67 294 203 curveto 1 setgray stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat6 8 1 0 72 300 32 div div tgifsetpattern newpath 290 204 moveto 290.00 202.00 291.00 201.67 293 203 curveto closepath eofill grestore gsave newpath 290 204 moveto 290.00 202.00 291.00 201.67 293 203 curveto pat6 8 1 0 72 300 32 div div tgifsetpattern stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 296 201 moveto 292.00 203.00 288.67 205.00 286 207 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 296 201 moveto 292.00 203.00 288.67 205.33 286 208 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 296 201 moveto 292.00 203.00 288.67 205.33 286 208 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray newpath 290 205 moveto 291.33 205.00 292.67 204.33 294 203 curveto closepath eofill gsave newpath 290 205 moveto 291.33 205.00 292.67 204.33 294 203 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray newpath 290 204 moveto 290.00 203.33 291.00 203.00 293 203 curveto closepath eofill gsave newpath 290 204 moveto 290.00 203.33 291.00 203.00 293 203 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave [2 2] 0 setdash newpath 268 221 moveto 268 225 lineto stroke [] 0 setdash grestore % POLY/OPEN-SPLINE 0 setgray gsave [2 2] 0 setdash newpath 266 222 moveto 266 225 lineto stroke [] 0 setdash grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth [2 2] 0 setdash newpath 266 222 moveto 266 225 lineto stroke [] 0 setdash 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth [2 2] 0 setdash newpath 266 222 moveto 266 225 lineto stroke [] 0 setdash 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave 3 setlinewidth [2 2] 0 setdash newpath 264 222 moveto 264 226 lineto stroke [] 0 setdash 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth [2 2] 0 setdash newpath 263 222 moveto 263 226 lineto stroke [] 0 setdash 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth [2 2] 0 setdash newpath 261 222 moveto 261 227 lineto stroke [] 0 setdash 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave [2 2] 0 setdash newpath 260 223 moveto 260 228 lineto stroke [] 0 setdash grestore % POLY/OPEN-SPLINE 0 setgray gsave [2 2] 0 setdash newpath 260 224 moveto 260 228 lineto stroke [] 0 setdash grestore % POLY/OPEN-SPLINE 0 setgray gsave [2 2] 0 setdash newpath 260 224 moveto 260 229 lineto stroke [] 0 setdash grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 256 215 moveto 256 221 lineto 263 218 lineto 263 214 lineto closepath gsave 1 setgray eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 256 207 moveto 256 201 lineto 280 191 lineto 286 191 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave 1 setgray stroke 0 setgray grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 256 206 moveto 275.33 209.33 285.33 204.33 286 191 curveto closepath eofill grestore gsave newpath 256 206 moveto 275.33 209.33 285.33 204.33 286 191 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 256 201 moveto 256 206 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 280 191 moveto 286 191 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 252.50 200.50 moveto 268.83 202.83 278.00 198.83 280.00 188.50 curveto 282.00 178.17 274.83 171.83 258.50 169.50 curveto 242.17 167.17 233.00 171.17 231.00 181.50 curveto 229.00 191.83 236.17 198.17 252.50 200.50 curveto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 252.50 199.50 moveto 268.83 201.83 278.00 197.67 280.00 187.00 curveto 282.00 176.33 274.83 169.67 258.50 167.00 curveto 242.17 164.33 233.00 168.50 231.00 179.50 curveto 229.00 190.50 236.17 197.17 252.50 199.50 curveto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 256 203 moveto 256 197 lineto 280 187 lineto 286 187 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave 1 setgray stroke 0 setgray grestore % POLY/OPEN-SPLINE 0 setgray gsave pat3 8 1 0 72 300 32 div div tgifsetpattern newpath 256 203 moveto 275.33 205.67 285.33 200.33 286 187 curveto closepath eofill grestore gsave newpath 256 203 moveto 275.33 205.67 285.33 200.33 286 187 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 256 197 moveto 256 203 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 252.50 197.50 moveto 268.83 199.83 278.00 195.67 280.00 185.00 curveto 282.00 174.33 274.83 167.83 258.50 165.50 curveto 242.17 163.17 233.00 167.33 231.00 178.00 curveto 229.00 188.67 236.17 195.17 252.50 197.50 curveto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 286 187 moveto 286 191 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 280 187 moveto 286 187 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 246 204 moveto 294 183 lineto 294 187 lineto 246 208 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 218 133 moveto 218 154 lineto 243 142 lineto 243 122 lineto closepath gsave grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 218 133 moveto 243 142 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 243 122 moveto 218 154 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 218 133 moveto 218 154 lineto 240 186 lineto 240 155 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 240 155 moveto 276 140 lineto 243 122 lineto 218 133 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 235 152 moveto 281 132 lineto 281 173 lineto 235 193 lineto closepath gsave grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 235 152 moveto 281 173 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 235 193 moveto 281 132 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 240 155 moveto 240 186 lineto 276 169 lineto 276 140 lineto closepath gsave grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 246 158 moveto 246 178 lineto 270 168 lineto 270 147 lineto closepath gsave grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 246 163 moveto 246 204 lineto 294 183 lineto 294 142 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave pat5 8 1 0 72 300 32 div div tgifsetpattern stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 246 163 moveto 235 152 lineto 281 132 lineto 294 142 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave pat3 8 1 0 72 300 32 div div tgifsetpattern stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 246 204 moveto 266.00 200.00 282.00 193.00 294 183 curveto closepath eofill grestore gsave newpath 246 204 moveto 266.00 200.00 282.00 193.00 294 183 curveto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 235 152 moveto 246 163 lineto 246 208 lineto 235 196 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 235 152 moveto 281 132 lineto 294 142 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 294 142 moveto 294 183 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat3 8 1 0 72 300 32 div div tgifsetpattern newpath 246 163 moveto 266.00 160.33 282.00 153.33 294 142 curveto closepath eofill grestore gsave newpath 246 163 moveto 266.00 160.33 282.00 153.33 294 142 curveto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 250 197 moveto 250 168 lineto 291 149 lineto 291 180 lineto closepath gsave pat21 8 1 0 72 300 32 div div tgifsetpattern eofill grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 250 168 moveto 267.33 164.00 281.00 157.67 291 149 curveto closepath eofill grestore gsave newpath 250 168 moveto 267.33 164.00 281.00 157.67 291 149 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat21 8 1 0 72 300 32 div div tgifsetpattern newpath 250 197 moveto 267.33 193.67 281.00 188.00 291 180 curveto closepath eofill grestore gsave 3 setlinewidth newpath 250 197 moveto 267.33 193.67 281.00 188.00 291 180 curveto stroke 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 250 168 moveto 250 197 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave 3 setlinewidth newpath 291 149 moveto 291 180 lineto stroke 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth newpath 254 204 moveto 254 203 lineto stroke 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 556 204 moveto 556 248 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth [2 2] 0 setdash newpath 588 228 moveto 588 268 lineto 112 268 lineto -40 0 atan dup cos 10 mul 112 exch sub exch sin 10 mul 228 exch sub lineto stroke [] 0 setdash 1 setlinewidth grestore gsave newpath 112 228 10 4 0 -40 tgifarrowtip closepath fill grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth [2 2] 0 setdash newpath 232 268 moveto -40 0 atan dup cos 10 mul 232 exch sub exch sin 10 mul 228 exch sub lineto stroke [] 0 setdash 1 setlinewidth grestore gsave newpath 232 228 10 4 0 -40 tgifarrowtip closepath fill grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth [2 2] 0 setdash newpath 360 268 moveto -40 0 atan dup cos 10 mul 360 exch sub exch sin 10 mul 228 exch sub lineto stroke [] 0 setdash 1 setlinewidth grestore gsave newpath 360 228 10 4 0 -40 tgifarrowtip closepath fill grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 574 229 moveto 574 234 lineto 528 215 lineto 528 208 lineto closepath gsave pat6 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 570 214 moveto 526 194 lineto 526 211 lineto 570 231 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave pat5 8 1 0 72 300 32 div div tgifsetpattern stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 574 211 moveto 604 183 lineto 558 165 lineto 528 191 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 574 211 moveto 570 214 lineto 526 194 lineto 528 191 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave pat3 8 1 0 72 300 32 div div tgifsetpattern stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 570 214 moveto 574 211 lineto 528 191 lineto 526 194 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat3 8 1 0 72 300 32 div div tgifsetpattern newpath 570 214 moveto 552.67 210.00 538.00 203.33 526 194 curveto closepath eofill grestore gsave newpath 570 214 moveto 552.67 210.00 538.00 203.33 526 194 curveto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 574 211 moveto 570 214 lineto 570 231 lineto 574 229 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 570 231 moveto 552.67 226.33 538.00 219.67 526 211 curveto closepath eofill grestore gsave newpath 570 231 moveto 552.67 226.33 538.00 219.67 526 211 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 526 194 moveto 526 211 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 570 224 moveto 552.67 219.33 538.00 212.67 526 204 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 552 218 moveto 552 225 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 604 183 moveto 604 208 lineto 574 234 lineto 574 211 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 574 232 moveto 574 210 lineto 530 190 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 528 201 moveto 532.00 203.00 535.33 205.33 538 208 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray newpath 534 205 moveto 532.00 206.33 530.67 205.67 530 203 curveto closepath 1 setgray eofill 0 setgray gsave newpath 534 205 moveto 532.00 206.33 530.67 205.67 530 203 curveto 1 setgray stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat6 8 1 0 72 300 32 div div tgifsetpattern newpath 534 204 moveto 534.00 202.00 533.00 201.67 531 203 curveto closepath eofill grestore gsave newpath 534 204 moveto 534.00 202.00 533.00 201.67 531 203 curveto pat6 8 1 0 72 300 32 div div tgifsetpattern stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 528 201 moveto 532.00 203.00 535.33 205.00 538 207 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 528 201 moveto 532.00 203.00 535.33 205.33 538 208 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 528 201 moveto 532.00 203.00 535.33 205.33 538 208 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray newpath 534 205 moveto 532.67 205.00 531.33 204.33 530 203 curveto closepath eofill gsave newpath 534 205 moveto 532.67 205.00 531.33 204.33 530 203 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray newpath 534 204 moveto 534.00 203.33 533.00 203.00 531 203 curveto closepath eofill gsave newpath 534 204 moveto 534.00 203.33 533.00 203.00 531 203 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave [2 2] 0 setdash newpath 556 221 moveto 556 225 lineto stroke [] 0 setdash grestore % POLY/OPEN-SPLINE 0 setgray gsave [2 2] 0 setdash newpath 558 222 moveto 558 225 lineto stroke [] 0 setdash grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth [2 2] 0 setdash newpath 558 222 moveto 558 225 lineto stroke [] 0 setdash 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth [2 2] 0 setdash newpath 558 222 moveto 558 225 lineto stroke [] 0 setdash 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave 3 setlinewidth [2 2] 0 setdash newpath 560 222 moveto 560 226 lineto stroke [] 0 setdash 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth [2 2] 0 setdash newpath 561 222 moveto 561 226 lineto stroke [] 0 setdash 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth [2 2] 0 setdash newpath 563 222 moveto 563 227 lineto stroke [] 0 setdash 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave [2 2] 0 setdash newpath 564 223 moveto 564 228 lineto stroke [] 0 setdash grestore % POLY/OPEN-SPLINE 0 setgray gsave [2 2] 0 setdash newpath 564 224 moveto 564 228 lineto stroke [] 0 setdash grestore % POLY/OPEN-SPLINE 0 setgray gsave [2 2] 0 setdash newpath 564 224 moveto 564 229 lineto stroke [] 0 setdash grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 568 215 moveto 568 221 lineto 561 218 lineto 561 214 lineto closepath gsave 1 setgray eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 568 207 moveto 568 201 lineto 544 191 lineto 538 191 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave 1 setgray stroke 0 setgray grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 568 206 moveto 548.67 209.33 538.67 204.33 538 191 curveto closepath eofill grestore gsave newpath 568 206 moveto 548.67 209.33 538.67 204.33 538 191 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 568 201 moveto 568 206 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 544 191 moveto 538 191 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 571.50 200.50 moveto 555.17 202.83 546.00 198.83 544.00 188.50 curveto 542.00 178.17 549.17 171.83 565.50 169.50 curveto 581.83 167.17 591.00 171.17 593.00 181.50 curveto 595.00 191.83 587.83 198.17 571.50 200.50 curveto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 571.50 199.50 moveto 555.17 201.83 546.00 197.67 544.00 187.00 curveto 542.00 176.33 549.17 169.67 565.50 167.00 curveto 581.83 164.33 591.00 168.50 593.00 179.50 curveto 595.00 190.50 587.83 197.17 571.50 199.50 curveto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 568 203 moveto 568 197 lineto 544 187 lineto 538 187 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave 1 setgray stroke 0 setgray grestore % POLY/OPEN-SPLINE 0 setgray gsave pat3 8 1 0 72 300 32 div div tgifsetpattern newpath 568 203 moveto 548.67 205.67 538.67 200.33 538 187 curveto closepath eofill grestore gsave newpath 568 203 moveto 548.67 205.67 538.67 200.33 538 187 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 568 197 moveto 568 203 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 571.50 197.50 moveto 555.17 199.83 546.00 195.67 544.00 185.00 curveto 542.00 174.33 549.17 167.83 565.50 165.50 curveto 581.83 163.17 591.00 167.33 593.00 178.00 curveto 595.00 188.67 587.83 195.17 571.50 197.50 curveto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 538 187 moveto 538 191 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 544 187 moveto 538 187 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 578 204 moveto 530 183 lineto 530 187 lineto 578 208 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 606 133 moveto 606 154 lineto 581 142 lineto 581 122 lineto closepath gsave grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 606 133 moveto 581 142 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 581 122 moveto 606 154 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 606 133 moveto 606 154 lineto 584 186 lineto 584 155 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 584 155 moveto 548 140 lineto 581 122 lineto 606 133 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 589 152 moveto 543 132 lineto 543 173 lineto 589 193 lineto closepath gsave grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 589 152 moveto 543 173 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 589 193 moveto 543 132 lineto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 584 155 moveto 584 186 lineto 548 169 lineto 548 140 lineto closepath gsave grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 578 158 moveto 578 178 lineto 554 168 lineto 554 147 lineto closepath gsave grestore gsave stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 578 163 moveto 578 204 lineto 530 183 lineto 530 142 lineto closepath gsave pat5 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave pat5 8 1 0 72 300 32 div div tgifsetpattern stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 578 163 moveto 589 152 lineto 543 132 lineto 530 142 lineto closepath gsave pat3 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave pat3 8 1 0 72 300 32 div div tgifsetpattern stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 578 204 moveto 558.00 200.00 542.00 193.00 530 183 curveto closepath eofill grestore gsave newpath 578 204 moveto 558.00 200.00 542.00 193.00 530 183 curveto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 589 152 moveto 578 163 lineto 578 208 lineto 589 196 lineto closepath gsave pat4 8 1 0 72 300 32 div div tgifsetpattern eofill grestore gsave stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 589 152 moveto 543 132 lineto 530 142 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 530 142 moveto 530 183 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat3 8 1 0 72 300 32 div div tgifsetpattern newpath 578 163 moveto 558.00 160.33 542.00 153.33 530 142 curveto closepath eofill grestore gsave newpath 578 163 moveto 558.00 160.33 542.00 153.33 530 142 curveto stroke grestore % POLYGON/CLOSED-SPLINE 0 setgray newpath 574 197 moveto 574 168 lineto 533 149 lineto 533 180 lineto closepath gsave pat21 8 1 0 72 300 32 div div tgifsetpattern eofill grestore % POLY/OPEN-SPLINE 0 setgray gsave pat5 8 1 0 72 300 32 div div tgifsetpattern newpath 574 168 moveto 556.67 164.00 543.00 157.67 533 149 curveto closepath eofill grestore gsave newpath 574 168 moveto 556.67 164.00 543.00 157.67 533 149 curveto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave pat21 8 1 0 72 300 32 div div tgifsetpattern newpath 574 197 moveto 556.67 193.67 543.00 188.00 533 180 curveto closepath eofill grestore gsave 3 setlinewidth newpath 574 197 moveto 556.67 193.67 543.00 188.00 533 180 curveto stroke 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave 3 setlinewidth newpath 574 168 moveto 574 197 lineto stroke 1 setlinewidth grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 533 149 moveto 533 180 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave 2 setlinewidth newpath 570 204 moveto 570 203 lineto stroke 1 setlinewidth grestore grestore tgifsavedpage restore end %MatchingCreationDate: Wed Nov 12 17:29:05 1997 kit/sample/dad.jpg010064400237450000000000001034250676156115600137030ustar nishidawheelÿØÿàJFIFÿÛC     ÿÛC   ÿÀ•#"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?üª¢Š(¢º¯†ÿ |Oño]¸Ò<+¦hÝÚÙO©]É-ÄVÖöv°®én'žfH¡‰F2ò2®YFrÀÖ8þü7Ò®$’âãâߌh– u·¸Óü.±“Ìv“|7÷,DBZ‘\–™ 8¯ü-ñ?Ä·I¡ižu†Ÿ³íú­åÄVzu†ýÞWÚo'd‚0£*yŽ»Û ¹bôìÿ€ž ð¯Ùu[ß|HñšÞþòçÂ×qhÚµ)‘åKyg-Ô²«`6ûxW,ÀdF¯/ã_‰ºÏÄ*/øHu»‡}:`ºNƒca¦‘gŠÆåà‚V¬Ï¬PâVyØ2þóŸÔµ/øH?µu}_UÔ/üIwz³¼—+ç}¯Ìóy¦¤ßæïòð6¶ÿ2BYJàÿçÁú(?ðƒ±ÿåÍð¥|9sû­?ãWÃýBþO–ÞÏf³içÈxXüë:("Üp7Í$q®rîª ?Ôµ/øH?µu}_UÔ/üIwz³¼—+ç}¯Ìóy¦¤ßæïòð6¶ÿ2BYJ楩ÂAý««êú®¡âK»Õä¹_;í~g˜ÓÍ4í&ÿ7—µ·ù’ÊPôøf/\þïJƒÃþ(¿oõzW…¼W¤ë:Œþ¾U̳˴e›b6ÕVc…V#'Å?³×Å?hWZ߉>xÃÃú-®ß´j:¦ƒumoæ»äx®Y•FO%€êk¶×¿gŸh¶ÓxŸãN½qðûRÕ¦þÑXÍ’áÔ‘>1]TzßÂUÃhv×½¨jZÕ·“g§Ú4+ö;k!汆VÚ(˜ ŽÞ(¼°²><°_+RÔ¿á þÕÕõ}WP¿ñ%ÝêÎò\¯ö¿3Ìiæšv“›¿ËÀÚÛüÉ e(€{Wü.öÿ@øÙ©}‹^»Ö¾Ò¿tí&ÔmãŸýwÛ|¹cûU´^\k3$K!ò¥Xà[Yü«âgÃ}SágЧÑu+?Ræ’ËXÑ®ÖóNÔàñ‹‹[„ùeˆ´n¹«#£…tu\­KRÿ„ƒûWWÕõ]BÿÄ—w«;Ér¾wÚüÏ1§šiÚMþnÿ/koó$%” èøéª[xWÄZŠõCÅþ×õ¨µmS@ÔÉö©Ù&Yµ¯¤--¥ò–lˆŽ%ɉ#O&P*¢½«Rý/I2jbd¾µÃÁhDVòªIóï I@ø¿âÏ…uˆÞ$Õ¿áÑnoZgñŸf0iÚƒ²^K;%Ã3\^\™-Š­¡¸vg}æ2£x•jZ—ü$Úº¾¯ªêþ$»½YÞK•ó¾×æy<ÓNÒoówùx[™!,¥§ü{àëïü ñEÿÅ_ˆ7-ø·¡i‹®[i3È×ú–ƒký©e`ÖšóÊJ3µÜ¯ýžÈÏDµ»K4Sú_Â?ÜX^xÄßgÔ<_¯jÖZ…¦£ñ¯ÇV“Go³Ísnòi¢Òy.­u)ZK5Š)âòàÞ+¬Vñ’.;_ÚSö|ð¯À¿Ù{[Ö´?ø£[×|àhu}vMJò+»mjê=E˜êÉò N¢Ñ§–Ó£FìD»·Épù—EPEP^«û'ÉÓüÿ±ÏFÿÒèkÊ«Õdïù:ƒö9èßú] ø‡¡ëv‘ñXñ¹ ë_kÕ5+å³K­GKÖ_ÌÙwhÒ\/æìµûG˜Ñ‰•˜2Ao:óÿü7}£jº…ïˆu«wXÕ¦MJËY‹uͦ¹k+Le¾R2ÈXÊJ<{ÙÒ_&XZ3RóÄÛ_iþÕñWˆ.ÿ¶<ÝWZó¢ó¾Ñª§Ú¾Îͺã÷û¼Ñºáöº}¦ã &ßÞõ~ø‡¡ëv‘ñXñ¹ ë_kÕ5+å³K­GKÖ_ÌÙwhÒ\/æìµûG˜Ñ‰•˜2Ao:€yþ¥©ÂAý««êú®¡âK»Õä¹_;í~g˜ÓÍ4í&ÿ7—µ·ù’ÊP5-Kþí]_WÕu ÿ]Þ¬ï%Êùßkó<Æži§i7ù»ü¼ ­¿Ì–R€?µxïö~ÿ„]×®þ4üBþÄñ·±Ý-¥œ?Û:έêòÉtöï4RÚÊL–²yz‡Ù¤tžV’—íá¿x«Uñ/Âí'P¶ñHÖ–þÓÅ^>†ÛÄ:ÅÐ/$;¼ª-­¥óÖEÙm,áÞcö°¸Gåt„Úç4+¿x»_ÿ„bÓU½3Çâo3‹}WsL.¦Á{«ÉVq8¶·¸Úff™¡ ôøûá·€u[ ;?´â¼ŸRñ¼ÃAºbÒ=Ì‚.nÎHY%¹`³Gq0šÖ&E/å^$ñE÷Ž®u-Äþ!Ö5ï\M›IÚí®b²³Ës$…à Hk¥¾dòÔ=MKRÿ„ƒûWWÕõ]BÿÄ—w«;Ér¾wÚüÏ1§šiÚMþnÿ/koó$%” Õ|LøÇâŒþ~§ã_j®«ëOg§%¬PéÑùûÞòdŽ"‘Á,’¤.Â8|Ï$ŽÁ×÷œ®¥©ÂAý««êú®¡âK»Õä¹_;í~g˜ÓÍ4í&ÿ7—µ·ù’ÊP5-Kþí]_WÕu ÿ]Þ¬ï%Êùßkó<Æži§i7ù»ü¼ ­¿Ì–R€?Aá¿ x‹ã.«­Of5ø²I¿´og’1,"Ý™ÍÕýõì’¤ ie^%w’Hö ྠøáâ/ÛxÆyu›qüY4)¯èzݸ½±×¡óid»‘ä,ë(Œ¤±0ó¥tšWûNþÏ ðV? k6v:ƃ¦ø‚áßÝZÏ«éWqÚÙÏ5¢Š(¢Š(¢Š(íOÛ°é¯T ÅÌ™%Xü©j_ðjêú¾«¨_ø’îõgy.WÎû_™æ4óM;I¿Íßåàmmþd„²”ý×ãï¦ð?í_ñ^]#ÄúÆœâÝvîúÖ;æ¶’õ.µ …ày¼»˜)¼©UŽîå<©W"l¯ÚÃ~ ñF”ß¼­k6~%ÔÈÔ|=ªï½»Ð5Y%¸†îùÛ2¬‡µ˜«5Â-ϘRKgó<RÔ¿á þÕÕõ}WP¿ñ%ÝêÎò\¯ö¿3Ìiæšv“›¿ËÀÚÛüÉ e(š–¥ÿ ö®¯«êº…ÿ‰.ïVw’å|ïµùžcO4Ó´›üÝþ^ÖßæHK)@WHÑ5Ï‹:íÜvQøƒÅþ>ÕoLñÙYÙ>¡q¨nY¥º™Ü9•¥U°÷•™“`ÚêÞ𯆵[Ý[âwŒ.kž<еë?µÿÂ1iªÞÇ=Þƒ¡ÀâßUÜÏ4³j“N÷W’¬á$Œ]=ÆÓ4Å¡Ïõ-Kþí]_WÕu ÿ]Þ¬ï%Êùßkó<Æži§i7ù»ü¼ ­¿Ì–R€8kñ㇈¾+iZ„ZÖ³qinúš_ÁáÍ6ÜG¦É#,ÞeÜïæošìŽ?´N'¸™YŒ³’ƒ©j_ðjêú¾«¨_ø’îõgy.WÎû_™æ4óM;I¿Íßåàmmþd„²”ÍKRÿ„ƒûWWÕõ]BÿÄ—w«;Ér¾wÚüÏ1§šiÚMþnÿ/koó$%” «¤hšçÅvî;(üAâÿj·¦xì¬ìŸP¸Ô7,ÒÝLîÊÒ‚ªØûƒJÌɰô¿ þÐ6>(ø_­xâÓk1³ŸSþÑÑuPVmK@ºÝï¯!¸–Lʲ6Æ’Éð— æO:ÚDß'š|Røg®|ñÞ§á/Aö}VÃÊg]Ž›ã–$š6H©"oŠHßdˆ’&í®ˆá”}¤øVÇÁºTúÿ†/®>/üŸLÕ|K­êö÷Ky¤xZÑé.o>Ö“¬ªA,"hîX´%®"x|ç6ò¿šþØZ—öÏÆö¿þÕÔ5ßµxgÃ3ÿjj˶òóvƒ`ÞtãÌ“¾w0óæ'æn¤Åh¢Š(¢Š(¢Š(¢Š(¢Š(¢Šè>ø*ûâWü5á 2[x5-S¶Ò­e»fXRYåX‘œª± Á$qœÒ½ÓãÃþÌÖzÏ<ˆë«ªøÒïP“⯈l¤×¬õøŠêI`“,o{Ïš#»¹¸”.â’DµFiËvÚyUçˆÿ¶¾Óý«â¯]ÿlyº®µçEç}£UOµ}›uÇï÷y£uÃítûMÆM¿½ôˆÚ—ößìËðëU¸Õu cZÔݳl‘ßËåùìï ùeŽyÕövm×¿Ýæ×µÓí7I6þ÷Úö¿ã»_j3xßûÅ÷îµ;ßËá;Mk]¼{sPÑ É©<ðêæ¦²X"‚WwˆãÛd3|Uá‡8øáÿ ¯¢h^0ñç‰ö)ï¤Òô‰õ=þœÒMs:u•ÐÊÞféIe1áýUýšõC®ø‘>&üRðƒ¼uöÙæ– w^]YîÞ5žKö¸žÀÝ<(鈧UyÞfT,èQ¾ÊøKÆÚW…lþ _|Hø­o§B]3^ñíÌún¯zË0Ší¡†9Ö ‚ÒWÊÊ‚3vntæÖu|0ú7…nnï|1á]ÏWÕµ;mnëU‘gÖno5m½Ú5캀IÄšƒM¶âV2_[l7¨tô×À<+ÀÿŸWð„^0øsð¿ÄügâoôÈ~!|YŠÆ-GžîúÂ*ÞKÆ·7ÆæK0‘ÞKrò¾ù(=/^øK§xÏÄ3jüo¬|nÔŽ§³ìââöÏEÕ­Òâáí® E4’³:j±$ÚGp ‘¢Š÷íÖj½V§«_x®å.5 Ûrâxa¶YnekÖš/-bŠ0XÝTÇxˆ«þ”o”· ðo™öÿúzó´?åÿûCþ*  _ø§Tø‹®ÝkÅ×öÅþ¥´3,k"HŒ¡#Š8Ð\!ˆ¥ê"F‚á/•UoVüõ_ðPwí±îöö¡?Û¾Çyö8æûMöÝ_Ãcí2ÍöËò§›„o2çrÜL~Ð~ô¼ü„é÷í_öñö7ÿ|ß3íÿôõæÿhËÿö‡üU]ÿü']û_ì{£Åý½¨Oöï‡ñÞ}Ž9¾Óg}·WðØûL³}²ã|©æá̹ܷ´½(ãeQ@Q@jøOÅ:§¼U£x“Dºûµ£ÞèXÜùk'“Ÿ­[Ip>Áu¾ížvˆ]@EäÛdhoÌ¢2Å£>iyâ?í¯´ÿjø«ÄÛn«­yÑyßhÕSí_gfÝqûýÞhÝpû]>Óq„“oïz¿~7Ðìÿ¶üãkÿ쯇¾0òSÕ!ÒÒúëIºƒÌk+øAÃ-ät•Pî{yîAvB¹>4‹TÑuÝOGñoˆ×O´Üa$ÛûЭk[ß ø‡ÃÍáïƒÚïŠ,LÒµÏxoVµ‰o¼UÕ»j²ê÷·±Î_Pž=»IˆÂ Í,8Š9™~5Ôµ/øH?µu}_UÔ/üIwz³¼—+ç}¯Ìóy¦¤ßæïòð6¶ÿ2BYJþëûEøêú?‹Z&¦Þ6ñD•ß„¼+¯j‘n3mCáûv´˜?Ú•·H¤Ü±Y#7•GÛûÛOàïþÐ>Ö¾+ëž3Ô<+âK{ØÇŒ-‘±j7÷)¨Ü}§Ng¼‰ ²¥™%¼¦óanX´¤À5-Kþí]_WÕu ÿ]Þ¬ï%Êùßkó<Æži§i7ù»ü¼ ­¿Ì–R€>®‘¢kŸuÛ¸ì£ñ‹ü}ªÞ™ã²³²}BãPܳKu3¸s+J «`#î +3&Àê~Ï×ß-¬µïüñÇÆ­wÅ3IwkâŸNÖÚ.§™uöÉç6—QµÚOn#Užúa0i$*$+^•©|)øŸñOûU~!øçOм%ª^­»éþŠÖãþ¯µy— ­Ýiº5ÿ÷Ñ½Ææý÷bˆn¦ha»ùþÿàW†ü¯k¿~ jøéþÝywàÏ êö×z£Ü¢Þ4¿Ú¬ÌÖ–ÒùÖèLjn®Î !ÀkO럢“Y†Óþ¯ÁO^ߦ›œ/¨ßø–·\GöýQR7·×Ö×sZYÝá20ŽòÍ­ïáo‡ÞÐt+X¢ð¯ü%¾$¿Ýw«ø‹ÄúŒú»ë:”¬DWÆÌ4Öo(‹P `¼ùïã’3veÓ†¹Ðjzµ÷ŠîRãP½¸×.'†e–æV½i¢òÖ(£Ñ•LwˆŠ¿éAÖù@ûp¿Å@ÞѼ; |4ý¡ÿᶸ´¶Õ~ë··†¦o¯µY¾É5åÝÇ‹™ÝfI™ãY!Oµ€AÄWzÏç¯í…©lüokÿí]C]ûW†|3?ö¦¬»o/7h6 çN<É1+çs1þb~fêE<5yæü,øòßió>ÓðË^—wÚ7ùÿ¸oÏÚÍÿ¯7~nãïÎóOÚÿ´ußÎ¿Û RþÙøÞ×ÿÚº†»ö¯ øfíMYvÞ^nÐlΜy’bWÎæcüÄüÍÔ€x­Q@Q@Q@Q@Q@Q@«û'ÉÓüÿ±ÏFÿÒèkè­CV¾»ð ý2÷Å"Ôµ2þæÕõIZÎoKˆõiRK+…2›MzݧÆÂIŒ†ìÄ7ïû=ÿο²wü?Á¿ûôoý.†½ÿÄßñU|:øYüT3ÿ„›EÔ¿ÑuÿÜÂ_åø‡WôY{ö}n´yÉûÉüß¶4?>ÿ³ß€jü?ñWü$>;oZxÛPѾ$ëw¯ªøgÅ:NŸäèþ)¿X§ˆ¥þ›léö}^ßíáž8üå *Û^µÜgPÀøÅ¥ø7âtz§‰¼c \C}y©ÊÖÿ¼öEÒ5ØVÕæ2ê],0j’¥¨—ìI=¬Ì×ÎÏ‘#Ž~þFÏúž?á*ÿ·_øM¼Ÿûùö/Zùßíý§Îÿ—´ÿÄ× ðWüE£j²êÕ®x?Åú‹|Moaeã›{M2ßX‚{ÛÃys6¥£ê)jÚ‘X•Õšà“È…×Çþ4ø™ª|N×u=cž3ñ«â ú¦¶Ò[+$š”Kp–j±‰•%Gá<„žUŽ&XÔHé´gÅ|RÐ>jþ8ñ^±q®øJëRÔ&P&W±kzòÚn‡|hª¦C‘þ¦)ËB¼ÓÃÑjŸüU§ønxƒXÖ¼az%¼¶˜+}·\w¸ŽÏsKr«.ö\ÊQ£ûUÆÂþ÷¶øÇâ‹í{ÀWÄ!Ö$·Õ|%{©ß8vºkÝAuÝ|Á,Êò(v2LêebYyX$£jMð{ᱩËâ}cQø©ñ.?µ4­jÆ9¢±Ó§IÃê&WšGk»¸n"•ãIÞêõ±²æÞgâ¾;ø³Ï¼³ðdÏü$‘øzöþãSñ Ý}©5ÝfæaöÝB9Ifh`µ…¶$KUœ¤o<ˆ<ªŠ(¢Š(¢Š(Ö“«_h­–§¦^ÜiÚ•”Éskyi+E4£IÔ‚¬¬  €E}k¬ê[¿j¯ˆ÷Zn«¨6•ã/ ø£Æ³i“/“_oðæ«{b¬«#,’Çi~œ²In#MÈ’|Õà_…¾'ø‘öé4-3ΰÓö}¿U¼¸ŠÏN°ß»ÊûMäìAæeO1×{aW,@?ZÃá=[úÃM^/[ë¾×>øÓM:„·nãLÒu•ŠèÇ4qÊV {ø¬biÑ$Qk*"ˆDO ÉWž#þÚûOö¯Š¼Awý±æêº×öU>Õövm×¿Ýæ×µÓí7I6þ÷ï_Ù§ÅÚç…­—Sñ±}©kŸ {«)ݧ‡V–Oß#ËpÍ!3NZàÆ±›{³0º™M½Öï²]|yâ?í¯´ÿjø«ÄÛn«­yÑyßhÕSí_gfÝqûýÞhÝpû]>Óq„“oï~õýš|Q}®xZÙu?ëÚ–¹ð±çº²Úxuidñ½ò<· Ò4å® k·»3 ©”ÛÝnû%Ðkÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿQÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿQÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿQÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿPÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿQÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿQÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿQÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿPÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿWÿ ×~×ûèñojý»áüwŸcŽo´ÙßmÕü6>Ó,ßl¸ß*y¸Fó.w-ÄÇíïKá/x‹â]È‹CÒn5´¹™måºKlxå—3Næâ0¯÷—‘®㹕Øß-ëóÿðPOz]Ç‚ükð~oi÷×~ðeœ¶—­µÜÅïöΔ— sÓ<°ß[+‚°¼—Rn%w• ¸pʺ(¢€ (¢€ (¢€ ÷ÿi§íð³Äz*Ýê ­xE¹ñ-üÑ•uÕt›8X¥V–52Ù4Ω#ï²ÝLˆqk¼ÜýÏÀ{‡ÚVƒ©|UñÇ„Ä:e¾±£éZ&šº¾¥uc:î‚ð©šxàm²®ãÏVQ˜6¶ñèßü;¡~Ï7ÚÇÂÿ \xRðÇŽ|1~º¶¥«^úòõ!×fŠYKE¸X¶Æ©[®pÆC&á´•ý©¯lcý¤¾0i®ëi·~-Öï5 8­TÃý¡ åúÚžx®Ù˜+F.' íýïº~ÌÚïöõŸìÚ÷ö¡â kVøÍ©jš®Ÿâ ¾Ïeqt°ée®ÚäÞ+OsÈ’C½7K-ÄÑí`Üø_íM{cí%ñƒLmwXƒM»ñn·y¨YÅj¦ío/ÖÐóÀ•vÈ ÌÁZ1q8Xßoï}Óöf×·¬ÿf׸׵kZ·ÆmKTÕtÿMö{+‹¥‡K-v×&ñZ{˜–D’éºYn&kä€ÿ‘³þ§øJ¿í×þo'þþ}‹Ä–¾wûió¿åãí?ñ5?älÿ©ãþ¯ûuÿ„ÛÉÿ¿Ÿbñ%¯þßÚ|ïùxûOüMOù?êxÿ„«þÝá6òïçØ¼Ikç·öŸ;þ^>ÓÿSþFÏúž?á*ÿ·_øM¼Ÿûùö/Zùßíý§Îÿ—´ÿÄÔÿ‘³þ§øJ¿í×þo'þþ}‹Ä–¾wûió¿åãí?ñ5?älÿ©ãþ¯ûuÿ„ÛÉÿ¿Ÿbñ%¯þßÚ|ïùxûOüMOù?êxÿ„«þÝá6òïçØ¼Ikç·öŸ;þ^>ÓÿSþFÏúž?á*ÿ·_øM¼Ÿûùö/Zùßíý§Îÿ—´ÿÄÔ¿ýžµ/íO¿ /ÿµtýoûÄÚdÿÚš²ù~*û=ÔmçN<Ïô?Yy»˜yŸé+!ù¦ûNuN¯þ •ãM-¾Ç§Ûyž&Õ[Ͳ»ó¥¸ÿ‰7‡G™pžcù2Œl ¶<Æ‘>ÿ̓ҿfOÙþJ‡ö‰ø­â«}áöŸ5¾½5ö©e$3x­aQ6›©ÜÛ1Ýk¨E< д­xLоbÜIqó_íÙãO|RøiðÛâ‹<1oáËxƒ_Ô´ù¡´–͵]=m4[kké-¤¹¸04‘ۨد´ª#.àþd€ÑEQEQEl|{s{ñL×u†ðÏŒ¦:·‰ìmíTŦx¥£º“쯞äyžÞw;…¼óªù²ÛÜ)óKÏÿm}§ûWÅ^ »þØóu]k΋ÎûFªŸjû;6ëßîóFë‡Úéö›Œ$›{Ð|ø¡cà]WSÐüT5C៉á[èº=ÒÁ5ÄJÛซx)çÛLx÷`1FˆŽYÕøÕà|(ñ•!jÞ(‚ûY„ø‡Q{Ë)vêwd];¥YåG™d|ÓL±Í \]#CæDèàíCâ?í¯ˆ¶?Ú¾*ñßöǃ<1ªë^t^wÚ5TðôgfÝqûýÞhÝpû]>Óq„“oï}Wö(¼ÿ„]Ðu;‹ŸøIµ«ÿ‹>½Õdñ%ÇÙÇÚŠøšUœÜžP¡&RåZIÏ•åÊ0%ò¯Ú‡ÄÛ_lµ|Uâ ¿íxcUÖ¼è¼ï´j©áè>Îͺã÷û¼Ñºáöº}¦ã &ßÞú¯ìQyÿ » êw?ð“kWÿ|!{ªÉâK³µñ4«9¸ <¡BL¥Ê´“Ÿ+Ë”`JôV§«_x®å.5 Ûrâxa¶YnekÖš/-bŠ0XÝTÇxˆ«þ”o”· ðo™öÿúzó´?åÿûCþ*£þB?ôûö¯ûxûG›ÿ>o™öÿúzó´?åÿûCþ*£þB?ôûö¯ûxûG›ÿ>o™öÿúzó´?åÿûCþ* þB?ôûö¯ûxûG›ÿ>o™öÿúzó´?åÿûCþ*£þB?ôûö¯ûxûG›ÿ>o™öÿúzó´?åÿûCþ*£þB?ôûö¯ûxûG›ÿ>o™öÿúzó´?åÿûCþ*£þB?ôûö¯ûxûG›ÿ>o™öÿúzó´?åÿûCþ* «ÃWžoÂÏ-öŸ3í? µéw}£Ÿû6üý¡üßøúówæçþ>üï4ý¯ûG]üëý°µ/íŸíý«¨k¿jðφgþÔÕ—måæíÁ¼éÇ™&%|îaæ?ÌOÌÝO视¯<ß…Ÿ[í>gÚ~kÒîûFÿ?÷mùûCù¿ñõæïÍÏü}ùÞiû_öŽ»ù×ûaj_Û?ÚÿûWP×~Õ០Ïý©«.ÛËÍÚ ƒyÓ2LJùÜÃ̘Ÿ™º¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Õdïù:ƒö9èßú] {ÿ‰¿âªøuð²/ø¨ÅâK_;ý¿´ùßòñöŸøšŸò6Ôñÿ WýºÿÂmäÿßϱx’×Îÿoí>wü¼}§þ&§üŸõ<ÂUÿn¿ð›y?÷óì^$µó¿ÛûOÿ/iÿ‰©ÿ#gýOð•Û¯ü&ÞOýüû‰-|ïöþÓçËÇÚâj÷O‡õ/øIÿfØúÿûWOñÏÚ~,ÚÏý©«/ö[\âmU¼éÇ™o“˜y’ù÷H~k¿33~K^xûkí?Ú¾*ñßöÇ›ªë^t^wÚ5TûWÙÙ·\~ÿwš7\>×O´Üa$ÛûßÖŸê_ð“þ̱õÿö®ŸãŸ´üYµŸûSV_ì¶¹ÄÚ«yÓ2<ß&70ó%óîü×~ffü–¼ñö×Úµ|Uâ ¿í7UÖ¼è¼ï´j©ö¯³³n¸ýþï4n¸}®Ÿi¸ÂI·÷ JÜøg\ñߟüDñ\Ú‡ˆþøWÃ0ëþ1³›Rq.·u7ŠµÈ­acæ2Ìó\+\òÐÇ%ÃÎV)~`ñÿüEñOÆZ·‹:×KÕ"i!Ô%º_}¾[›´•.7IöKE X+|ñß„.5}CZÿ„_Ã>&ñ}¦©©j*æûM6^ µ–[›U–f·Ô¤»Ö‘äß!ó Ž3ŸÝÆ÷=ü+ø~3Geâo x¢á~ éÞ)-6KˆZööÖâë\½ÒPÅƼ÷s$p>XµE:5ªG¦r—>'ñ‰üMã=wJ´¸Ñ×O´Üa$Ûûß½fŸ_kž¶]OÄ:Åö¥®|,yvžZY#·øÃá #ᯆ—Äñ&•­j×ëáMnxe¸ñDíw$Bîù•Úuñ’7¶¸È ÞYš+y½U§‹ÆôÝ]Pý¡~)ø¯}ý¶>¹¥ß ò ã…1´·>›åÅ5ëG S(ÄÆºsʹçþ)èÚw‹¾0ë7×¶×/µøZïFðŽ—©ÞÝZjqÅi¨ &kÛ›Y¦ŸS»´Š ,¤6*mà3j #Ü> ¢¾ßý¼~j>(ñ7Ä/Œ:—ooc£Í¦Aãg%’Ú&§qqÜøç}áÝVÖüSâsG¿šã\Õ쌬³G­nv†öÒs91]îŽÙ¿´0$Bò+Eqx®5¿jkÛÿi/ŒckºÄmß‹u»ÍBÎ+U0ÿhCy~¶€'ž«¶Ef Ñ‹‰ÂÆû{6»ý½gû6½Æ½¨xƒZÕ¾3jZ¦«§ø‚o³Ù\],:Yk¶¹7ŠÓÜIJ$ïMÒËq4{X·>kûSøNÇTÕoþ+øcÅzƹð“âV§{®O=µ‚ Ó5í×rǤÞÛý¤…ž%œ3˜®&’•AÕü(ø§cá?†Ÿ¼e®k:ljî-¾)ëž*×ô­VE† ¹m­4Ù¥¹}¸»Ž2²@$Ë5̱@ rÏÿÈÙÿSÇü%_öëÿ ·“ÿ>ÅâK_;ý¿´ùßòñöŸøšêè×>,ibhÚ‡Åí{)5+ïìûWOøK-mqæ\K°KýŸâ ?´ ÎÛÖãÏ7jÿ‰¯ÑZ÷ÆŸØÓáå´Ðéú±ñË]Ö´ÏøH'Ö5›è`¶Ôî줸x´Ry-Ñ.ónê_ì†iã¹l‹†¼Mè"ý¤?ijº¶ŸðóÁø/¡4×Ý­¯‹M…–¥k¤H×Q^kœ]‰`Tºqu”³pÍÒJªEÈ?§Á:µH4-_Ä_¾!xž½òGˆ.ï™wêèX­µÝéi ^)_µC5ÊLó2¸˜=Ë^êøâÇÁx«KðÿÀ†š‡í7ñÄ?fñ=þ¹¬Ý[Úí{'»Š+Û©g‰VÚú&'÷o Íö¤•¥’Y“å_ˆ¾0øKá b)~!üTñíE§ý£O—Úuæ¥g§_Ioyp¶—WºÅÄ…¶ÛÞ\ÖÊ3lå^In9ý7ã×ÅÚÂ^/Эüi£ü"ðI™ou…¶‹û7H¸/c:NooÃI}wr âÝþÕ-ÓœàA@ZþÓÚn¹ñþ½kâ—ˆu sÅ·w³ØøWá߃4Õ´éd±óÍÍói‰{síõ¹»H¥†k‹hãkk•&ö‚\üÿûex/_øðŸÁ+µÿL¿“ûWÄÚÄw¾"´Öïu9çพÒöÕ–Þò+[]&ÐMoibÊ&„°ui¯öý²uM;BðÿÁ‡úgü$:¬.“¥ßÅâ -íÖ¥¬\²]ê qf×SÛµ÷ÚRÕ'¶že¸–ø QÆé|ÿà1ÐÏíðöjð¶>(øŸZ±³Õ5gÄÉu£®#Kk}leK”’âå"`U™Þ ¤žHÒÞh´× ÑEQEWªþοÿá|ø«\Ó¥Öÿ°¬4]}fæHm>Ùyuµâ†K;rñ‰îg¸¸‚ã2&æ“–Ú­åUτ¦ø‡cñÂvâç]Õ¼ 7ö^›crÝêÚ–Ÿ{äAÉ•Œv²±T- D‘’9B0MKã^‡àoíX~ZêòoV=?^¹'ñå©ó –m@8û £*‚+¢Y"žDšI|°Ò{WÁ h´·ìË­x{Å>8ñßõ/]¿†Zòñ%²žý-ÅŽ…ä’2•–þkÍHÛ´ï·ÍŽí¢*ò\¥Ï…^ÇcñòÚÁ­..'øºð–¼I­Ö5ñ,¾c€‘°v2jX·†ñ™×iºP÷üýŒuÏø«Ä÷Þ!}BóÅw7¯e¯h^"µy"Õ#wv½‹Pf•f‰£„€˜$Ì«$2Á@ý¨|GýµñÇûWÅ^ »þØðg†5]k΋ÎûFªžƒììÛ®?»Í®k§Ún0’mýïªþÅŸð‘뺧qsÿ 6µñgº¬ž$¸û8ûQ_3J³›€ÓÊ$Ê\«I9ò¼¹F¾kûXø¢ÇÅ?luHüCâ‰<=â hZ¼í|ë~nµ } [G¾24½d™%‚[¢‘´r½âˆ‰Œ¬ž•û^ÂG®è:ÅÏü$ÚÕÿÅŸ^ê²x’ãìãíE|@Í*ÎnO(P“)r­$çÊòå€}ÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿQÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿQÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿQÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿPÿ!ú}ûWý¼}£ÍÿÀŸ7Ìûý=y¿Úòÿý¡ÿV¯…¼-ª|E×mt}×ûbÿRÜUZE‘$FRòK$ŽnÄRõÝäspŒ—ÌÌ׫~OŠz«Ï„ßð‹øVçÅ¿uý?á¿…#½–ÒîãÄ­þ™s„º{¼†o´ÊÛ®Fï7ž×7-ºö)/¦ñšþÑ?ïµhü#i£ëü'âm14k_Ýè ¨x߯QO%ÚI<ÑÇt—4WÒ–Ž;™ã†æòV{­ïnàÇ?Ú'ÀV¿ üSðáœz?õMnoüBñIs¡Ã§+Ü$·qÈ—RÜBÐ_H*I$ÒË穼¸½Yî¾ ý¢5-sÆž/µñÆ¥ªÿÂO§kVV¶–^# ê÷ßc´‚Ù…Ò¼’4wÊ©\FÎß<¢Dg†Xd¯ü}ðsÄž9ý“¼]¯øîOøW^ ðÝ”¾!²³‘nou;ßK5¸}Jáâ¾¹¸ÛÜI7“qi3h´}cÇö7³%÷Šb¾™ ±ò„wSɨÜê×±»Œ¤ òæ\+—¤‚ਮÿãßÂoøQÿ5ߦ¿§øªÒÇÈžÏ\ÒÛ6÷ö·Gqo2rGÍ Ñ’2‚HVq†<QEQEQEQEQE{Wì‰à]sÄß|#­éwÚ~‰iáÝjÇQ›XÕây­ãš9<è-ÒÙe»¹˜ÀëœΘ«ÀWtû«âm¥Ÿ>0Zx']ºñ‰i§xš_ xcÅwZõÆ®‘ê¿m¿K«Ù%{ës|d‡J½XÞ¶F7°‰®ããÿ]øBÇöLѬµÿlM¬øÏZšá­µA¤\,4»•’íäh ¨n$XâšÖ为¸HL2ÉûßKÒh/‹?³ß†l¾,Xøºßㅯ̚f™â=vÒk‹»O*qrú}ýêÜG{g:{y?³üÙlçK‹‡V•AgúÿÇ?|K§|4ºðÿí9ðbßâ"šu_h_`ò"Š Ib¸{¥ûKEeª%Áû6اŒ4Òϳ3B‚~WVý–þ ~Ô²^ëþ(èþ#¸×!{x3^¾d›TXîŠG~ÄÆn¬níÖi/$·™¦,†o8\Ý5Ïüzñn¿áO‰ž'øÿû>|Eÿ„jOÙi~%>²[EžòÎK+¥½¾’Õf’¿³OÀ˜lya™®ä‘#H’yüWNøçð£ã¥ž®ŸtíCÁ^3Ö/a’çÄþµ’mR¡0KTÒÖæ/ô˜<ˉÖKB¡ÞæRðÈ7G0ªücý—¾%ü7ñWŠ4_øWPñ¼sù2^ëVÒG§xÖíµÀ¸ ëcâÚFT-¸Ü´Œ„Nó²êžUÿ#gýOð•Û¯ü&ÞOýüû‰-|ïöþÓçËÇÚâkô§Ãÿ‹¿´7Ãÿ7‹~|mðÆi7®/[Ä:²Gû™ež®uwÕ®`º°•Ø@[ÀþKùLÄç-u­ãOÚ?àÅýæ§áßß³¡á+ý~Éõõ–Émô{tG5Á’þîÕîmÞÖ佬ÞJ<בs4QÈëp~ÐßøRÿ„Ÿö`ý¯ÿµtÿý§âͬÿÚš²ÿeµÎ&Õ[Μy‘æù1¹‡™/Ÿt‡æ»ó37äµçˆÿ¶¾Óý«â¯]ÿlyº®µçEç}£UOµ}›uÇï÷y£uÃítûMÆM¿½ýJñ·í7ð»âÄ¿Ù×áOÃI­ük¤Cã;Å–úÖ«{öe®õ4¸†ãy·›íq;Ã4FmòÝ3«Kç¼™¹üÕðf‡â/¾2²ðž‘ªx£Äþ!ñlÒ__XÇ™¯5uFr÷J»dÝ%Ü¥ +=Ëm`„Ê÷WïXÇûX|pñ4·-ñg‰| ¯|?ѬݖçSŸZÔ5½ERXE/s<Âòmì’,‰Sá'ó•óWŽG‡g[›­?XÖ.£®x²Þc~¾½1ÊÉgyÊ—ƒLËö‹ÂÏöVæóż[ø­ñæãÀך„4_‰š‡‰uï Ù_A/Äm Ìåon&žòæ==ä¸ |ë¹¼©õ51É<Æ©–² ÏŸï´Q¦ÜÅ;&8axæáV66ûbDLžL±C$_™ußüøÇª|!×d¸·íÚUÖ݉eWW ëݬ¬ö[è<×{{¤Rð¹<24ˆàjëá&ð¯ˆaÖ´?Nø„¶Vþñ%‡‰æóô-bÃ`‹L±ñä—¿ü$¼O*][ª4%\Möt†ëì€|W£hü'…i»…Ú’éš®™¨éŸlç:•µÊÒê貋3w—QÒæ`]œÊcL¤3µŸ üPðƒ¼}¦xšâÈæ~ñ&íbÔyV0§âkw·Õ¥]zM*Þù¥7q¤Q/Ûo$É£Íu8G7•uûJè~ñV¡xFãÄüIªa„ïã4ÔuÛÈíßS‰-ŸX”H–—%..à[M.Ùd\G%¶¡1Dœ®µagqgâ)>&Kÿ¯‡îìµ;¨¾xB;„Öü[ˆuk¤Õ5©ÍÝäÉ-½å“« ‡¼ûÑš(c,òêøÅ~/µ¼ñ_„gí3Ä~«âï´K©xŠ]Xê¾ ×ˆ›[·†ò}@#Ûù)¸±‚HJ¢]N;ë Õ£øGð6ÛÅZ•íÆñïÇz”7ÚΙb-î.¼7æÅ&µsüÃ|’êªmåž34‚ôÚÏm,S^À¬²FSIø[âZwÄ«ÿ éŸð‡|'?Ú:†¥©\ÜDñjP­Æ­´ÚË4¥Ê¶ºiîáIF‡RÓw* ~ ø½á/ƒ¾ø‹ ø2Kjþ)Ó5q«i°ÜÇe¨ùSê÷ožiþÑs¬¬sZÜ§Ë ³ÎÖ÷×·h‹5yWÅx×ö€ñ6­¡=ÇŠµ-nkë­?HÒì‘á½–85ûH§¶³·Iã–+[X…Ìi¨•Æ?µm6§Åïi? µ_Y|Zñ-¿†ïµ §»ŸÃúi·×5É䙵‘ÓÛyòÃñ¦¥c6u ‰î R1¶ÔHÌ@WâWį|IøYûDêž#×î5{‹ÏÙÉje¹KÛ§' öt[‚fFDh›QŽ0Ûú ~Îÿ׺üYý¨ÛÆþñ/…¼-á;x{Äœzž§pÚÕö¯ªžîá"¿»gT»TšúfWx|ݱ[’CsáTQEQEî¿´]íŒ~0Ñ4Æ×uˆ4Û¿xVóP³ŠÕL?ÚørÝmO< WlŠ Ì£…öþ÷Í/ÿ7“"ß ³A$²2¤¡ Ïô®«¢øbëöeÓu}>ÿþ‡õ¯ˆÞ¹5÷ÄMj[M.Î9-ìòú‹Z^Css«Ç®Ø‘L’nÔŒ0O“<Ÿ^xûkí?Ú¾*ñßöÇ›ªë^t^wÚ5TûWÙÙ·\~ÿwš7\>×O´Üa$Ûûß`ý”2é×öß ¤ñ„ž/´Ö®­áñ®•á_Þñ3ËqHµ«½2æãPžXbšYa¸¹–'@×,Yåi|Óãšéu_Ûø‡Z¸ñM˜ñÞYYhŸü+¤ørè³\y·öú|‰!²gg±¿+}¦c,í f˜ø­¨ÜþÞZUßµ_‹>(Ñ|ßè¾ ÔmôÕ‡JžÝaûd†Y¯¬,ÞdÕ¬à†âFR‹­".ÜÄ/ü#Ó<=ãøamþ(k¶Þ ŽÇP¶ñÇ‹î.×Ûêr\O=´z=Ù:{*ýžöò)ZI ¬Ð»€oØüð?‹üUâ{ý/KÓõÝV[׺mSâ/ÄxÓ<iòWÅ‹ú§Å/6Þ{­>]O·jZ~ˆ%[ =@ÄÄWQQ¨3 ^5ò’13M=ʤ>d—ºÕÓ~ëž3Ю|G«ëš~‹á {íº¿ˆ¼{ª=¿‰|¦ÕcmRâ$½–âmJ "[ÚÅ> ÈeeÝtí~šßâO…|Cãÿø§Áÿ ~?ö­´ðiSÃkâŸ[½’ýZy5¯¤¾/5‰ûÕÌ–ìg¶r“$j“wú¡ðóPý«<¥ØYj ­/•ãÏ…ŸµZYøƒÄ_ͨÍóÝø{Znc›Sš'”[t‚+ˆ fIQ™„‘ÉoÉê¿ ›ö|Öµ½_Æw–þ:Ô´/ˆÞñ6¹xúŒrA~¿b×ïRîÎïíIö¶–ØÁu ‘£i&‘bhŸîÉå^,øá_ÚWÁ¾µñ^¡qeñºÎ³__Ž޹™+mNv”‘:F–ë Ê¡¼Ï.ä*B.꧇ÿiü=ÐµÏ øÇHÓüa®ZxšÛRm7â†u‚xš÷íqÎòʯó=ÜêÐM€=ÝÌÑ›yǘàjè_´§ÂÏÞ o…ß> |eñõ”ú´ºµªZ¢[ØE5Û\K+[Iq+JåÞ Ê–¸K¹Éó$ÔîšûWTý±uHuçÐ~7‡ü~Ùµ²Ñ<'¦¯üYâ =ºƒ›É.-gkC*Mqö£o=ËKæ ©¤’E.ëʼ/ám?öÒð'ˆ¼WâêøKG½ŠæãN½ñuŸ‡ôë;û¹f´jQµ¼[J‡Ïˆ]ZZ¾kÛw1ÛÌ·øè4ߊ~ Ô4¯éŸ¼qñ»Ä"eÔ5ÍkÄké~HŠÏw5Ö¤nî¾Ñvß,¥N±q Ždy-Þ0'ô¯xÞãºߋ´OêÑnpuÏø›\†ûX½¹TÖ,ì¥oLeÓ­¢ÍindÒ⺸…îe(Îx¯ |nðVáïxöpð^±ñƒ]¹˜_x—ž/…í<7u·½iîõ{‹›„–f’ÞI£’+·†Õ§ç†(›ä“Çþ(êv~+Ôe×~,xÛPý£|goe}sa§ÙÏq§xFÕb·ÔRYm„­Õô[´¸™å²‚ÚÔ::ï½|Sã¿ÚóY²»ºþÙ°_í=RÞÊàµÑ­æñ -~"A-¤qyÍ’ûÈ®áŸW´c|QÔìüW¨Ë®üXñ¶¡ûFøÎÞÊúæÃO³žãNðªÅo¨¤²Û#[«è·iq3Ëeµ¨t>uÞ zÖ×?ágþ×>*¿ðŇüTó\kjZ~mö[=&=Ïâ(ÍÜ02Ðo˜Â†éEö餌jÛK ¯*øñ3áçƒï5ĹŸþNµ}{quq§Ú9Y™¦ÔнåË´­w*­ûÆÛ^êa„’×YAòŽƒÆ¿ðSßÏà¼'ð×ÃÚ?Â[{ÈDšî©¢¸Ôµ[牢¹º73eÕ¥[y¬^ä4aËhÏÿà¡kŸYŬ[ëϧC¥é·…´ÒL²Ü[é–°O––i¤Ü%ŽEa$²HX;³OεkVÕ¯µýV÷SÔïn5Jög¹º¼»•¥šy]‹<ŽìIff$–$’I&ªÐEPEPEPEPEPÚŸ³ġü(öþ3Óü=ö¿x°M¢x²Úi¼+­@º6–&‹TXfYlNþDiæI¤TÚ»²{_Œÿlmü[¨ëºL—üU¯xKQñ5ÞƒªL²øsÆî÷Ú”¥d{{©Ó*É?Ùå¹ó-¯öÄ‚Þ y#Šoý–‡‡~0xÄ¿ |c¬\hö:\:‡Šü= ¬ÆCªjòÅmh-VÃ΄ß]˜ÔDI£+):Ï­è>-xâ_À«Ïi>,Ó¿á7ðdšÖ ÿj×n¤›Ãþ(¹ŠköŸQ¸»]CýWcXÄKH— Ãñ•ε¥xóVÖ<:úþ§?Š4ÿi7H¶Ñê1Ç|‹â+›%ÔVM?TI@˜ÛÛÊñÏÈ¢´-öYO |Gø!£|`ҵũü7øãraMBø)'ðƹ-«¬×—7Z¬Ë¿IÒçFb3}ûˆ£˜oIãU¯ŸüUáüK¶¿Ô>ë×åæµ4·CÀÞ.Ö ºÖ·'™¨Äº­Ì±Ü¤Sê óÅäZF¢áÌÌ>Ï4a®/yY<[⯇Þ2Õn4ýXÒ|X³jM-þ«.™}},cUŠ]CS+¨ïµÕ":GkÉ“ÌÁy¤]€{Pð7ƒ4k/ðýߊ"ñ`Ôä–Ç^´„­o®¢”N'¹štFx§`È )7.dùG™ô¯‚­ï¬ü3/‹£ðþ±ñ7ÀVÚ™ˆøcáöºÚ¶¯®§ž°ÝÜx™´é—J¼œÅsÆŽ[›•0¬ó40]Hß%xÇý ð‡ƒõûýFËWÔá0Ž9|?¨ÜXC§u6¡|4É® ·¾ŒÀ¬"}>á¦R7³/—$Vû7iÿ¾)ê^%øñ‡PÓuæ½’M?ÄúÏ‹,Ú{Ï>q»º˜Ik©ÙË<—"ßÊ:|Ûæ‘šHî¨mû1xƒFøÃñçÂú­Ÿ…þ&k‡‹lu­Q§’ k†X~ÐÿÚ— ¨­„ÓÛ’òªYAte‹ÎiÚ e>gΚ¯ÇøVßÓq„“oïKÏÿm}§ûWÅ^ »þØóu]k΋ÎûFªŸjû;6ëßîóFë‡Úéö›Œ$›z^xûkí?Ú¾*ñßöÇ›ªë^t^wÚ5TûWÙÙ·\~ÿwš7\>×O´Üa$Ûûß`5±øm¬7ˆb¸ø…ñ[ÄÉwªé^(U¸Ó<9ª'EžòÞF•u-A`žfÛ8Eµ’áÖE–Q"DÊ~Õšµö¿ñjÓSÔïn5J÷Â^¹º¼»•¥šy_Ãú{<ŽìIff$–$’I&¼‚­jÚµö¿ªÞêzíÆ£©^Ì÷7W—r´³O+±g‘݉,ÌÄ’Ä’I$ÕZ(¢Š(¢Š(¢ŠïþütñÁ;ÍAü5¨ùvŸÙÆ¥¥Î [ÞfY¡'øP-ô=7ÃÞoøsÂþ!º±²›Àz…¿”ó\ÙêW"y.VynïoÉkcBÖŸh†TùƒâÄχž¼×æøY:ÕõíÅÕÆŸhäiff›R*÷—.ҵܪ·ïm{©†K]eÊ=WÅßuÏÿÂIàÿ†Zü#¶)þÔ`ÐõcÄêá'‹Ìº¼ÅÔúŽñ嫘¾Ûj–òÁ¾ï>ú/€®ô_Šz׊ükoª¾‹ ºÝ÷…¼2é¨ßj~}íõ´I|ÿi°F\³&i&Õo"Ãùw²Çο¿iOüQþÓ¶q§ø_EÕ<£¨i·6±jOÆßLY®/åóËæ^K3‰$‘•”¹ÉðoþI×Çoû-¿õ!Ѩ ø•û]ø«Å–ÚþáK†¾ÖæšMGOЦ–Kí\<—,N§©JÍu~ÅnåVÉå7DµáTQ@Q@Q@Q@zWß÷Þ ðn¹à]cL·ñgÃírhîo4+×dkK¤ ë †M­ØtbM®Œ­¶X¦P¼Ö½Wàÿìéâ>ø¥â­ öÑSW½ù¢feç‘Hżw“îPÙû6Ìn‘(Wâ/€5K ÇãSâïx¯áß‹/n'¹ñdóõÈ’âH`½„Ý3Gs¶q½ç!‡ŸtÐ}ª%YgÕý–¼GýµûSü$þÕñWˆ.ÿ¶ø¥â­ öÑSW½ù¢feç‘Hżw“îPÙû6Ìn‘(WHÔ¿áÙÝéWº®¡e㻌ÝÉmf¾jxÆê(f¥â2"H4¬ža%®iYUîò—宥ÿ #y¢h¶«¨kµ ¶Ú~¿©®_Rºy™!Ón¦2;M¹|‘ä›7so(6ëöÞ+_tþÇV:íñOáµÒøŸPÑ>'èž&Óõ¿é3ÊŒ£´ä‡Q‰YâO·@’:\-$´×)æÌgŽP*O…_¼sªë>+Õî> ±ø‘ÿ œzcâø¦Ô\ÿaC=¬›ùï.¼•¹¶•·ß€ÁMÌëÆÉ~uñGƽ[ÂúWˆ|-àßëVþ!™®<[âu»¸ŠoÜ•X0bì€\N$IŒ¯,àŽ `‚ÇãÆ¹ð þ{O xƒûwâˆwɯxÌÞ½×Ø.›z¹Ó¥RK“ÝG&¢w±ûLËlÊ™¸¹ð ïþ=øOCð7ÅwDðÞãè¶¾GÙôïÚ¥¶³è#vûDh®Y™“”d=MpQEQEQ_JxOþ ÃûDøçº7‰4O‡ŸmÑu‹(u Ÿí½:?: PIí{€Ë•`pÀž@5­ÿ¸ý§è™åKÿäšùVŠú«þqûNÿÑ2ÿÊþ—ÿÉ4î?ißú&_ù_Òÿù&€>”ý€ko‚?coèž,MCP¿·½ûn»áûác/öÏÛ\ZyZ}¼’¡¸‰-à‰§Y˽ÎYHó[ÅŸØð•k?ðŒhÂ7öÙ¿²ÿµ¶}³ì»Ï“çù'›³ní¿.ìãŠûSÁŸðMïÚKKøOñH›áoƒÞïTþÎû<šÍí¤úÊyS³7ödé1Š ƒûï5“z`&â1\ü:ãöÿ¢eÿ•ý/ÿ’håZ+ê¯øuÇí;ÿDËÿ+ú_ÿ$Ñÿ¸ý§è™åKÿäšùV½Wàßü“¯Žßö&[êC£Wªÿî?ißú&_ù_Òÿù&»ÿ†ŸðNÚ'Ãþ ø±aðóì÷zç†`Óôøÿ¶ôæóç]gL¹)‘pBþæÚfË`|˜ÎHáj+ê¯øuÇí;ÿDËÿ+ú_ÿ$Ñÿ¸ý§è™åKÿäšùVŠú«þqûNÿÑ2ÿÊþ—ÿÉ4î?ißú&_ù_Òÿù&€>U¢¾ªÿ‡\~Ó¿ôL¿ò¿¥ÿòMðëÚwþ‰—þWô¿þI •h¯ª¿á×´ïý/ü¯éü“Gü:ãöÿ¢eÿ•ý/ÿ’håZý>ý€ko‚?coèž,MCP¿·½ûn»áûác/öÏÛ\ZyZ}¼’¡¸‰-à‰§Y˽ÎYHæ¿øuÇí;ÿDËÿ+ú_ÿ$×àÏø&÷í%¥ü'ø‹¤Mð·Áïwªg}žMföÒ}e<©Ù›û2t˜ÅAý÷šÉ½0q ŠüYý‡ÿ V³ÿÇö‡ü#m›û/û[gÛ>˼ù>—òy»6îÛòîÎ8«~ñÿˆ¾xËIñg„õkÄ:TÂâÎúØÑ¶ ‚ee,¬Œ ²³+ è¯øuÇí;ÿDËÿ+ú_ÿ$Ñÿ¸ý§è™åKÿäšùÿâgÅ_üdñTþ$ñ·ˆõkSniÔ&/å!w“ʉ~ìQ‘ÊÆQwªrµõWü:ãöÿ¢eÿ•ý/ÿ’hÿ‡\~Ó¿ôL¿ò¿¥ÿòM|«^«ûKÉEÒ?ìLðŸþ£Úuz¯ü:ãöÿ¢eÿ•ý/ÿ’k¿øáÿáý¢|aãM6ÿHøyö»H|3áí=äþÛÓ“ÛhÖVÓ¦à–hd\ô;r ðµõWü:ãöÿ¢eÿ•ý/ÿ’hÿ‡\~Ó¿ôL¿ò¿¥ÿòM|«E}Uÿ¸ý§è™åKÿäš?á×´ïý/ü¯éü“@*Ñ_Uî?ißú&_ù_Òÿù&øuÇí;ÿDËÿ+ú_ÿ$ÐÊ´WÕ_ðëÚwþ‰—þWô¿þI£þqûNÿÑ2ÿÊþ—ÿÉ4ò­~Ÿ~À?µ·ÁŸ±·ôO&¡¨_ÛÞý·]ðýð±—ûgí®-<­>ÞIPÜD–ðDÓ¬ƒåÞç,¤ó_ü:ãöÿ¢eÿ•ý/ÿ’k¿ðgü{ö’ÒþüEÒ&ø[à÷»Õ?³¾Ï&³{i>²žTìÍý™:Lbƒ þûÍdÞ˜ ¸ŒPÅ~,þÃÿ„«Yÿ„cûCþ¿¶Íý—ý­³íŸeÞ|Ÿ?Ëù<Ý›wmùwgUM'V¾Ð5[-OL½¸Óµ+)’æÖòÒVŠh%F ’#©YXAŠúƒþqûNÿÑ2ÿÊþ—ÿÉ4î?ißú&_ù_Òÿù&€>_ÕµkíU½Ôõ;ÛGR½™în¯.åifžWbÏ#»Y™‰%‰$’IªµõWü:ãöÿ¢eÿ•ý/ÿ’hÿ‡\~Ó¿ôL¿ò¿¥ÿòMyWÁ¿ù'_¿ìL¶ÿÔ‡F¯*¯º~Á8hŸø/âÅ…ÿÃϳÝ랃OÓãþÛÓ›Ïu2ä¦EÁ û›i›-òc9 þqûNÿÑ2ÿÊþ—ÿÉ4ò­õWü:ãöÿ¢eÿ•ý/ÿ’hÿ‡\~Ó¿ôL¿ò¿¥ÿòM|«E}Uÿ¸ý§è™åKÿäš?á×´ïý/ü¯éü“@*Ñ_Uî?ißú&_ù_Òÿù&øuÇí;ÿDËÿ+ú_ÿ$ÐÊ´WÕ_ðëÚwþ‰—þWô¿þI£þqûNÿÑ2ÿÊþ—ÿÉ4ò­õWü:ãöÿ¢eÿ•ý/ÿ’hÿ‡\~Ó¿ôL¿ò¿¥ÿòM|«E}Uÿ¸ý§è™åKÿäš?á×´ïý/ü¯éü“@*Ñ_Uî?ißú&_ù_Òÿù&øuÇí;ÿDËÿ+ú_ÿ$ÐÊ´WÕ_ðëÚwþ‰—þWô¿þI£þqûNÿÑ2ÿÊþ—ÿÉ4ò­õWü:ãöÿ¢eÿ•ý/ÿ’hÿ‡\~Ó¿ôL¿ò¿¥ÿòMyWí-ÿ%Hÿ±3ÂúiÕåU÷OÇø'íãi·úGÃϵÚCáŸiï'öÞœ˜žÛF²¶0×ü³C"ç¡ÛH žþqûNÿÑ2ÿÊþ—ÿÉ4âž:øýñâo…l|;â¯jî•kzú–ËÆ -ÍÓ"Çö‹™±æ\ʱ"Ä3;G…S宾ªÿ‡\~Ó¿ôL¿ò¿¥ÿòMðëÚwþ‰—þWô¿þI *ý¨ÿä»x›þJüºÿÉRÿ‘‹þ=bÿ¯ý“þ™yuåU÷OÇ¿ø''í㟋î·á¿øÃÄ-בö}GǾ)Ò.u™¶Á7Ú$K²­†VTÁáQ\ü:ãöÿ¢eÿ•ý/ÿ’håZ+ê¯øuÇí;ÿDËÿ+ú_ÿ$Ñÿ¸ý§è™åKÿäšùVŠÕñg…µOx«YðÞ·kö-kG½›O¾¶óO&xœÇ"nBU°ÊFTqÁ"ŠítŸÚoã¥YišgÅiÚm”)mkgiâ;È¡‚$P©"Ȫ¨(oþÇãýOˆøT_ñÚòª(Õá¬~7ÿÑdøÿ…E÷ÿ£þÇãýOˆøT_ñÚòª(ꯇµÆÿøQ??âòÐ#þF/_ÂEÿMÿ oÞÿàGý2Û^Uÿ cñ¿þ‹'Äü*/¿øíÿä„ü\ÿ’ÿ0ù¿äbÿ¦ÿ7þÜÓ-µåTê¿ðÖ?ÿè²|@ÿ¢ûÿŽÑÿ cñ¿þ‹'Äü*/¿øíyUê¿ðÖ?ÿè²|@ÿ¢ûÿŽÑÿ cñ¿þ‹'Äü*/¿øíyUê¿ðÖ?ÿè²|@ÿ¢ûÿŽÑÿ cñ¿þ‹'Äü*/¿øíyUê¿ðÖ?ÿè²|@ÿ¢ûÿŽÑÿ cñ¿þ‹'Äü*/¿øíyUê¿ðÖ?ÿè²|@ÿ¢ûÿŽÑÿ cñ¿þ‹'Äü*/¿øíyUê¿ðÖ?ÿè²|@ÿ¢ûÿŽÑÿ cñ¿þ‹'Äü*/¿øíyUê¿ðÖ?ÿè²|@ÿ¢ûÿŽ×ªü;ý¬~7ÿ‰ø¹ÿ“þò1x¢ûþ/øúoù~÷ÿ?é–ÚùV½WáßüŸ‹ŸòOÿæÿ#üŒ_ñôßòÿÛúe¶€økÿôY> áQ}ÿÇhÿ†±øßÿE“âþßüv¼ªŠõ_økÿôY> áQ}ÿÇhÿ†±øßÿE“âþßüv¼ªŠõ_økÿôY> áQ}ÿÇhÿ†±øßÿE“âþßüv¼ªŠõ_økÿôY> áQ}ÿÇhÿ†±øßÿE“âþßüv¼ªŠõ_økÿôY> áQ}ÿÇhÿ†±øßÿE“âþßüv¼ªŠõ_økÿôY> áQ}ÿÇhÿ†±øßÿE“âþßüv¼ªŠõ_økÿôY> áQ}ÿÇhÿ†±øßÿE“âþßüv¼ªŠõ_økÿôY> áQ}ÿÇkÕ~þÖ?ÿáDü\ÿ‹Éÿ@ù¼Q}ÿ ü}7ü¿{ÿôËm|«^«ðïþHOÅÏù'ÿóÿ‘‹þF/øúoùíÇý2Û@ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UEz¯ü5Æÿú,Ÿ?ð¨¾ÿã´ÃXüoÿ¢Éñÿ ‹ïþ;^UE})ñïö…ø§ào‹î‰á¿‰¿öOúeåוPªÿÃXüoÿ¢Éñÿ ‹ïþ;Gü5Æÿú,Ÿ?ð¨¾ÿãµåTP­[V¾×õ[ÝOS½¸Ôu+ÙžæêòîV–iåv,ò;±%™˜’X’I$š*­QEQEßü1øŸ¥øNÕt}oÀ¾ñž‹¬^é³ß6£G¨Ã­Ç$WhwZý¡sŽªÄ©Á­ÿ á‡ý?ùœÿ¶ÿäeºÿýþïþN­ö¢Š?áb|0ÿ¢Gÿ3ŸößüŒ·_òÿ ÝÿÉÏõ¾ÔÂÄøaÿDþg?í¿ùn¿äÿ@?»ÿ“Ÿë}¨¢€øXŸ ?è‘ÿÌçý·ÿ#-×ü€¿è÷òsýoµð±>Ñ#ÿ™ÏûoþF[¯ùÐîÿäçúßj( þ'Ãú$ó9ÿmÿÈËuÿ /úýßüœÿ[íGü,O†ôHÿæsþÛÿ‘–ëþ@_ôû¿ù9þ·ÚŠ(ÿ…‰ðÃþ‰üÎÛò2ÝÈ þ€wÿ'?ÖûQÿ á‡ý?ùœÿ¶ÿäeºÿýþïþN­ö¢Š?áb|0ÿ¢Gÿ3ŸößüŒ·_òÿ ÝÿÉÏõ¾ÔÂÄøaÿDþg?í¿ùn¿äÿ@?»ÿ“Ÿë}¨¢€øXŸ ?è‘ÿÌçý·ÿ#-×ü€¿è÷òsýoµð±>Ñ#ÿ™ÏûoþF[¯ùÐîÿäçúßj( þ'Ãú$ó9ÿmÿÈËuÿ /úýßüœÿ[í]…ñÛᶃáŸhkð;G¿·×|[¬÷Wú¬Ó]Ùh‘N’®‘k9Mð± ѽÚî’0d$!RŠçÿáb|0ÿ¢Gÿ3ŸößüŒ·_òÿ ÝÿÉÏõ¾ÔÂÄøaÿDþg?í¿ùn¿äÿ@?»ÿ“Ÿë}¨¢€øXŸ ?è‘ÿÌçý·ÿ#-×ü€¿è÷òsýoµð±>Ñ#ÿ™ÏûoþF[¯ùÐîÿäçúßj( þ'Ãú$ó9ÿmÿÈËuÿ /úýßüœÿ[íGü,O†ôHÿæsþÛÿ‘–ëþ@_ôû¿ù9þ·ÚŠ(ÿ…‰ðÃþ‰üÎÛò2ÝÈ þ€wÿ'?ÖûQÿ á‡ý?ùœÿ¶ÿäeºÿýþïþN­ö¢Š?áb|0ÿ¢Gÿ3ŸößüŒ·_òÿ ÝÿÉÏõ¾ÔÂÄøaÿDþg?í¿ùn¿äÿ@?»ÿ“Ÿë}¨¢€øXŸ ?è‘ÿÌçý·ÿ#-×ü€¿è÷òsýoµð±>Ñ#ÿ™ÏûoþF[¯ùÐîÿäçúßj( þ'Ãú$ó9ÿmÿÈËuÿ /úýßüœÿ[íGü,O†ôHÿæsþÛÿ‘–ëþ@_ôû¿ù9þ·ÚŠ(ÿ…‰ðÃþ‰üÎÛò2ÝÈ þ€wÿ'?ÖûWA¡|vøm øgÄÚüÑïíõßÁ«=Õþ«4×vZ$S¤«¤ZÎS|,B´ov§{¤Œ T¢€9ÿøXŸ ?è‘ÿÌçý·ÿ#-×ü€¿è÷òsýoµð±>Ñ#ÿ™ÏûoþF[¯ùÐîÿäçúßj( þ'Ãú$ó9ÿmÿÈËuÿ /úýßüœÿ[íGü,O†ôHÿæsþÛÿ‘–ëþ@_ôû¿ù9þ·ÚŠ(ÿ…‰ðÃþ‰üÎÛò2ÝÈ þ€wÿ'?ÖûQÿ á‡ý?ùœÿ¶ÿäeºÿýþïþN­ö¢Š?áb|0ÿ¢Gÿ3ŸößüŒ·_òÿ ÝÿÉÏõ¾ÔÂÄøaÿDþg?í¿ùn¿äÿ@?»ÿ“Ÿë}¨¢€øXŸ ?è‘ÿÌçý·ÿ#-×ü€¿è÷òsýoµð±>Ñ#ÿ™ÏûoþF[¯ùÐîÿäçúßj( þ'Ãú$ó9ÿmÿÈËuÿ /úýßüœÿ[íGü,O†ôHÿæsþÛÿ‘–ëþ@_ôû¿ù9þ·ÚŠ(ÿ…‰ðÃþ‰üÎÛò2ÝÈ þ€wÿ'?ÖûQÿ á‡ý?ùœÿ¶ÿäeºÿýþïþN­ö¢Š?áb|0ÿ¢Gÿ3ŸößüŒ·_òÿ ÝÿÉÏõ¾ÔÂÄøaÿDþg?í¿ùn¿äÿ@?»ÿ“Ÿë}¨¢€øXŸ ?è‘ÿÌçý·ÿ#-×ü€¿è÷òsýoµð±>Ñ#ÿ™ÏûoþF[¯ùÐîÿäçúßj( þ'Ãú$ó9ÿmÿÈËuÿ /úýßüœÿ[íGü,O†ôHÿæsþÛÿ‘–ëþ@_ôû¿ù9þ·ÚŠ(ÿ…‰ðÃþ‰üÎÛò2ÝÈ þ€wÿ'?ÖûQÿ á‡ý?ùœÿ¶ÿäeºÿýþïþN­ö¢Š?áb|0ÿ¢Gÿ3ŸößüŒ·_òÿ ÝÿÉÏõ¾ÔÂÄøaÿDþg?í¿ùn¿äÿ@?»ÿ“Ÿë}¨¢€øXŸ ?è‘ÿÌçý·ÿ#-×ü€¿è÷òsýoµð±>Ñ#ÿ™ÏûoþF[¯ùÐîÿäçúßj( þ'Ãú$ó9ÿmÿÈËuÿ /úýßüœÿ[íGü,O†ôHÿæsþÛÿ‘–ëþ@_ôû¿ù9þ·ÚŠ(”ø«ãÛŠüG⫆Ô?âi{$ðŪjsjWðgÀ÷S$ÞTA#üƒ¥r´Q@Q@Q@ÿÙkit/sample/default.mgp010064400237450000000000000026140733500722600145670ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% This default.mgp is "TrueType fonts" oriented. %% First, you should create "~/.mgprc" whose contents are: %% tfdir "/path/to/truetype/fonts" %% %% To visualize English, install "standard.ttf", "thick.ttf", and %% "typewriter.ttf" into the "tfdir" directory above: %% ftp://ftp.mew.org/pub/mgp/ttf-us.tar.gz %% %% To visualize Japanese, install "kochi-mincho.ttf" and "goth.ttf" %% into the "tfdir" directory above: %% ftp://ftp.mew.org/pub/mgp/ttf-jp.tar.gz %% %deffont "standard" tfont "standard.ttf", tmfont "kochi-mincho.ttf" %deffont "thick" tfont "thick.ttf", tmfont "goth.ttf" %deffont "typewriter" tfont "typewriter.ttf", tmfont "goth.ttf" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings per each line numbers. %% %default 1 area 90 90, leftfill, size 2, fore "white", back "black", font "thick" %default 2 size 7, vgap 10, prefix " " %default 3 size 2, bar "gray70", vgap 10 %default 4 size 5, fore "white", vgap 30, prefix " ", font "standard" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings that are applied to TAB-indented lines. %% %tab 1 size 5, vgap 40, prefix " ", icon box "green" 50 %tab 2 size 4, vgap 40, prefix " ", icon arc "yellow" 50 %tab 3 size 3, vgap 40, prefix " ", icon delta3 "white" 40 kit/sample/embed-jp.mgp010064400237450000000000000012320725442503000146160ustar nishidawheel%include "default.mgp" %page %nodefault %fore "red", size 7, font "standard", back "darkblue" %center, fore "yellow", font "thick" $BKd$a9~$_(B MagicPoint %font "standard" %size 4 $B0J2<$N%3%^%s%I$r output.mgp %font "standard" $B2?$,5/$3$k$+D4$Y$F2<$5$$!#(B %size 4, fore "red" $B2CF#(B $BO/(B WIDE $B%W%m%8%'%/%H(B %size 3 kato@wide.ad.jp %page $BKd$a9~$_%$%a!<%8(B %center %image "cloud.jpg" %page $BKd$a9~$_%$%a!<%8(B (gzipped) %center %image "mgp3.xbm" %leftfill $B>e$N%$%a!<%8$O(B 'mgp3.xdm' $B$G$9!#(B $B$3$l$OGr9u%$%a!<%8$G$9!#(B gzip $B$K$+$1$i$l$?8e output.mgp %font "standard" and see what happens. %size 4, fore "red" Akira Kato WIDE Project %size 3 kato@wide.ad.jp %page Embedded image %center %image "cloud.jpg" %page Embedded image (gzipped) %center %image "mgp3.xbm" %leftfill The image above is 'mgp3.xdm'. This is a monocrome image. It is included after gzipped. kit/sample/gradation-jp.mgp010064400237450000000000000214510657406132100155220ustar nishidawheel%include "default.mgp" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %nodefault %size 7, font "standard", fore "white", vgap 20, back "black" %bquality 10 %center $B%P%C%/%0%i%&%s%I(B $B%0%i%G!<%7%g%s$N;H$$J}(B ($B;CDjHG(B) %size 4 $B1'IW(B $BM[e$+$i2<(B $B@D$+$i9u$KJQ2=(B $B0z?t$rM?$($J$$$H$-$O%G%U%)%k%HIA2h(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad $B%0%i%G!<%7%g%sIA2h86M}(B $BGX7J%0%i%G!<%7%g%s$O(B $B%0%i%G!<%7%g%sMQ$N2hA|$r@8@.(B $B$7$F$+$i(B $B2hLL$K9g@.(B $B$9$k$3$H$GIA2h$5$l$^$9!#(B $B0z?t$O(B5$B$D$"$j!"$=$l$>$l$N0z?t$O(B $B@8@.$9$k2hA|$N$?$a$N0z?t(B $B2hLL$K9g@.$9$k$?$a$N0z?t(B $B$KJ,N`$G$-$^$9!#(B $B0z?t$N$"$H$K$O!"%0%i%G!<%7%g%s$r9=@.$9$k?'$N%j%9%H$,B3$-$^$9!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 50 50 $B@8@.$9$k2hA|$N$?$a$N0z?t(B $B2hLL$KBP$9$k@8@.NN0h$NBg$-$5$r;XDj$9$k0z?t(B $BBh(B1$B0z?t(B: X$BJ}8~$KBP$9$kAjBPE*$JBg$-$5$r%Q!<%;%s%F!<%8$G;XDj(B $BBh(B2$B0z?t(B: Y$BJ}8~$KBP$9$kAjBPE*$JBg$-$5$r%Q!<%;%s%F!<%8$G;XDj(B $B@8@.2hLL$N@-3Q$r;XDj(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 50 50 $B2hLL$K9g@.$9$k$?$a$N0z?t(B $B9g@.J}K!$r;XDj$9$k0z?t(B $BBh(B5$B0z?t(B: $B3HBg;X<(%U%i%0(B 0: $B@8@.2hA|$r%?%$%j%s%0$9$k(B 1: $B@8@.2hA|$r2hLLA4BN$rK~$?$9$h$&$K3HBg$9$k(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad bgrad$BJ8K!(B($B$^$H$a(B) $BBh(B1$B0z?t(B: $B2hLL$KBP$9$k(BX$BJ}8~$NAjBP%5%$%:(B $BCM0h(B: 1-100 (0$B$O(B100%$B$r<($9(B)/$B%G%U%)%k%H(B: 100% $BBh(B2$B0z?t(B: $B2hLL$KBP$9$k(BY$BJ}8~$NAjBP%5%$%:(B $BCM0h(B: 1-100 (0$B$O(B100%$B$r<($9(B)/$B%G%U%)%k%H(B: 100% $BBh(B3$B0z?t(B: $BMxMQ$9$k?'?t(B $B%G%U%)%k%H(B: 128$B?'(B $BBh(B4$B0z?t(B: $B2sE>3QEY(B $BCM0h(B:-360 - 360/$B%G%U%)%k%H(B: 0$BEY(B($B2hLL$KJ?9T(B) $BBh(B5$B0z?t(B: $B3HBg%U%i%0(B 1:$B3HBg(B,0:$B2hLL$rK~$?$9$^$G7+$jJV$7(B/$B%G%U%)%k%H(B: 1 $B$=$l0J9_$O?';XDj(B $B%G%U%)%k%H(B blue,black %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad $BGX7J%.%c%i%j!<(B($B4pK\JT(B) $B$=$l$G$O$$$/$D$+$NGX7J%Q%?!<%s$K$D$$$F=g$K8+$F$$$-$^$7$g$&!#(B $B$3$3$G$O!"(B $B=DJ}8~%0%i%G!<%7%g%s(B $B2#J}8~%0%i%G!<%7%g%s(B(1) $B2#J}8~%0%i%G!<%7%g%s(B(2) $B2sE>8z2L(B $B3HBg8z2L(B $B%*!<%H%5%$%:%"%8%c%9%H(B $B$r8+$F$$$-$^$9!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 128 90 1 "black" "red" "black" "red" "black" "red" "black" $B=DJ}8~%0%i%G!<%7%g%s(B %size 4 bgrad 0 0 128 90 1 "black" "red" "black" "red" "black" "red" "black" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 128 0 1 "black" "red" "black" $B2#J}8~%0%i%G!<%7%g%s(B(1) %size 4 bgrad 0 0 128 0 1 "black" "red" "black" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 128 0 1 "blue2" "black" "black" "black" "blue4" "blue3" "blue4" $B2#J}8~%0%i%G!<%7%g%s(B(2) %size 4 bgrad 0 0 128 0 1 "blue2" "black" "black" "black" "blue4" "blue3" "blue4" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 45 1 "black" "red2" "black" $BG$0U3QEY$N2sE>(B %size 4 bgrad 25 25 128 45 1 "black" "red2" "black" $B2sE>$5$;$k$HCY$$(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 100 100 128 90 1 "black" "red" "black" $B3HBg8z2L(B %size 4 bgrad 100 100 128 90 0 "black" "red" "black" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 128 0 1 "blue" "cyan" "black" "black" "black" "black" "black" "green" "black" $B%*!<%H%5%$%:%"%8%c%9%H(B %size 3 bgrad 0 0 128 0 1 "blue" "cyan" "black" "black" "black" "black" "black" "green" "black" $BBg$-$5$OA42hLL(B(0 0)$B$G<+F0%"%8%c%9%H(B zoomflag$B$,I,MW(B $B@D(B/$B%7%"%s(B/$B9u!D9u(B/$BNP(B/$B9u(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad $BGX7J%.%c%i%j!<(B($B1~MQJT(B) $B$5$i$K$$$/$D$+$NGX7J%Q%?!<%s$r8+$F$$$-$^$7$g$&!#(B $B$3$s$J$3$H$b$G$-$k$H$$$&Nc$H$7$F$4MxMQ$/$@$5$$!#(B $B%+%i%U%k$JNc(B $B$H$i$G$#$7$g$J$kF|K\Iw(B $B>.$5$$2hA|$r3HBg$7$F8z2L$r:n$k(B $B$A$$$5$J2hA|$GBg$-$J2hLL(B(1) $B>.$5$J2hLL$GBg$-$J8z2L(B(2) $B$3$s$J$N$b!D(B(1) $B$3$s$J$N$b!D(B(2) $B1_7A%0%i%G!<%7%g%s(B(1) $B1_7A%0%i%G!<%7%g%s(B(2) $B1_7A%0%i%G!<%7%g%s(B(3) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %fore "white" %bgrad 0 0 128 180 1 "black" "white" "black" "red" "orange" "green3" "black" "blue" $B%+%i%U%k$JNc(B %size 3 bgrad 0 0 128 180 1 "black" "white" "black" "red" "orange" "green3" "black" "blue" $B$3$s$J$3$H$b$G$-$k!#(B 180$BEY2sE>$7$F$$$k$N$G!"?'%j%9%H$OA08e5UE>(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 10 0 128 90 0 "black" "orange" "black" "black" "black" "black" "black" "green" "black" $B$H$i$G$#$7$g$J$kF|K\Iw(B %size 3 bgrad 10 0 128 90 0 "black" "orange" "black" "black" "black" "black" "black" "green" "black" $BIA2h%5%$%:$K$?$$$7$F(B10%x100%$B$N2hA|$r(B90$BEY2sE>$7$F$+$i(B $B2hLLJ,%j%T!<%H(B ($BIA2h%5%$%:(B=$B2hLL%5%$%:(B*$B%/%*%j%F%#(B) $B9u(B/$B%*%l%s%8(B/$B9u!D9u(B/$BNP(B/$B9u(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 10 10 128 0 1 "black" "blue" "red" "black" "black" "black" "black" "black" "green" "black" $B>.$5$$2hA|$r3HBg$7$F8z2L$r:n$k(B %size 3 bgrad 10 10 128 0 1 "black" "blue" "red" "black" "black" "black" "black" "black" "green" "black" $BIA2h%5%$%:$KBP$7$F(B10%x10%$B$N2hA|$rA42hLL2=(B $B9u(B/$B@D(B/$B@V(B/$B9u!D!D9u(B/$BNP(B/$B9u(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 10 10 128 45 1 "black" "orange" "black" "black" "black" "black" "black" "green" "black" $B$A$$$5$J2hA|$GBg$-$J2hLL(B(1) %size 3 bgrad 10 10 128 45 1 "black" "orange" "black" "black" "black" "black" "black" "green" "black" $BIA2h%5%$%:$KBP$7$F(B10%x10%$B$N2hA|$r(B45$BEY2sE>$7$F$+$iA42hLL2=(B $B9u(B/$B%*%l%s%8(B/$B9u!D!D9u(B/$BNP(B/$B9u(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 5 5 128 60 1 "black" "orange" "black" "black" "black" "black" "black" "green" "black" $B>.$5$J2hLL$GBg$-$J8z2L(B(2) %size 3 bgrad 5 5 128 60 1 "black" "orange" "black" "black" "black" "black" "black" "green" "black" $BIA2h%5%$%:$KBP$7$F(B5%x5%$B$N2hA|$r(B60$BEY2sE>$7$F$+$iA42hLL2=(B $B9u(B/$B%*%l%s%8(B/$B9u!D!D9u(B/$BNP(B/$B9u(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 45 1 "blue" "blue2" "black" "black" "black" "black" "blue" $B$3$s$J$N$b!D(B(1) %size 3 bgrad 25 25 128 45 1 "blue" "blue2" "black" "black" "black" "black" "blue" $BIA2h%5%$%:$KBP$7$F(B25%x25%$B$N2hA|$r(B45$BEY2sE>$7$F$+$iA42hLL2=(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 12 0 128 45 0 "blue" "blue2" "black" "black" "black" "black" "blue" $B$3$s$J$N$b!D(B(2) %size 3 bgrad 12 0 128 45 0 "blue" "blue2" "black" "black" "black" "black" "blue" 12%x100%$B$N2hA|$r(B45$BEY2sE>$7$F$+$i!"7+$jJV$7(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 -45 1 "black" "red" "black" $B1_7A%0%i%G!<%7%g%s(B(1) %size 4 bgrad 25 25 128 -45 1 "black" "red" "black" $B$@$l$b$7$i$J$$5!G=$=$N(B1 $B3QEY$,Ii$NCM$@$H$R$=$+$KHs@~7A$K$J$k(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 -45 1 "red2" "black" "red2" $B1_7A%0%i%G!<%7%g%s(B(2) %size 4 bgrad 25 25 128 -45 1 "red2" "black" "red2" $B$=$N5U(B $B?'$N%j%9%H$rA08eBP>N$KCV$/$N$,$3$D$i$7$$(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 -45 0 "blue" "blue2" "black" "black" "black" "black" "blue" $B1_7A%0%i%G!<%7%g%s(B(3) %size 3 bgrad 25 25 128 -45 1 "blue" "blue2" "black" "black" "black" "black" "blue" 25%x25%$B$N2hA|$r(B45$BEY2sE>$7$F3HBg$7$F$+$i7+$jJV$7(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 -45 1 "white" "blue" "black" "black" "orange" "black" "black" "orange" "black" "black" "blue" "white" $B$*$7$^$$(B kit/sample/gradation.mgp010064400237450000000000000174530730240124600151140ustar nishidawheel%include "default.mgp" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %nodefault %size 7, font "standard", fore "white", vgap 20, back "black" %bquality 10 %center How to use background gradation (tentative) %size 4 Yojiro UO yuo@Nui.org %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad Usage Specify the "bgrad" keyword for background gradation By default entire screen from up to down from blue to black Without arguments, displayed with these default values. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 128 90 1 "black" "blue" Principles of drawing gradation background Gradation drawing is 2-phase process: generate raw material of gradaton image superimpose to screen image The first five arguments to "bgrad" can be separate as follows: Args. for image generation Args. for superimpose method Following the above, the list of color name (to be used for gradation) \ may be specified. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 50 50 Args. for image generation Args. to specify the size of genarated images 1st arg: Relative size against X axis (percentage) 2nd arg: Relative size against Y axis (percentage) Args. to specify the property of genarated images 3rd arg: # of colors 4th arg: Rotation Angle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 50 50 Args. for superimpose method Args. to specify how image should be enlarged to fit to the screen. 5th arg: Zooming flag: 0: Tiling 1: Zoom %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad Syntax of bgrad (conclusion) 1st arg: Relative size against X direction Range: 1 to 100 (0 means 100%)/default: 100% 2nd arg: Relative size against Y direction Range: 1 to 100 (0 means 100%)/default: 100% 3rd arg: # of colors default: 128 colors 4th arg: Rotation Angle Range: -360 to 360/default: 0 5th arg: Zooming flag 1:Zoom, 0:Repeat to the edges of screen Default: 1 Rests are colors Defualt: blue,black %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad Background gallary (Basic technics) Here are basic examples: Vertical Stripes Horizontal Stripes(1) Horizontal Stripes(2) Rotating with a specific angle Zooming & Vertical Stripes Auto adjustment %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 128 90 1 "black" "red" "black" "red" "black" "red" "black" Vertical Stripes %size 4 bgrad 0 0 128 90 1 "black" "red" "black" "red" "black" "red" "black" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 128 0 1 "black" "red" "black" Horizontal Stripes(1) %size 4 bgrad 0 0 128 0 1 "black" "red" "black" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 128 0 1 "blue2" "black" "black" "black" "blue4" "blue3" "blue4" Horizontal Stripes(2) %size 4 bgrad 0 0 128 0 1 "blue2" "black" "black" "black" "blue4" "blue3" "blue4" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 45 1 "black" "red2" "black" Rotating with a specific angle %size 4 bgrad 25 25 128 45 1 "black" "red2" "black" Rotation takes some time %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 100 100 128 90 1 "black" "red" "black" Zooming & Vertical Stripes %size 4 bgrad 100 100 128 90 0 "black" "red" "black" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 128 0 1 "blue" "cyan" "black" "black" "black" "black" "black" "green" "black" Auto adjustment %size 3 bgrad 0 0 128 0 1 "blue" "cyan" "black" "black" "black" "black" "black" "green" "black" Auto adjust with size (0,0) zoomflag is necessary blue/cyan/black ... black/green/black %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad Background gallary (Advanced technics) Let's see some uses of advanced technics: Colorful Traditional Japanese Effects by zooming a small pattern Filling with small patterns(1) Filling with small patterns(2) Tricky(1) Tricky(2) Circle gradation(1) Circle gradation(2) Circle gradation(3) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %fore "white" %bgrad 0 0 128 180 1 "black" "white" "black" "red" "orange" "green3" "black" "blue" Colorful %size 3 bgrad 0 0 128 180 1 "black" "white" "black" "red" "orange" "green3" "black" "blue" You can do this! Since rotated by 180, color lists are turned over. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 10 0 128 90 0 "black" "orange" "black" "black" "black" "black" "black" "green" "black" Traditional Japanese %size 3 bgrad 10 0 128 90 0 "black" "orange" "black" "black" "black" "black" "black" "green" "black" Rotate the pattern of 10%x100% by 90 then repeat black/orange/black ... black/green/black %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 10 10 128 0 1 "black" "blue" "red" "black" "black" "black" "black" "black" "green" "black" Effects by zooming a small pattern %size 3 bgrad 10 10 128 0 1 "black" "blue" "red" "black" "black" "black" "black" "black" "green" "black" Zoom the pattern of 10%x10% black/blue/red/black ... black/green/black %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 10 10 128 45 1 "black" "orange" "black" "black" "black" "black" "black" "green" "black" Filling with small patterns(1) %size 3 bgrad 10 10 128 45 1 "black" "orange" "black" "black" "black" "black" "black" "green" "black" Rotate the pattern of 10%x10% by 45 then repeat then zoom black/orange/black ... black/green/black %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 5 5 128 60 1 "black" "orange" "black" "black" "black" "black" "black" "green" "black" Filling with small patterns(2) %size 3 bgrad 5 5 128 60 1 "black" "orange" "black" "black" "black" "black" "black" "green" "black" Rotate the pattern of 5%x5% by 60 then repeat then zoom black/orange/black ... black/green/black %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 45 1 "blue" "blue2" "black" "black" "black" "black" "blue" Tricky(1) %size 3 bgrad 25 25 128 45 1 "blue" "blue2" "black" "black" "black" "black" "blue" Rotate the pattern of 25%x25% by 45 then repeat then zoom %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 12 0 128 45 0 "blue" "blue2" "black" "black" "black" "black" "blue" Tricky(2) %size 3 bgrad 12 0 128 45 0 "blue" "blue2" "black" "black" "black" "black" "blue" Rotate the pattern of 12%x100% by 45 then repeat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 -45 1 "black" "red" "black" Circle gradation(1) %size 4 bgrad 25 25 128 -45 1 "black" "red" "black" The "easter egg" feature If angle is minus, it becomes non-liner. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 -45 1 "red2" "black" "red2" Circle gradation(2) %size 4 bgrad 25 25 128 -45 1 "red2" "black" "red2" The reverse List colors symmetrically %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 -45 0 "blue" "blue2" "black" "black" "black" "black" "blue" Circle gradation(3) %size 3 bgrad 25 25 128 -45 1 "blue" "blue2" "black" "black" "black" "black" "blue" Rotate the pattern of 25%x25% by 45, zoom then repeat %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 128 -45 1 "white" "blue" "black" "black" "orange" "black" "black" "orange" "black" "black" "blue" "white" Fin kit/sample/m17n-lib.mgp010064400237450000000000000067641011012574600144740ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -*- coding: utf-8; -*- %deffont "standard" xfont "helvetica-medium-r" %deffont "thick" xfont "helvetica-bold-r" %deffont "typewriter" xfont "courier-medium-r" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings per each line numbers. %% %default 1 area 95 95, leftfill, size 2, fore "black", back "white", font "standard", hgap 0, m17n "family" "freesans" %default 2 size 7, vgap 10, prefix " ", ccolor "black" %default 3 size 2, bar "gray70", vgap 10 %default 4 size 5, fore "gray20", vgap 30, prefix " ", font "standard" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings that are applied to TAB-indented lines. %% %tab 1 size 5, vgap 40, prefix " ", icon box "darkblue" 50 %tab 2 size 4, vgap 40, prefix " ", icon arc "yellow" 50 %tab 3 size 3, vgap 40, prefix " ", icon delta3 "white" 40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 0 0 "slateblue1" "white" Hello from Europe English Hello German (Deutsch) Guten Tag, Grüß Gott French (français) Bonjour, Salut Spanish (español) ¡Hola! Polish (jÄ™zyk polski) DzieÅ„ dobry! Cześć! Czech (Äesky) Dobrý den Estonian (eesti keel) Tere, Tervist Finnish (Suomi) Hei Maltese (il-Malti) BonÄ¡u, Saħħa Esperanto Saluton (EÄ¥oÅanÄo ĉiuĵaÅ­de) Greek (ελληνικά) Γειά σας Russian (руÑÑкий) ЗдравÑтвуйте! Georgian (ქáƒáƒ áƒ—ული) გáƒáƒ›áƒáƒ áƒ¯áƒáƒ‘áƒáƒ—! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 0 0 "red" "PaleVioletRed1", fore "white" Hello from Africa & Middle/Near East Amharic (አማርኛ) ሠላሠTigrigna (ትáŒáˆ­áŠ›) ሰላማት Turkish (Türkçe) Merhaba Arabic (اَلْعَرَبÙيَّةÙ)‎ اَلسَّلَام٠عَلَيْكÙÙ… Persian (ÙØ§Ø±Ø³ÛŒ)‎ سلام عليکم Hebrew (עִבְרִית)‎ ש×Ö¸×œ×•Ö¹× %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 0 0 "green" "white", fore "darkblue" Hello from South/South-East Asia Hindi (हिंदी) नमसà¥à¤¤à¥‡, नमसà¥à¤•ार । Bengali (বাংলা) নমসà§à¦•ার Punjabi (ਪੰਜਾਬੀ) ਸਤਿ ਸ਼à©à¨°à©€ ਅਕਾਲ Gujarati (ગà«àªœàª°àª¾àª¤à«€) નમસà«àª¤à«‡ Tamil (தமிழà¯) வணகà¯à®•ம௠Telugu (తెలà±à°—à±) హలో Kannada (ಕನà³à²¨à²¡) ನಮಸà³à²•ಾರ Malayalam (മലയാളം) നമസàµà´•ാരം Myanmar (မ္ရန္‌မာ) မင္ဂလာပာ Tibetan (བོད་སà¾à½‘་) བཀྲ་ཤིས་བདེ་ལེགས༎ Thai (ภาษาไทย) สวัสดีครับ, สวัสดีค่ะ Lao (ພາສາລາວ) ສະບາàºàº”ີ, ຂà»à»ƒàº«à»‰à»‚ຊàºàº”ີ Khmer (ážáŸ’មៃរ) ជំរាបសួរ Vietnamese %m17n "language" "vi", m17n "family" "freeserif", cont (Tiếng Việt) Chào bạn %m17n "family" "freesans" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "MediumPurple1" "white" Hello from East Asia %m17n "language" "zh" Chinese (汉语) 你好 %m17n "language" "ja" Japanese (日本語) ã“ã‚“ã«ã¡ã¯ Korean (한글) 안녕하세요 kit/sample/mgp-old1.jpg010064400237450000000000000541200676156116300145660ustar nishidawheelÿØÿàJFIFÿÛC     ÿÛC   ÿÀŸ…"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?üª¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š÷Ícö!ø£ ÚêZ•í–šžµ[-¼E òO§êQÞ^%­³ÚÉâáˉpB•‚—_ƒÂ`çNž"¬a)»E6““ºV]ÝÚV]ÊQoT¢Š+¼¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯×¯|bðK~ÆË¡YxwUñDŸ¡X>—â{£g-äw—Amz“Å%Ñ·_7Ì’5G2@`P«X~Bשø³ÂÞ ý”þ6ê:&¡=•çˆtHY>ѧHÏÉqg˜ÝL‘‚ÛêHdÁ*GNkâx!Áñ ðØlMWÓ’©›WP”y¶i­*’’qrRWµŽŠS•4ä–›}ç;ñEðÅž¥5ï†|Gc©ÙÜJ\XZÙ]Û]ÅŽÄï-ª JÎr3œŒø¿ðŽ/Š¿³N¸úzYh©ðîU¿Ñì"Wööoo3]Û§ÌNdû42o“{4‘’Ìi\Ýšóí“C²ímííà³¶¶‡qH-á‰b†%,K‘ÆŠ 31Û–,rj‡íŸ®Ÿ‡ß²Ç„|$—mk©x§QþÔ»³xÄžm¸U•ö«„Óß —aÓr¯ÎQÄUÅcÕ¡éßKk÷ŸµgÜ?áŽä«,MWåÕ;©5}/{½Ò??«gÁ¾ Ö¾ øŸOð÷‡´ùuMbþO. h°3€Y™˜¨Š¡™ˆUUfb$cWéwì³ðV/‚¾d¿µˆxÓWŽ;VçÊdšÖHÞ=9ƒüÊbe-(ÂfS±ƒ}ž7;gYµ,›,UEw²]Ûþ®ü¼ÏÊrŒ®®m‰T)è–²}—õ¢óò4¾þÅ~ð&,Ö—¼E©Úý†þ{øüËEÝË­Œ{VH‰Ê¨œŸ;ä žFöJø ö…ø_Á~/ðe­ßÛ¬4»æK;“ ‘¤¶p$€»P_Ëtݵ@Ý»b¿`<%{k£Y^ëW×ÙÙi6Ò_Ks< ‘˜àVebXã sž‡ñŸâÏ?ábüMñO‰V[¹`Ôõ)îmþÜÙ™ .|˜Û–d{($ ¯–àÌf?3¥ˆÇãjs)É(®‰EkeÑ;Û»¶ºêý>"ÃapU©ápÑ·*Õõwîþ_އ)EWèçÉQ@Aøö@»øÃðöËXøoãxÃÅ©Kªx0Hl¯íø€ò¼ý¢eQ0ß!Ù`USŠðßxoWð†±q¤ëºUÛíó¬uw·ž-Êw#€Ã*ÊFG ƒÞ«iº•Þ¨Úê}Ôö7ö’¤ö÷VÒå†E!•Ñ”‚¬r¯¥|)ûhÿÂW£Øx[㯄¬¾,øbßlPêSÿ£ëvîƒqŠé ³ü°’À•yXáæÛÅ|µYfù}ITŠXšM·m!R+²ÚKdŸ#ï)3­{ŠÏÝzÿ5øŸ1WÑŸµ_üU ¿gßZþïJ»ðT~ޏœ\é“<7@ÊùlÒ©C»$¹W¡Ú¹ý<;ñ‡N}cö}ñÄ0t‰e¸ðgˆdŽË]´€7ÞÛÊ­3nlŒ`*¼­X·ßñ[þÁzeÄ¿ñ3Õ|ãYlárú^•{o汕¤rÝ®Y;†Åoá¯:¶i…Æâ0˜š|ÔêrÎ2N2Š© E^.Í^|¶{4Ÿ+f‘¥8Fq—Utú;5×ÒçÕ_ðI|AÓ4oj·vÿgøiªm6mvòšþ6ØÒ[&vù{7$²cæhâU'Ëp¿WþÔ¿µŸŽŸ-´Ÿëðxw\Ó®¥¿³¹¹…ÝCesl²:´_ñó¸J•*Æé_Ÿß³ÅüCðƓ࿠ëž.¶¾ð¶™%ŽÆoo§id€S2@ñ­ÈyBo7«±ws<Ì>›øÃñ#ÿgø]¤x“MÓàÓ,VãÄž.ðî°Å&Ñ® …#·žb©‰ w7¬®ñ¯™ä$±¶ÀK~?ðŽ{[‹hf´g:³kšæTù"Ü\Ô­yN É9)%²¹KEÓ•îãk«ë¯ä~VüTøc«| ñ¶£á}jçJ»Ô,e’'“HÔa¼ˆ”‘ã91±1¶PþîP’(#r.k’¯^ø‡ñ¶}sꮑñjŸ áÕ%[ : htñ#,KÉnÍ ù'j¹RÉœH"½çâ¿ü[VøqðWñ¦™®Ýø¬[2ê«`4×·Ò’ÆYæšæÞæEu”L#O)It@ÌUÙ¼¸ÿuÅçxLšX|6gY*•t‹³Q“VO«QÝ;9uÒövåPs»ŠØø¢Š(¯¥2 (¢€ (¢€ + ð÷€uïi:–§¥ØýªÇNm·Rùѧ–~Íssјû›;–àõxêÊ?R¥6“Û.¿“Lv (¢¨AEPEPEPEPEPEPEPEP·þÍ? 4ÏŠKâ/íU¹û ·ÙºGLoó3÷Xpu¯nÿ†IðÏý£ÿÀ™øå|yá¿ø‹Á¿hþÀ×µ=í|ïìëÉ-üݹۻaÆN3Ó'Ö¶¿áw|Dÿ¡óÄßø7¸ÿâëÌ­…«RnQ¨Òív}Î[Ÿ`pXXP­ƒ„ä¯y8Å·vÞí_M­,?cÿ \ïߤ“·êç˜þxséVÿá|'ÿ@yïôÿüU|„Ÿ¾#Ç÷<âuúkÿg§Âöø“ÿEÅ?ø9¸ÿâë5ƒ­ÿ?_ÞÎÙq.\ÝÖø?ùë¿øc_ ÿÐ_ûý?ÿ[÷Ð~Ø·‚|=h¶¯otóëR‚Ŧ¾Æ#ÞN^8Pm\ð²KrP•柳6¿ñ -6çǾ"ñŸ‰¦‰–KMN½Ôæh¯ ¤ÑOxC9%` ,g ä2¹6Ò¡úwàÏ€#Ðôy~"ë —§ÛO¨iÒɶ9'‡pŠIˆ …óÑcXÁ í×hú½H&¥6ïæÏÒ2 Ø:xUžb0Ѧ¯ËI(ÅJswJÍ+÷_{zDà´?]]|A³ð¥ógÞÉ©¦—;`KäHe·FÃm9èpq׸ôÚá•ñ»Ä_Úš7›¦éJñØ[Å) WÙ¹Wa_”*F€t>1Íc| šÇ@ÔÖ ‚Ôg.ÌòÛÉÜ­)Œ‚KBIÉ5ù'J®aBxÉ·ìÓQ¦îÛz¾½»keÐõiF†[[ê¡Õ”Têr¤”RÙimnÕ·ÒïDÕ¥×¼:ÚïÂ;ý ¡iSÄ ñÏ?zÛiˆò9]Û§Sß…#OÎðÂ^ ÿ¡`ÿàuÏÿ^mÿøýâ|\Ó¼àßßhö~Óã†êMê{F–áÀc¼£u(±J»sƒ<™bIÇ­~Í_²ßÄ}[LÓ|Iñgâwެ䔬Éá ]jæ U7!Aw7˜Y (pð"«¨e̱º²/è<Ø^ʨýr·³ŒR]u“»vKwvöè~WK3§ŒÄÕqÃ*ŽRnî)Ùh–¯ed¾e(?`¯]J±Aá9&•º$w·,Ç¿@Õ¤àÂøC[¤_Ú3ù§œ«ß¿ß§Nzs_qèeá.ÚÍç60B‰sÌòJèUf,ZIXàfFÜÇ³š©©ø‡KÖî$‚ÃP‚îâßË–h¿{9a2¹UŒRb&7Á;Nßϱœq™Ó§õ¼6]UáÓW©6ãuä¬ìž–•Úéb1• r厕ÿŸè†!ýƒ<—~Tþh¶±W{r6‘Øâ®Ø+áïý ©ÿ·>ßôÚº¿Ûúoé?í|Qáßêz©£j1³Ïcª\ZHl_´ac`$i!#"—i˜7È¿|5û@|ZÓ-¼AqñKÄÞð|²2®¯¨k÷M%ÈG ¶·Y7Ê~øÛ!/£LŒ¯Ô²ÜcÇeô³ ’tã5{Iíó¿]×—Dô8gžà£yá`­ýØÛò>°WÃßúSÿn}¿éµXOø'Ï‚$Ue𛲰svAÓ_zé~ØøÛÁvw á[ŸxÞòhZÒoø¿U¹¸‰$*…Œq¼ËioÊ«¢È%u.PË `+›ø³âoŒÚ A}â-_W°„¢ÁÖ—t‘ÚùÈBö¤GæpÇïÀñŠ˜ÿiãkrà\y?šNz¿ð¨«zó;öGÎbx×.£jx.eßÙÅGïkô.Çÿäði‘CøUdn#QŸßþ[ýkN×öðN¥êº-­–£g¦jF5Ô, Õ¯V ³nÍE“l›åwƒ’1^âísâ/ÅÍ6(¼?ñÆ:WŒt}.éíìì/®f8D×l$dH·!±£”K‹xñŒ»x/Á¿Š> üGÑt§øã ´ñ2Ü_î×ïUÙi72>Wpãæt½e“fØzÞË0­‰ÙÇ–]µ'}Vš&™ßGŠ0°¯4l–©F7½µKM_EÜý5ø ð/³öªëZF¶‘}4¶Z™ }Ћæ1•‹°YRHü®s¼•\œ?KûxGV°¾Ž÷MºEÕ»^Û-íÊ£y+¶ð¯`íXרä]µ?à¡_´¬~øÂþÕžÖûU`»±™–Kh"£òC¨Ú ¶×Rñºœ¡¯•þ ·Œ¾5h miûSêÄ+™BXø[XÕ5("™L±Æªo ló˜±+K+·¡/åþyW¯O _>Íy©{yYG–mÆœ\”9ÒNÏWÍ'hÛ–öx³T}GSð¤R^I“$°M,c,Y„r(f$¶XŒžç¦2Çüßá?ñI?þ .½¿é·Ö¼6÷ãïŒ|e¢Å£x‹Åzõ¼QÄ ¶ÖôKÙm5 ïs$ivIT,·;Ù€p’BÒÎ?>'ünøWãíÂçÄ¿Gªè·²ÙNS]½ÈQˆG½•Œn0êÄ «)Ç5ÅšäÜž¢…yÝ;Ù¦ìí¿™y‡&[(ªØxÚ[4•Ÿ~—Òçèÿ‚{ü'ãþ)'ÿÁ…×·ý6úÕñÿ÷ø;ÇüQßùU¼öÿ¦•ù™ÿ ñcþŠŒðuÿÇ(ÿ†Žø±ÿE?Æ?ø?ºÿã•áû ŸÏùž;Ìð¯þaã÷/ò?LÇüßàïñGåVóÛþšW âÙökðߊ†¦ÐgÔ|F‘4óhúº®©yoóCkæ—ñÄ–ÚÜ6ŸŒÅŠC+æ;Òt˨[<†eßi; žf@K…dyW¼ïS6°ê¥ä Ý59YZI;ÉÁ$¹—:¾ÞõœZÄWÃJœZ^ó^NÊûvO¶šO¯üÛàö|“ÿa[Ïoúk_—ü=gዞ6дè~ͧéšÝí•´;Ùü¸ãÑsrp žOzÜ¿ý¡¾*Ùß\ÛÃñgÅ—ÑE#"][ë·¢9€8¡ÙX)ê7*œ@É20.À’q_³Î¤0p•|ME-ÛvKÕ½ljÄRÄÆ4èÒ³]’»ûŽ Šýðü‡Áÿ ôxuÿŒ:´¾.Ô¥“ìö~ðë¼Q]Ü0—l)!1Ë3 &AbòäiÄ®ãŒñ‡ì“'lj,“ῆô¹5{écÔ5¯YÈ,¼/iû†Cc§$Q…¸ˆIãŽI¶‰d,îSæp¼[•âãWN¥°ôôueîÁËùc{95Ö˵¹¯§<°u`ÔZ÷ŸMßϱðµt~øsâŠ^"‡Bð–‡{¯ê²í?g²ˆ¿–…Õ<ÉîÇgPdrw ‘_¨à˜>ê+©øÃPŸâü2ù–ö÷6ÿd°@ l¥àWs+®w1²¾ g¯®<;á½#Â=¾“¡iVZ.•o»É±Ó­ÒÞ·1fÚˆŒ³18’Ozüã9ñg†½<ª“ªÿšWŒ~ës?F£êzTrŠ’Ö«·âÿÈüçø?ÿŸÔ5[GâWŠÿ²|ÏžmAE–uFˆVº|¢H²,r) ò¹Ý•Îø»ðà×|}â {VÒ|k%¾›«f~Û­ø˜mŒ›‹Ynf@­6[0À Åm#Ç'‘>Úû£ã'¼uñ&êÏCѵmBði…¥ÕPµžú}JMØ[G¶ÅrÎ|âd FÉ噜̿²_Âí?Yºñ¿Œ¾8Õ,£y_Xñ¥ÌOmij±(mÑ"µXy’e¢áœœà˜Êx÷’O0Îñ2«Qüi«F:èå²nû&æÒÕÝÙ.ªØ ¯gB).²{ü¿¤~9xáω>#_jàxƒ]³µ‡O´—P’Ö7-å,¯`n!XnÚ¡Š±tÕ¦ÿÁ:>>ßj6¶Óø2 :¥HÞòçX²1@¤€dq¬åTªÍÀ'Šý=_Ž^µÓí´¯‡:¾.±µ…m­®4O&ÛD¶BĢ銣ĸ*ßdYÌ^[+ `¨ß6üLÿ‚Zè³Mm'´«]ò"K§øL:µå¨Ù¼óÄcœµS/ËáF“ÚU[¿K;'Ýü-[¿^ aðT4©QÉù_©â_ðéÿ‹ô1x+ÿ®ÿù±ô_ØsÁ×=¬—Ÿ´Ý[Umßjµð‡®¼O¯Ìvo–Õ·&åÁdi’.í„Ö?ÆÛ2]J–OHct]wâ1j1–Eí¬Ð K6R0|´"_.6>iâÚ·âç‹þÍöïêÐ}ŸvÏì·]?;±ÿg ¿îŒnÎ9Æ2sõø<·ˆ'N?Ú‚ŒºªTà»éÍ5+­ùÐã\:»§÷·ú[ó:?Šÿ²n±ðïû/ȹ’¶y¹ÿ„²ëGѳ³gúœjsy¿{æû»~^»¸ðZ(¯²§ B 2““îíÁ%øMÝÞÁEV¢ (¢€ (¢€ ô¿ ÄÿJÚ›]YøOLŒÏªêûTƒ±Ì6ÈÌÎéå®Ê2RŒÉŽ7žÕ¼oâ =D³kýN툎e@©gwv!QUˆTUfb>Ùð§‚a´‡Løyàt—YÓí/.Þ锤š•ÈÖk×% Œ„ÈX£‰wa$¯Ù†ÃºÍÉü+v} dO;ÅþùòЧ¬åµ—k÷}ú+¾–~ƒðÃÃÖ¾7צÔõ‘i¥øGöp=àwxíá²·"†ÔJÍ•TAw»ï ŽYÙNs¡øÅ?Åý;Äþ*…-!ðójMá_ ‹De"ÆÜCqxÒ+*„9Òš51­³ óxÛcãT4K_‚^ÔåHm"sâ+ô¶òd»2…uMÜq"0.'ËÆ]¶È߇t¯øF¾|:мϴ}‡Ãv—hÛ·ÛKê[väãgÛ¼¬çæò·q»jùØÙ®Y8Ÿ¤åXèñOÑl6-Â=-%+ik·´ºI/3¶ñì:Þû*^i^ÓîgñOÄ PéVžG–Êö«oyL²–(µ Òl{U¼ÿ†‘xKÃzOü5z–¡#ùºž¡f†1ª]‚íæ“&b†71¦ý¡U$”¤M4ª=câ}ì:JøGÁ%¿Ú5½/O[K¯³Jó½µäë‹›h‚’¦Fw”4‹¹¶Ï$*QU>øõñqdß…ë¥itÿü@ÇqÍk\}ð0Êá8ÎÔy8•`çæq§ŽKMÚ ã—õùjbkQÉ«WâljR¯ZOØA¿³²›ßìÛgk;+][câ‹t‹¿ˆv|3e.£¥¬°ê>:ÖÏjM‹dÒþ=¬­qXP#_µ$[‹Ìî¾¹àY\×$iß ¾kß|O,Ûwf†-ÒH$"6Úƒ2I"Ƨ…¾JíÜ? ¾/üSÕþ2xÿTñ>¯4¬×20µµ’]ëgl˜àBªP£q,ÇæbONW•® ®³ÌÖ<ÊÿºƒÚ1é&¶r{ëu³íËñ¹u–Eå¸Wªøä·o·¢ÿÞýÅoŽŸÿioÛE«\\ßËw<1Yx{IYL prˆcƒs3Ìí#|Çs’ûAÆ~Ãü øeðà߆<·ûU”FçW¾C ‹¶K™wC"©²‡òâ‰NJñùÍÿÀø1/Ä_Ú|Yuh~ ‡í²‹ˆc™d¼•^;T Ì ²‘$ë VÚÖÊ>RÊGé§Æ\éƒJðæŽ!“_×·iÆøáR­,²:î]Â( šä¦ä. ­ºE¯'‹§<ó6Âðå9Z’^Ö»½­½}.ïæŸ,­esçiÇ–›¨ýóÇÅ ]þѾ.~¥ö½;á>ƒrËui ÈUñÒ2•µFL2Û[8e–MÀ¼ÛãP$‰¥‹sÇú焾x6oxàEm£ÚÄiú5ºùFPÃq”Ú6 Æ¥@UÜJFŸ7£iZ>àO [,óˆtÙ™%ºÔäOßùš[™Uw’MóLä.òf~ 5ùKûX~Ó·ÇÏÝ[ÃvËàí:êOìëxÙñtA+ö¹wÆG ŠÛ@Év_%k‰*¼|Õ°´Û(ZÉ¥§3_‚VÓnŽþLèªò½MRèh|lý¸¾"üXÕ#þÊÔîü Û¤km¦h÷F7j°ætTb¿;b5Û>\®ãÒþÎÞ)ñψ4Oø£Å.ñ± CnÚ=–›©êSÏm}{2|ÌÑÈJÈ–ñf\©ÝòX¶jùÏá÷õ/‰^5Ѽ1¤ùk}©Ü, 4û„6éÖIåeV+hG|¨ŒÇ€kï/‡ `ñdúg‚¼.F—á½ÐM=̱f8Š;›çˆ1-4òl;7¶ÝÑEæ¢RŸ§ÑqH©lyyÆ/ØQXzJõ*{©~oåýu64 _OýŸ~ëßõm¤×ïUìü=ÀVlÑ|£ÌRD’ol‹´¤ed øìàtÏßøšâ2k3 kC±Kˆ#f CäN 9O9'í=ñ@~Òÿü=ðÇÁsE‚ôy–ÎÎ{K‡š9BDªòÌ«"Ánˆy.FÞh¨ý§ñ_‹´{ì\è·–=ÔÉœåšÞŒDÞTS‡‰Ñ>æ ïÞß.êš]扩ÝéÚ¤ú~¡g3ÛÜÚ]FÑ˨Å]¬¤AkäñÐÁñbø‚TêÔ|ÍÃÜæþìÒ·5¶|éÉ5ºg\ëUIÓž«ï·§üí¿…Ÿþkºœ^3ñ¥âøkXÜ ÞGš]1nB&ëˆäÌݾù»*-°ï›ò÷í ñFüKã+kYìíµ9£1Etáå+Iw#€Ì# @'ˆËc'Ï(¯ŽÄãy~±7.Ue~ßçÝîú‹¯‹åöóråV^ŸÖïwÔ(¢Šá8Š+cRðvµ¤èZf³u§Ë•¨Â'¶¼\4l¦kˆWqìbö— +aˆ‰ˆsRå´›ßo>¿’lv6þ|SÕþ7‰.t)¥³Õ5m%´¨¯íåÙ% yá‘Ýx?1H™J—ÜÎøwÃz¿‹õ‹}'BÒ¯u­Vãw“c§[½ÄòíR͵8Ubp8žÕÑü6øO«üLþÚº¶¹²Ñ´ÐÞjÚþ®ï„g"0ìˆìÒHà$q"³»•H GÝß-tŸÙÀz¯‰ôí×ÁP lþ1ø›1]VAJòE‘ ®ØÞH¦Ùºó[j¹2„O…˜æ5éFt²ê^Ú²¶—J1½¾9=´wåW“[+;›Ó§Ó¨íëoêÇ5ð þ ›-œ)øåƒ¢XÅö¦Ñ­5VUËH×—)>ZdùN[l™/BÞ¿ücðó_Ó¯ô_†Òéshš«ÚìÓ"’Qç†XÔA#|ûœDÌT¸ß‚ÜþnüDý³£×<_§Yø3HÕ~&ë‹Ùu/I-ÄSÜ«²Böz\8b—ýW—4qÇ/Ìà¦çfo·¾xâÛáWÃý?Ázd²üHñÅ›Ü>µ6—" 59§’kÏ>ïbE¥Ì¬ *­p‘²7ø5ø'd9Ö64¾¹Y×ÄÔ~í*iªpKâ–·ml¯.W­ÛÒÇ¿‚ÄPƒ|‘åŠÝ½ÙêÞ:ø_á߉“éÅ:|K%ÌZEüÍg%Ã!f‘NöDyUA;?zÌT²ÆÉâOŽšE¥õÞ‘á{Y|i¯[Èöóæ¸vS)*Ëuvw#íù— ®@â¾ ý¢¿m½1nntùîãñÆ«åb-7Ãú”öÞµŽDf1\¼rçTl˜Ö@ê°ºp2«|¯ñö­ø‹ñH}õX¼=á£@š‡àv±Â±y^H+ûƈ©9—ž˜ vGádç sÏk6£µ8½ÝÚróëÊ¿íí¯š¤Ú¡›ÿ#î~ØWšÿŒl<+áïŠ ž3×'M7L³ð~Ÿgs¢XÜÌP[ »»¨¥{€`¯-¾ÐV3ûˆœßMEñÃ_4«Oé÷úÿ¼G¥Ä±ÍeÑÔµBÌžeåÄ®±ÀάÒ/Ÿ$Jà„ªƒñ_á%øeñ+@ñ"\^ZÃiq²íôæÙrmdSÊÄÙRŽÐ¼Š®¬¬¥ƒ++Ã×>#~Úþ4Ôõý;À—Óø?Áæ9-ííU#–öP北3\¸y>Ñ#;;:¾CîgÝ#}®eáî[˜×£NTpôÖ±‚JS—NiZí%³m¿z[nøif5iÆM»É÷Ù/$}÷ñGö¯Ö>ý™|M­øáÜï‚¶²ß\]+nÚâ–ÑáE1¸ÞVEbq”+‡ø«âwíÈÚìò>‡¦jšþ§©5¶½ã{ÑuäH©„¸‡Lˆ-•µÄm€’Æ„áX°&W¯•/ïîµ[ë›ÛÛ™o/.di§¸¸ròK#YÙ,Ä’I<’j úü¯…òl™óàpÑŒ»ë)wø¤Ûü{vG\UjÚT•ίâ'Åo|XÕPñn½w­O|¤™‚ÃUU¼¸”pEÎÕˆÉÉæ¹J(¯¨9BŠ( Š( Š( Š( Š+¬øSà ¾(|@Ñü7ÏØ!»‘仾òÄŸc´‰k››—Ìò¡ŽY6¹¶m\±šM»"£&£vÏrøá(üðÚ?M/ˆ¼RÒǧÜ`y–ºTfH&d`Hæa4MÂÈ©fëÌw$z×üqì·û>Ëâ¦F_xÆ9l´ˆ¼ÄmlpÉ;E"òƲ“µÃjQ+Ñøðò/x‘ü[â )ü=ðËMµýÏÛ.(E´Fkd€2¤I $²ä‘±gYw|eûNþЗíñ:û^šK¸tHÝ“KÓîYÑã8ÞåP# íÔŒªîeE¯£Ç¸`°ðÀÃâÞOÏ·õÒÝÏÒs|\2\ªþò^õVŸ_åÓú²]ÙÈ|?ðÕ×Åß‹>ðýî«,Wž'Öí¬'Õ.¸‘d¹Q¦`X.XåcÜg5÷7‰õïøJü_­ë~GÙ´¯¦¼òwïòüÉ íÝœgÀÎ:WÌ_±Æ—auñ7VÔçdmcDÑ.5ÝÊ“%Ø’(Ë¢Ÿ˜¼Kqt¥hÚÙdÎØÛ?dxKÀvЮ¼mñ C ø>ºÿL Þ©¦Ü|ÞQÜ 2|Ò X–OÄEÍrÄúñL›ŒÍñ³J7Q_Ìì®Ò]oxÛÑê•Í_‡)¦|6ðv½ñCÅù:n‘ldӼͪÒȤî’-ìpÊ"Œ’QµƒÅÇæ¿Åoˆ—¿>"ëÞ-ÔÊŸS¹2¬9SäÄH¢Üª¡¶F¨›° mÉäšô?Ú{öžÕÿh?$0£é> Ó›n™£¨T*ìYeUùwíùUGËü«üLüWÀ i¾3øáðóÃúÅ·Û4WÄZu…å¾öO6 ncIrË•b2¤žª¡B4!ʾgæ\CžVâ |±•U–ÑŽü±]?WæßM¸¾xU<ð›Àzª-Åň×ïš'gIn/‘fÁnAŸa”¡á|’ïô߈îF“áÿxXy‚çN´[›ÝèÑ0–rÒ¬L„u\ó“þ±¸S‘^EਦñÏÄk/í)%–MNûͽž% Á\–šN €Y‰Æã½+Å^ ƒÅÞ-ÔµËIk[ͱ‰Y–ܵ­Â€Ü³ÛÌœõÙJO๽Z¸œ>/1KIÊ0ÿ·nåo—,áÔýÂxZ9}LPÚ½(9ö¼´þ|ÓCäø)×o­5Ïü5Ž?³éÚv©r7+o¹c$E~îFÇ'!ˆo;¦M|5_­?ÿg~ÑšŽ›­øÉ5˜u«o±ý¿D¿Kw¹‹qu b•IRÎC"£í¼¹Á‹ðö[ø}ðRu xsv® ŸøHµyçPÎ’•Uˆùr:F]Þ¯´‡døl!…Œç8Å%N1|Ú.®Ü¶VÕ¦ôÙt?ÅdX刜ñI¶Ü¯£»ûõó:?Ø×àpøðc@ð¥Äb=vmÚŽ¶wgó*y‰Ãºþé82‡kù;ÀÍtVþþÐñ$¾3»HÚæâ ,¬GÎe·æGKo(êíojÕ“ìí†"B²µ½þAȾgÝÜÊÔà~8¯ý’~#è¿>Ûjº$“4IâhO ÄE$·yµ¯6ꥼ›¨”%rØÜJœ~5C0Çbò ß=jÓÄÕŒÕÚ |+´R’…ú§mìpciÆ•HQ[E-ÿ$ø·uðûá‹àÝ5¥·¼ñkJ×S¡*RÞ2¾bW «³¿4ü!á cÇÞ%°Ð4 5-ZùÊCo œÌÌÌB¢*†fv!QU™ˆ‘úáûEþξ øýy£ßø¹õø®´¸^ÞÑu5ÁóÇ,R ` Ȩļ¾ÕÛ7ÃÏÚ'„,®l|- Aà]Ëö½Z[{™É»ŽY›|Ï$³XÛjÉ1!T»³~ÉÃÜE–¬·ƒËÓœãœyZ³[¹=­{¶ÓgËVĪI¨«Ë·ùŸ.ü1ø/gðCÕaœï‰ux…®¡©Yù«i¨™%[xEFl¼QHòºÜŠˆUÞn·ö¡ñoü3×ìÍoá8‘âßo[ÜLJŠƒÎFÝü³‰Òá’K™™OË^ÏðßÃöÚçï¼E§Øô½&QummæÙ;3h÷d³kI¸‚ÉÚß|WçoÇ?_þÔ´<¿ØŸé“ΚF”m«jŒØ•±p¬ZI›r–@ä„ö™\êâ`ñ5^ûv²íä|Ö] U«S5ÅËDš]’[µåÿç¥þÅ MDñŽõUŽÎÕ£û-µåôaaC¾w9ÂlÈŒoÉÁ‰Ç˃Ÿ ñ¶¿¬þÐt¸$º¾Ö¯âÓ4k $ÄpGó¹D,Xù‚ïw<_CþÓ¾)±øCðFøoáé<‰¯ ɱ•d[DÆ÷}…pÓ?•ÚãÎÏ5à³üœ¯Âoû´Ÿý,н¸Ïš>Fy6>¥\Ö¢²›j+ÉiÁ/TûŸOüÑ-üUûCü6𯅮á›AðÅÄi×S«Æ·6öŽ÷—XF¸\Î#lùfàG¸*;ï÷ž1ý£>5øƒÁ>Yu=?Ã¥äšÒKØíâybDó7œP(…A-€ \jñ`øEñWBñ]Õ´×vÖFhåŽÜ¯˜©,BΡ¸fQ!`¤€ÅpYs¸} ñRðuÿ€¾1êÿ õ?k>#ñíÉÓ–OU·ÓšÖÖXPÝ9Ò[È7É%ÆD,-°?vá£x‹ W†¸Ž†? ƒ•Jt°nr¹B5h©)µkIÂJQÕsZ£ÝÞý¯ *nZ¹Ý÷µºy_ô3´ßƒþ4Ò~\xSÇzdÖu¹“Qе{gqi¦Ü*±{iæD\–E¤A檬w×–êŸ çý£´ÅðÍÏ›}â{ 6âOj 3Åö{w•lY€kyeX °‘d—øWm¥þÏ·O{¦ø’ûÆ:¼Ì†æÊÊk‹Îp qòç¿B’°)"Ûª°u"â7 ý1ðïÁ 'Œþ xŽÓKMç\˜j—zµáMjÊÒ]{@ѵ %½æ i6Ý ‰<¹ï-„…J :Ȫ~Û_²vµñ7áσô¯‡Ú–£„ôÉtÝ?MŸS{yà -ŠÆÑ4Ÿ$»a¶™M"ðûf>ý’¼_¢~Ïÿ³uÖ¡ ÿd^ê7Au/x¾úå?³t×x•¡³53ÃÐ1¶!–iã[…s¶ºßþÔžø÷ðªÆ _ÑlüY³k𬚼ÂÓ\K¦’Ê8Üí†i­•çM -©VŒÅ,S?óe|SϨãhJo ®4åVóKr¶â𛋻Q“¶–nJ÷Ká^P’\Í]ÛMµßkùhÞ(»ý•§{ü/Ž_‰örôûÙ¢YÙ[Gq½."TPn¤iE‹Ÿ3åX¡¹@V¼gÆž:ñÄ]v]cĺÅÞµ©I‘ç]È[b–gØ‹Ñ31 (ÉÀÖ|DøÏoñKKI>x#ÃÓÇŸ*ûútÖ3&YKd,Û!qûÄlm»IÍ[øwð§J×.õ?Šúmþ¹¤Zìò´­6öHf¹Ü²+a0$ÚÆ&ù®mö€Hós²¿¡*T©„º’ƒ©(«µ““ëÊ¥-ßg/™óÉ)Êײóþ¿B¯¾x“à·Ä]Þòâoéi=õÀÒT›O’Ú{ŒJŒ1 _&Ý.ÖB¨|©Qð fø£ûCø«âMŒZ ]Ë¡ø"Î4µÓü3g; ¶ŒF"ŽW?5Ã/”‡t¤üÙ*8¯Ô_ÚÇþøoªÜ&­qa¥G¨-Ï‹màÓž;­^ÑÝí­·+[„FI‹Únó$†)HÌQË ÿ‘ßü]kã¿êÚí–ƒ§øbÎî@`Òt¸„p[FªT-…˜‹ à|ç g5³ü¾8êÔ¹²ëvÒÕê–¿vÎJÚÞí¥Ó‹£=GN.ç7Ez'À¿†üRñœöÚŒÓÚøJ²—TÕ®-Y«D7g ,òA}¯å™„ŒŒ¨Â¾•ñÏÁÍ+âÀox—ûÃ~´ð¼O¤]ÚZ¥‡›.åßhó-w˜F™Þo9­¿xÒïûÊxiÔ¥:ÊÖõ¡Û‡Êq8Œ lÅYS¦Òm½Û¶‹»WWÛsâj(¢¹O(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*Ηª^h𦣧]ϧês%ŵݬ°JŒH*Ê@ ƒ@"«Q@¹ñö±ø¯ñS÷úмZú¾—åý¦,m‘¤Øêé—Hƒ 2)àöÇJò:(  :^©y¢jvšŽw>Ÿ¨YÌ—×v²4rÁ*0dtu «)‚AŠî¾(þП¾4ZÚÛxËijë6ÖÓ5Äp˜b… ¬0]„H¡Û¶HÜØÆãŸ<¢€ é~üAÕ~xÓNñ6ä5õŸ˜†+¤/ÑKE4N µâ’D%J° J²° 9ª)4¤¬ö*2pjQvhû±ÿà ž ðwƒ$Ox+X&¼‰Våµë˜^›fv‰b ÒD²;<¸‹õ,¥P/‰üý³|að–ëìºÌ)ãÏ <“Ï&—«ÌË2Í+i#»Ê™»”%£c,¬S{ï?Ñ\RÃ{«:iÃùZM}Ìã+â.¥Y:í]ßï>ôƒþ “mb¸³øAcjÝØëm6G¦%ǧ gß­y—ŒࣟüKâ}7S²šÏG²Óï–é,cJ×q$Ë"[ÜÌϽ“ QÄF ë$€Œ6ËgKÒï5½NÓNÓ­'Ô5 É’ÞÚÒÖ6’Yåv ˆˆ –f$É$N† …‹†”`žé$“õ²9êâ+W—5i¹?6ßæ}éñwþ ¾^èÞðÆ¥á¯ê1½´ÒIz$†Õpóbž?-ÙÂí*6 W;‰mŠåoÙãöñWìßã#¬øze¸Óî¶G©è÷k{è”’2².X¤€¥˜r¬êÜ>xËá¿Øÿá-ð–»áo¶ïû7öÖ›5ŸŸ³nýžb®í»×8Î7 õÌÖX\»‚Ã,”cM}”´×]ŒçRu%Ï7v}ù?üZ9pËð†Å$uθòc×åxOâ·<×±x'â—Ž~!|<¸ñ?‹|=øRoµ Ö¾!ÜõVºÝ¨Ñì¢ãÍKk™fŸ!²»&ƒc 'ÍV*?£ñxþ0Xª™nSAÊŒyTgR;Z:¾fÒj÷ÝIíÝ#’kƒ“ì}io¡|ø/£iZŪ/ÄmKP€µŒ÷SCyk.Ï2'™!Qå,M"º3Ï*Éòe£f®«âÇ}GàÿÀW⦵mÞ&ñÉm¡iw~aH¢bLJÌ6\$·.I *Åo†BTßᮑð³Ã?¾:\E˜·D´ð½¾ènM¥a¶1ÇåˆÊƈ#·ˆ¨Œ(bHYâ¯ÁñãÅZ/įiQCá˜-šßÁ>Ÿl–ÿgŠg…¯®âÄ?y "Û(ÚÞB‰3J.â,O¶«ì§]׫Šw¼Wu‰z-~v<ú˜º±¾3ùiGá_ë²ùô¹óg?g‰_Oü$QX´zn£pÒÉâ?Þ-´7$ÈÂi‘å>eÙFW2y +ƒÁRÌ ûN™ÿæÔï´ ¢ß´?øHCƒm7M§4y\™nYd|ùVÙÇ ó Í³é¿ xçþèü[ãMcNðg†ü¸Ùnïš(` GÇQ"ˆ)QXÆ» y`Œ î<;qá«øç›Â¾0Ѽac æ“IºŽg¶$ ‚e™cß¶MŸ1Ü#l}ÒáÙîoš`(ˆ¤¹"÷zþNÏ¿âgC0Åâ#í½—,×Þßð}>gä§Å?†š×ÁïjþñÀ5M5Ð;ÚÉæE,oɨp×ÑÀ`¬ʬøMð»\øÓñEð_†ÒÖ5YY"k©DQFˆ$’;rv¤hîB‚Ä) ¬Ä÷—ü+HÒäø_ðËQž÷Ê×m.&¶·°2¨2[ÌId1‘¸í1Û|à †Aܸôoø&_ìüß>\xûU±òüCã¦Ó·Á¦£þè ц_9ó)Ã2:-« ZæœK« ŽqZü£÷œÒ´{îõëdϪÃRx‰Æ\øöøñ'ö{:…ãkØõ ›¡Ïe¨›‹"@ŠK‘ OµáÃMíѦæän5?öSøIªüZñõÍ’Íy§øF;GÄ7öñFéövVhíÿx y²ÉˆÎ×hÙ|ð‡È%~ÿ‚ªüYÒuøgáõ„6Wwš8kûËåTy`ij®+¼î¥Få[VÏìŸþÙ|øKá[®­jv¶Ú–½sqnðÎ×r©qèw:ý™eò6v)+V•Á3,ï•dÔñ8¸¥ˆšJËe6®÷{G]ßK_SÜÊrØfXÿcýšÕ÷²ýYógí7ûj1êšWŠ>xsU¼ÒüA}t.´ÍÐI–|ß’o1%‚Ô“*~ñBÂ-òòbEÇ¡þÄÒ[ªKâßizj†ûOÙ˪]Á?÷ùì«ó$SÈ7´:’ãô7Åqk?.ä±Ò-Ž•á‹70Ã-Ùa ”M©æ8 ^M¥@P¨9þü‡Åüi èZmŽ­áéÞ0Ñîå–ØÞiÏySÅå3ÆÞ\Ž¿vhÞÏ' ÇO;ÇϧFГ¨Õ¹ž‰¸­4¾Ú?;3ô\¯…rlN5añÕ\jÎî4¢ïÊ–¶”½ím«ÕuµÑó?íAã¯x Â~ð]çŠßTÔ5½:M__ñ—y>Ís,ú|)'™r‘½’Æá€¶Y•˜yË뱿ÄÖ»¿}@xZÏĦòAqáõÖì-¤‰rwH]m#PùO J%\qAº¾šøùâÿü.ñgìÚ|M{n?³´­fêG‰|çÓÚö=Ö…óE,©&ôRÁ­ÜÆÑßüñL:lÚΟý—®è)göôÕtÍJ†{q˜dY–F]¹9ÙÎ22'ípíÆ(Æ +-²Zl—D)áÜŸ0Çbðø¬o³P›Œ.✽æ“mÙ>š%vû#ð£á½ïÂßÝxZþ{&ñ6¿«Cw~ê0Mii $vˆ.Q¼ äÝ\¼Œ$d `ù‘–U—ûPx#S¾ø3áÿ…ßnôMZÙ®cÕµÝ]¶z4õ:(9Ыœ—·F™û•7‡´¯iwZ6»¥Øëz=Ö>ѧjVéqo.ÖV]ñ¸*Øe 28 ¢¨éŸ|;ðÙ._ÁþѼÛ'ÚåѬ ÓÒ`¹Ùæ´j¡±½öî1ÿÁ ×ÿ£þÇâÇýÿà†ëÿ×ê¹6I—ä4=† z¶ï'êÿD’ò<¥BIÝEýÇÑ^‰ÿ ãñcþ‰ŒðCuÿÆèÿ†qø±ÿDÇÆ?ø!ºÿãuô<ÑîW²©ü¯î9ÏxQøâ»=Kx"¹&™çºr±[Á O4ó>b±ÅŽB+9 B«1 ~ØøaðóAø»ãËÈç–ïBøWá(§Údxí^ÚÊ$+÷*ð¤ò¾ë™Ž³¹5äþøu«|øq~Þ!Ò¯4Ox¿ý‡P¡žßH†`Ùdoùøº‰HÈYiàŒ¥Ç>éñ“Á>5ø[û+iž ð„õíWÅ^5”Ýx†çIÓ¦™ìí« Y0¯mhÐÇ"°ËÞ®pE~••Ô\=“ÔÍ/jõ½Ê~Që/ÃÿIî{0¡,.Û5ïÏD¼–ïúò8m/ÙŽÚòGÖ¾3ëÅ«&  Üé†24s‚0Û°w `ë?íAð'öz†öïá>›«øÃÆmjÆÃ^Öm]ð%ae «¸”‡sdóB»ù?þÛâ¯ý?àŠëÿÑÿ íñWþ‰ŸŒ?ðEuÿÆëÃÆñ~w˜R• F.NÑ¥h¦»5¾}úž°Ò”¹å }Eð¼ú—í/ãÏ|Hø3jzfŽ-ãtNÑA4ò»ý—OM­¾6Gu+2òÂS"K2Ë_Vü7Ñì´¿ë¾![¡ð®‹de³¶a1ÝÉÔŽ( ;c0 Qqˆ\E†Ut_0øoð¶â{ÿü&±ck4Hº†¯,‰ûÈo®aŽ{æ’'`RKhbŠÙ¡Ü2Ö,v¤’2‰?o]/Æþ5ñ^‹àOøÄŸð‚xba]7L¹–Ök‰쫦å”"0]äóã$î$áÃÃ,ÁR§?âU\ÏÊ/eóüïÙ5õif¸Æä¯J—NŽ^~ŸåÝŸ2þд‰hŸˮ벘,¢.šv”’ŠÎ&9 ò6yˆUUû?þ éðöçCø=qªyRCÆš {xžT1Ékj^$L}ÂÓÍ|Œç÷1¿Ç¾ý—>!ø¯ÅúV™ªøSÄÑç¸E¿Öõ"Xà°·Ü<ɘɱXªä„ÜFÚ‹–eõgÂQAàÞx’ÛHº:uŽ”ðhú&ºæåm ˆB‘G¸ƒ#ˆá0(™ÏÌÄüÇ=Œ±Ôc–ÑzÕ~óþX&¹Ÿè¯½ÏgÌç:^ô¿.ÿ¡ó/íIá¦ý©¿lü!Ó¥2h~³Yµ­BÞc–ÖXÚv.Q‘KA°ˆ•+æÜ*3á~íøŸãüøO}¯]Eo¥hš&Ÿ‹{KEŽŽ(•Pp8Ô74j:Šù‹öø;«øCÃÚßÄ?ÙËüq¨KssöÛA޲ÎùB†4hšYIJºQ‘-ˆ©Ç)ÿ3Ö~ øäè|á?k:`"ëR¹Òtë‰â™ÕŠEè‰ w«»#/ðÛ0äølMñÑÁÇýÛ”šèê5î/>T¯ò’êzôù©S|«W§¢ê|áðןµÏíY¬x÷ĺx›ÃºlãZÔ-§e€ª–6|¯.PJƬ®É 7 á_¢štW‹u¬ëWËa£Z#\^_ÜÊaAgùÛó3· 99È …û;þÍ–?þXøF6²›_¹o´ëúÕœm‹¹ƒ3d;š8cbˆ>Pv³„F•Å|Ûû~x¯â'^†~øâ‰ü1§´SÞj¶vG|ÛL‰ 4ckÆ­&æ-ÖUT Ú(Sã<ÙÖoýÜW÷ç£vòÚïµ­ñ]}V½L“û•ûúº÷åOŸo?CÅÿk_ÛKQø¯¨ÉáÝ\è³[²3Ûɪ ®d !›·/¸¼™b>‰ðGÃ;6ü3S5½Î“go¦^»<–—2J×:†â˜WXn'º©Ûåħs`¹ùËöWýŸ8ñw†uoéþU¼°þÕ²–Ûí:™'슛¶“å•{’v²³ßQŸ¯´‹Ë¿…¿ u߈n‡©øÅ)>›¡é–:T·y“jâb#„e·#8eRd™ÕG׿RŽ'G,£k+JVÙEh—üCÜáŽl§ ŠÏñç³…;êÜå«zöÓ^¾÷T|EûzüG¶ø‰ûHë©§¥´zW‡¢A´Khš1ÂXÉ õr¼±‚ .Ô\9=—ìÏàÏøBþÝx–ávê¾2ͽ·?sJ‚œðÅOw0Bº}ƒŒ¤üøÖ™û>|Tñ¿Œííµ/ x†ÎóU½kÖuí>é €Èù’æêfBV5ËI$‡8PÌzWÞŸ ü/eãOŠºM­”//†<=mjªºŠ#É%…”QAιÚÏ Ž} ®éY‚íS)¥hİxÚ¹®9~ë 7~²û?=ÚóK¹åŸ¶ç‹'øUð Á¿  òmõ_»ë:üBPeEWF‰'Rñ“¶$lÃÙH 6\×ÁUô?í/¡üQøÓñ¯Å%øªÿO{§¶Ó$þƽ,ãb°•Yro¼aÇÏ#œ ‘^aÿ +âOýÿàšãÿˆ­ÓÝŸŽ«‰Ì1U1ubù¦Üž«½½ËÈáè®Üü ø “ðÿŤè×üE3þ—ÄOúüMÿ‚‹þ"—<{œJ…W´ÜÎ.Ší?áI|Dÿ¡Äßø(¸ÿâ(ÿ…%ñþ„?à¢ãÿˆ£ž=ÇõzßÈþæqtWiÿ Kâ'ý~&ÿÁEÇÿGü)/ˆŸô!ø›ÿüEñîW­üîgEvŸð¤¾"Їâoü\ñ™â‡^+ð•’^kžÖ4kGD³ê2ÀŒä3¨áXãØúSS‹Ù’èÕŠ¼¢Òôg=EU…Q@Q@Q@Q@Q@~þÉŸ¶OÃo…_³÷…<-¯øìµ‡Ú¼û°\˳}ÔÒ/Ì‘•9Wƒí_œ”VU)ªŠÌìÂâ§„›œnÖ×úGë¿üã÷?þHýQðP?†\ÅG'þÝñZüá—ñQÉÿ€7_üGÖ¿+¨£êîÿò/û~¿üû‡Ý/þHýQðP?†\ÅG'þÝñZÙðgí«à_xŸNÐ4u濽“bﲺXãP7I,³ "»»œ*"³$~J×oð_â-·Â¯ˆ6¾"¼Ò¥Ö¬ÒÎþÆk.Ŭ’%՜֬VSJ‰Ë £ ®1Í\0tœ—4ºíþEG?¬ÚR§½%ÿÉ~xnâÚ ãö«ã=y„ðÔn“ûP…‚+HãÞwï‰| ²¦B²‹¦R+KPý¿~\ßO*x‰YÉS%Îâ3Á?º<ô'žµówÅßÚÛÁð¦ï~|%еÍnOøkì‘¥äÑŒ4‡ FA ‹q±šWzù.¾—>ÆSÌêBÆ4£äºüÿ+ˆÎÔqN¦ Á.Xó'·}ÕŸ§¿ðÞßüÌ1à ÏÿúWEðßöÓðŒ>!ø[A·Ö¡¹ŸTÕmlc„ÙN$ÈrÑÉ r@¯Ê Óð¿‰u/x—Iñsö=_J»†þÎãb¿•pv¹Vò— Ê«,p:ñÙgá•—Æžð¶§\é×MushË]Åm—/l 2²™Võ9_3pŒ­Ér*y6SC'gN>õºÉë'³o]¼’G«†Ï«P«?eJrkY^öÙ-$’]}[Ôý)ñL÷Þ'·ðîm²Ý¼Qop¾L¦îåQš7GÁ‰Ó1ÂÈØÚa$„%±Éüký¦|ðs_³ø}¹$3èÉÁKiðï"‰wca6ó&¾nÞ6⽇Á°-•οã~â;8—í%åÓc·ý¢áŽB„UÞ¤‘·çb1œ~KøŽ{ÏÚ/öŠº]2êQqã ]6]fFÌ)qp#¶YJï*¨áwmUÂä\|=ƒ–*\ƵӬýÞê o¾Ëä“ê}Gg¯^†‚Œ•y^ü®¤–¯F¶»¶º95m½´ÿŒx¯á¶§¬é×3¬Ê–63L’Dgµ¾Õ,`… oŽ87ãk¸A¸£ìÓñWÄ öUøKaoâ¤Ó|OâÙšW¡¼QB„`¡€eYr~ãfçiˆá<%àý#Æ>+Ô5V1i?¼4°«‹ù¼¿#N…6[[3ïÈÄûZVcµcf,Í€ß~Ö?ãçÆýwÄ‘Íçi17Øt¶Û·u¬lÄ?ÜFýã´’á†åóvç +è°PöÑ”Ój.é>¾§¯Äù»ÊpÔ2Ȩº­Æ¥hÙò¦”\a½í§3MÝÙ=±ô§ü6W„‡üÆfÿ¿3ÿ…ðÙ^ó›þüÏþð]·ö|?ž_‡ù#þ¸âÿçÅ?ºü™÷Œß¶?„ÞkT€ ñÓýÚÊÿ†¶ð×ýbÿÀi¿øÝ|GEÙÔÿž_zÿ#Hñ®2;aé}ÒÿäÏ·?á­¼5ÿAX¿ðoþ7Gü5·†¿è+þMÿÆëâ:)fÓþy}ëü‹ÿ]ñŸôKÿ—ÿ&}¹ÿ má¯ú Åÿ€Óñº?á­¼5ÿAX¿ðoþ7_ÑGöm?ç—Þ¿È?×|gýÒÿÀeÿÉŸnÃ[xkþ‚±à4ßün¼·ö‰øå¤|LðEž—a|—3E¨GrQa‘0¢99e«ŠùÖŠÒž榤ôó_äqcx·ŽÃÏ :Ò’µÒ•þW“ü‚Š(¯Høp¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(­ xÃ^ðMü—ÞÖõöHŒ/s¦]Ém#FH% !©*§2£Ò²( Š( QøŸûOüRøÉ§ øÊûU°ÿ––¨±ÛE7(ÃÍX•»LhW~í¤qŒšòê( dñ?í‰ñ—Æž —šßuKE–ØYËÉ$@U§ æ¶à 9.K‚C sãtQ@Q@Q@Q@Q@Q@Q@Q@ÿÙkit/sample/mgp-old2.jpg010064400237450000000000000507100676156116400145710ustar nishidawheelÿØÿàJFIFÿÛC     ÿÛC   ÿÀŸ…"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?üª¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÚÓ|â gKR°Ño¯ld»1ÏonÒ+Ü¿º\™¾tà}?¼3œêBš¼Ú^£I½ŒZ+KÄÔ|+¨½†«llï;¡fVeÃ9Á8åOÔ`ô œÚ´Ô’iÝ1QLŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  :n›u¬j6ÖPµÍåÌ‹ 0§Þwc€Ôšýsø5àÍ+öVý–lü/â }Œ¼C î§§ÿcÄnn!ºkeB-ØHS1oUóCÅd2ïÜß’¾Ö‡‡uË=HØÚêFÙüŵ¾ŒÉ °é½A€88Î9ÈȯPøÕñ§Uñžá=[¥ItM*ÞÂãì$ÇòÃâI_1üÆ'æ·ðªðÜMVâ)aðҫɇŒ¹¦’\ÎËÝI»«_umWÈÞ•ENîÚž}ñ ÃQÓKvú-N“àGìŠ|ii¥ê~-»kÖâdÒ4HÅw;È¡mg•Ù Å3nùÙT¡\üÐÊQа*ÀàƒÔWê?¹÷ã×5Kï.-;~«y{tü.Y˜œGS_›|Ciâßø“[°µûŽ£©\]ÛÛ`o#2©Œ€Fq^nS§RJÊöGÖqfG†áúÔ0tdå>KÍù·ÑtZ™ÏVô>ñÇ‚î|[•pÞ¶ºK)uÌኧ\žòHÏ£þÌ_eøáãLj-Ÿ„ôÒ&Ôî¢À’Aü6ñǘý7rw1 €­ú%ñÓÂZSþËž?Óíím´­.ÇA&ÖÚÖÆÑm’$UúEÇ‘Œä¶+ÍÇç´pxü>]óÕªö_f=[ù]¥åÐùì>YV¶¦2O–Ù÷}—ùŸ‘QE}9ãWð+ÁÞñçÄ}?Fñ¯‰?áÐîÃ_dÆ#]äŒn —a€ªÝÈ®|ExáhμÓj)·dÛÓ²Z²£)(®§Ez·ÇÿÙ·Åÿ³¿‰Nâ F›O™¤6Z´~ÏtŠÀn±Ã!+œàu¯)ëQ„Åáñô#‰ÂÍNÕ5³á*rq’³G²|pðî—á?†_lìôølµ+ýmfþG· wpÓÝʱ¼’wG²%Ž¡A$æ¾Ãý…fï‡ß´?ìµ%§‹tt¹¸²ñ%ËÇwnþUÂf(7 êÄ€ÊíÎÅùNÐÍó7ÇÏ \|Bø«ð›Ãšr´zÿƒ|?k,Gˆ­Ýí”á?*$l¤äöcžkõöUÓ~ü;ð]×ÃïêI}.€åõ{—âk«£òIq¹Ô 1í …U @¯Á8ß9Ä`øv‡Õe5^SöœÑ¿¹)jä¶MÉF7Üôaë;ì´ü’à¢~0—áU¶ƒàO øjmÂÚnö–2Gi$vŠÓNÈØÚΈ!@ù'73gæäþq×é—í{ûL_ßx2;oZÛÇà­sP¾‡G‡CP×—¶ð;ÃæÍ,„ªFé aå¨c¸aöä7Ê?c_|fÓ“Å>±uð\Ð\Î.w››ˆ^%àò©yY¶„UÈ;ÀÜJ¶>ç…jˇø~ŠÎ¹hµ}\®äåy6ÿ½-]®ßärU^Ò£äÔùæŠÒñ&ƒuámPÑÛÚÞx¥£t‘NYXR ‚ä «c§]j—+ogm5Üí÷b‚2ì~€s_¥ÆJQR‹ºg=ìW¢½OÃ_²çÅ_àØø+Rñß*ÚÏý5+^µáø'ÄÍp$—×Ú.‘ûÈóI,£þ©´ÿß^•­8îÎØ`qU57÷[ó>R¢¿@4/ø%n]N«ã©åsž˜#Áÿyä9ü«Ð4Ÿø%÷ÃËWGºÔüC{€7$×Q*“ÿˆ×ñ¬ž&šêuÇ)Å=Ò_5ú\ü¿­/ øsRñ~½c£hö­{©ÞÊ!··Bw=I}I¯Ñ¿þËŸ~_Ç¥\ü=ñ?‰u $k'»Ä›AÞ÷2˾3€å²@ÆN+°ý>xÁÿtMsÃvz¢šÆòÂûU”êÚ–ÿ)Õ„2©S°DäùRÊ0Üž=žçÐÉðqJ7”bÚZêí¥í{/?ÄZÔÔ%R>Š÷ü­øŸ–šç†õ/ ½¢jV­j×véuY[|N2­Á=GcÍf×ìÿƯÙáýö©â¿ؾ©ÁæƒB›T‡O·k£ó;Ã!hY^C’Á¦ØÇ’¹.üÐÆ“ãµV;-6]#Ɉ°L~òy"]¶Öt‡!ö†6AƘn!”c…¤Ö—““ŠIÛh«¹Jϯ*^} êeò¥+NKúêöKï?,h¯Õñ{û#Ü0Q?ÀIëöu}v_ž?´å†,~7x‘|>›qá‰)l[I+öuV‰ P€Cnz×ÞÓ¨æíËb18Háप)z]E©>v©m£'8µ¹æ‰EPE½áoøŸÇù>ðM’¾^™e%à XŒ"žv‚qè+:•!J.u$’]^ˆi6ìŒ+ÙôÿØ×ã>¡b÷­à+ý:Í-ÍÔ—´°ØG`€w´îÏÝl7^85ç"ð.­á”\EÕ¶ûÍ>Uº¶FÎ6yÑ“n‡åb>aÏ5LJÌpx¹¸a«Fmn£$íëfì\©Î ò‹G?EW fQEQEQEQE{gìñðwNø§a®É}ÌÖO ©IJ¸>z};úW§Þ~ÈFÂ+ÕãïGqÏê¤W; ø£âŸ‡+r¾Ö&ÒÖ啦XÕXHW;I LŸÌ×yaû^|N²#ÌÖ­¯v¸Ó­Ïê¨ë^]l=yMÊœì»\û̳8ÊpøHañxE9+Þ\ªîîûÝ?#¿—ö2I‘ÞßQ½‹iÚDW?\€+›Ô¿cÝzÔ±·Õ!•üô”ût&µt?Û»Æxßø{ÃúœDä“ ±Iøø÷ÍvzGíï¤M…Õü$GŒËa©d{üŒŸ_⬽ž6Jÿqè}o†1Þ¡Ëóšü›G‰·ì»ã¦Ô ´·´‚òI¤XÓÈÌN0×Õ1xrÃÀÖ¾ÒOÒ„²0a4ü ¥-»sƒ‚„(à W[àoÞñ—€¯üWáë JÆþ)ŧö•²b9ð¥B†Ú¹Áê¬ÊqÀÎ5ž‚‡Á÷:ÄÍ"•»ŽÚ mrU™Áô8 ƒõö¬1¯*MU?QàÜ›,ÃÉæØdí/r7wÕ½\tVí^›ëj·xcöfø³âíÚfŸO:TjçË Û+Œ–@èqþÐÏZüÒŠ'žTŽ4i$rQKÐ_¯ÞðÉ×~éºjÚ+C{u<÷L¥–a»fîAàˆ‘qÓä>¦¸Dýœ<a~Úæ­á›ºvÙãa„<ÀþíK& ÉÉÀä…8#–hbcÃGž:%vÿà8‡*©žf¸œD*¥%>E·å´w]Úì[ýŸ¾Åð£án‰áíÍ%÷•þ¤ì 2ÝÌŠòCÚ."êrQ˜ÿÛsÄøöJÖ`id†çX½¶²„ß’HäecÙv,Ÿ]Ø5Õè’Íu-åÄ¡¤28g—oŽO'Ôò:Âý«>/Æ…¾ÒEãX=½ËÞ £Ìï"mÆ{ñ“Ÿá_ÃòN¬ñüK‘,²ÿŽŠôþĺ¿‡$žh¼k¬XMq[ÊÚB›Rð¶ #6âJ¶ÕÈéÀÎkä«e´ðÕÞ/*«ì§'yF×§>íÇKKûÑi÷¹éÓÊ3 ±ä«KN´šûßày/Æ}Int‚^9°k¶xn-.ñ¦mé-õ­Ä塘ŽK䃃Õ6Ž•õGƒ¼oâO„?tO‹ÙZß§ˆ4Yôù45%Hf‰äE¶Uq¸$°òB°9V•FÒs[^ýˆ|)¥èVºUéÔ5]&)Úö+;ûÇ0 U^_(m]ÅQqÑE}aàø´¿†:n”°E&m|‘Eoøö•e0` rŒ¤¶6œõcÉÌêÒÂà¨eÕâªR­WÙ´ô¼fæâ“½Ô¢ùZjß KV‘áæ¸\F]^…IÉ(¿‹—[%Êô]ÙïfÝ“?:>2ü;øñÇ]д B™<1á{A§Ù^^*À³¿Ê%Ÿ»Û dar}£àÏï‹~k>¶—í6:ÔÑ+Má¿Ü]é®dF{ƒ0U–PTyd)ù,Þ5ï^:øÙð§àän¾ ñ^›mz€fÆÌýªë=‡—Hüp+Ï<-ûyhÞ"Þ«¡xY“ÃPòÍÖ­|°ÜÞÜ0>T1BŠås‚ÅŽFÕ= ã징ˈ03 ª'(µ}¤î¿­­¾—>ŽX<» g·7¦ëò_«;M7öUð‰l´ûßxrßUÔk#O¨Æd•Ø–bdwù݉v'~I<œžjöµão‚¿-žÓSñ'‡¼W’9.g_øeCÿ|W†þÒ³¶µû;xÞM&úa¨é3³?Tv¬èeÉÚã¸üEy-|)xÏŪˮx·\Ö 0¿Ô¦Ÿ?]Ìk˜¢¶QŠÙ«R›ù’Es,Z9^6#«Hô­ïü@×~øMÖ´;ù-nôûȯ¢MÄÄÒÆNÒÉѸ,>ŒGzçh©©N`éÍ]5fŸTú¦Óº>ôµý· øàø»Äïk¤xûBÓ^ÓG²°€˜›ÎØd Û˜ùˆ¤«³À ËWÇz‡ÅMkX¼žçQ·Ño¥¸Ë;Ë¢Y«ÌÄå‹:Ä$žH`}뮟áßÃ}s⇈ Ñô;q$¬Êg¹“"H‰¦™€%cQË6<àÃáðy>R£N”¢]_âi)N´ï'vÌ ™N¡|ï ²Bf|­½¸;T“÷TOÐd×Õ?àœþ(ÚK[0x+L WSG7S Ü‘¤¼XsÐqô÷ìí§ü#øMá­1þøkþo¢&ÂóÄVvRÇg €7šÿni,3÷pTaŒ\ø»ûa¿‚ï!ÒõïXxnñ¼Öž²ŽöñÖÂÈ× $q/*q±œŒ´üó›ñ.o'K#Âû^ÞÒ·»8Á¦íÙ´ï}‘èÂŽŠæ¯>gÙ™©ðßþ ð£Â0Ç'ˆ¦Ôügüfîo³[uo»xa@;¹\Œt®‡Ç¾ ·ðçˆm>|:ø{•¤Ám¡{©xj(`œ©}Ÿgy !C ŒnvÞ]t ºw²‹î|kû>øs[Ô5GSºœLf½Õ¦M.ÙXo8ûª@)è冷üQñóÃZ£6™¦%Ï‹u˜%hgÓ´&…ÞPw‰Y#‰ í;ƒ8#¡ À£™ñ\îtksbêR“J/™Ã™;srÅ¥eÛEß±ô˨)/q5¿_¼ù?ÄßðN;ߊº¥•Åêøsញh­¶ Z}¦ñã;Hk©~Ey8#¸\œ;Wwàÿø%ïÁÿ_µÆ§&¹âhþ¡x#@Ýäª ŒŽ@çEoø«ö¥¹‚ëì·Þ"ð—ÃÈÕ‚Ì·×é}}WT2Ç*IÜÛóÈPA_-üNý¹´ +¹SJÔéÐ?dσž”˧ü8Ðo=n³Ú Ýzmi7}ÕÀ=H¯@½{xfYl4yÏO·-7F´ !EácŠ%Àú_1þÈ¿ô+o…wüK©êVºˆîÙ`±¾ÔîõYÖaig’I†èä;¶å@px˜úãüx¼¾—~à=röÁ^æòH,ÚC…8Š7}ÍŒKì ¥Á$~=ŠáÜû«†¦ªb•)8¹;ò·ÒrvòZßÈöaˆ¡Nš›´oÐóŸ_üUø©§™n>êvö»£–Ë×·Ö–ÖÛ·+G5ä¢Vy6»ÊP6‘Ê3l)ä?ÿc/õ¶“Å>2Ð|/ Êû%Ò4Û««ˆ@D;%•U‘™ŽÓ¸¦ƒÎ}“Ŷü#¶“%âxGA»]»ä¾ñ º¡×r—†(ÄŽáyòƱ(Ê“âþ/ÿ‚ˆéPÌ›*~Íð†I§ek6l—BF?ÛzÆ›l]¸òÙnX?Sœã^¹¯ ¢ŠúÊptâ¢äß›ßô8Û»¸QE¨‚Š( Š( ·üàËïˆ-Ót>9k¹@w7y1d•¹j(f$0§‘X*¬ìAf<I¯°>|? |+ÝDðø»ÄVÞV¡¿6–~lrÇÑÀ.ÑÇ#gæp ݵ*R«+D÷ò<¢¶wކ–Ïâ}£Õÿ—w¡êžðj_Íáïxr}#IFµ¼ÍÅ£2¼’Ü;àX»1ltÚ `*RøÛ}£ÚxSBðæ…3-ž¨][M ÆQZ_&Ù÷?3ì•<ñ63Ô`kÖß³¯ÀÍkÇšŸ’úæ©l#ÒmVQ…² ÈÉ$1ùD}Ëmqá9oOÂNâkJçN—S¸{™VI7\ÝM0$¯r²È9$ @8 ŠóqðQ„Ò?wÁcéb¸“ ”à4Ãá#-¶rååmú7k÷¿tÊ?·_‰õ |)ø7§XÜϤÉ$Þl€ícІ)ÈÏœ\®å¨àcwà^£âË/‚šT>)×/µk­bäjñ%õÛܤóòùõI,0t¾)Ù|¿à½>óäxkíóœnoˆv¥FS—•Û~·²»ï{3ØbÓÆ“ðÃIWYn¯âXÈñ8Ž ¨A]ä×ûAþж¿³ÿ¼¨ÞèÛðj5±„LadÚîÛØU‡nH<ñœ6$Ô>/x÷â‡ìn­§°ðóéÎ"Ž<4S“p²Œô!t§îí;B®y‡íó¦É­þ˾Ô Iž=?[ýéŒnEFVŸ?wæ•FFp\ |ìGƒ€ÁSÀñÕ’ÓØ¥×u˯ÎÌò³ ulVJ³»KÚ·ÓKßO¹ØÐøWûeøCâïŠ-;ÿÁ@~#xRþò-'Àšm†˜“›{?Êe»¶¹]ϱãm±€X#†9U 韱çíÿµÁßx7Åw¨<^e‘–m« r Fb ´¤2ŽIÁ<ó^Ú†%üQ§øÏE¶D{ø!WT’g|ûy1¹yÚYw¢£RáAæ|MðÀü—EøÃà`×~¾ÏXÒÒ_:m1ب’"ç’7ùl»ˆoš Ù “ô¹¿`q9m,>~Δe EkNq|ÉÛ¯šººog©æTÍ19¬%‡ÅEª‘ZÅìâÓŒ­né»yÛW©ãÞƒÁŸþ!xÃCø¯á ÿ}–)lí­¬ï^ÖHnw€²—ãåØK ÈyÛ•ê+éj³¥ÇÃIH°ñ冑u«\´–¢[Y%¶Q<œ–ê6Ѹœ«†Ï \7LJðülð¥‡|/‹›ØíK2 n»„ƒæÀxÈc‰Èç +ý“í-umNûÃÑ_OÖMÖ“iyž§ð,žD𠔉Çï¤C[¥Áså«»Ù£„Âåy¥<Lj«-Ý:Ž*Ü­]]ò¯•÷gµ•ã*ºpŒÔ]EkÛ]{­³ôºÕZ韡¡ð{à—Â3ãïè÷rØÃh.›S#—P”gn7ÊÀFÛÆBƒ px¯…>*~Ù×WŸ¤ñ… ´×ô+i’ëN‡ÄÚ>êp]xž{_&Ùí­,íÖ8á,~lXçï1¯3¯oÑÿdÍá¸uϽ‡€¬ç¸ò!‹ÄÂâ™pÁ^ApÉ E=Y”tÀÉÀ¬ÍKökÖìí–K?h¼Ìp-í%¸óócæšÐ}ÑÉoãèØP¡V¥5Znf–ŸyáTÅáèË’¥EæÒ<ŽŠì|Wð{Æ^ ²’ÿUÐ.“K`}R×mÕ’3€U ÄE£†\¡mÀœÇV-[s¢2S\ÑwA^“ðÃá_‡¾'FlÄMÂþIH ï‹Âš•ÍÅ––Ͼž`²Ä$–'ÚѺ±+.ÖÀps†&¹Š?¶Š|g¥Â=áËkOøV?•,t˜„Nà0e,ã•ÃØ\rìInû›Â?¾ücÐáñW‘Äoˆ–þ,t›É…©ÔIWNñ1OÛäóÁTfbç A ~Ô³ö…ð3þÕÒ5»ÍJâðM õµô;ÞxÄ{€ùW;Xòùnΰ9lF…F¬ç’nRnîÚI«ý©%{¯C«B¥8ÆR—2{ÎÎIf$“’Iêi(¯G_€>+“áÍ·Œ¢ŽÒ[;ˆžå4õŸý;ìèÌ$€J ŒÇi$(Þ@_š¾î1rÒ*ç,)N­ýœ[²»²¾‹¯¡wàïíâ‚Ú^µi£[ÙO5ü`[Þ]D$›O˜„žàß0#ß8º÷Çoˆ~&Ò—MÕ„ÝÞYȶÓ6õÇœ[$€ªÙ\’Tä§‹ÿ¶7Ä­;à¿Ã O„^¼gÖï„wZ½ì Fò˸`Xµ]Õ’HÆ>ž­5—`âŸñ'¯¢þ¿õúX…ÂY%ééŠÄ/œcÿäÏÈðoÛ'ö_Ž¿Øé’/ü#H6úz$^^ì½úœŒŒ/@Tœ“ôJZ'Ã> ÓLBØÚxwO ß¼Æí Èÿ>NàÎìëÏ ê8Æ+óî(šyR4»°Uã“îkô_ư -’ÃöU²´´³‡­ ŽÞ8þÎ{æ-¾YÎOÉÉ5ñ¸•zv4ð—>oZ£éMþ2õ¹é?¼I¦GgáÍ?Kk[‹á¡[Û_ÜBìâ5"'0 ?(Bñ$‡$ˆÁÇ–µˆ¼[ìÍð'Qñ…ý€—_¼Äp@ç$«ãÉSР'qlg+´óœ ƒžoø²Õî­Ëè¶Ž%½‘‡É´Bg#– øÎpØÁù¯þ ñ†/ˆ?"Ðlnd–×AW†äoÊ5Éo˜‚©Àz0bz/•…ÃºØ‡Š«ötGbèä¸Hä8¬ÛGÕÝß[wóè‘Ñþþ#:Ô?Úéã{ûÉìuH×kcÌYöŒ(Œ4ʹ©‘®øú{ÆÞ¹øÏðĵ†;‹øo­ní•£ á|À\ '°„ß._‡5ñ‡ì#s4~+ñÌ?0´}Èì"û²-Ì>YrÆRà|Ákô/ö~¾3x–kl’.-Œ‚=¹_26 '€@Þ$uÆFA+™?ªñ.²ÚJß2ÿ#ÅË(ýs„±·Á&þîY~W; ˆ_W! ,Q°‘gaX× £9Âð0 ô'üöÿ‚üb¸ñì<#izâÚÊ;PŠ1’±€þîÞ‡¹¾òð-Á:®¡2[M…c€07sôÆ{óé÷‡äŸíK¯]ø‡ã÷g¼u’Xu -U•U~HÎÄ Ü…rr1‚À” ðu±M{ó©+¾½¿Ÿ7ÅQ•\(/†1VüOMÿ‚oøñ|ûOèö“0K]~ÒãH‘²˨tçŒñ¦FGâ@úñÏáèñ§ÃhMS-ͬ±F²’¨C®ß™—Æ>@$vkðŸÃºõï…¼A¦ë:tïk¨i÷1ÝÛÏ2´r#VH ‚ ƒï_Ðw„5ÛoøHÖ!‘fVÓ!¸Þ¬a,A¾ò§–ê§q^WÊy>}–gpøe/c?IlþW—ÎÇËQ´„¡ÛSæ…Ú °øWðü©_6×L¶Iýܱü³FÙ2J$FR2®¬¬WÍŸðT» Yuÿ ÜýœÉ¢£ÜÀ³¬|C *7.0]‡ }ðòÕaÔ<_á‰óìõªA\(·¹ùQçG9=7Hòœd¶|³öÿð þ6ýŸ.5hw½Ö“:\Ͱ.Pmf99Ë+ORÛ¸"½L“õ>!Çe•ß½6§4îÚ^—üåÓ§É9I}£óáïu/†þ(¶Ö´Í’:Ö³äÃs}è¤P~exª8_KÔüÈìüؼͷE”ô ²äŒ0ŠøÃS2ýŒþ/^h× ÜéìÛÄ“äß[*²„Wù_ ÀdåNAÈ<ªx˜Î—¼:ym²Ì(¬nJ‹âŸUóüVú¤Öç?hù´«”ðOÆm?ØÚܘZ¾¾µ§Àg)x”’B6à7d ýeáO åÑtÏ øÚ[­gD¶a6“¬k6Pê–‘ù\*­ÌY7  þLm(ãŒñÿÃÿ~Ôþ‡Å^¸6úíº0T”«Jv†?g•±'O#±óWÃÿ‰Wÿ 5+ŸøM¸Õü6&“íž¹áòn6ÆGú¹Pàç£m À­zye\%(ýC)¬3òîJðÍMJšowh§+ok§èàsW˜E¥¥XnšùzÛKo£Ó³>ÓøËgñ;ÃKwã_|C¿ñ?ƒ®nKíU‘…¨F%Xp‘Âñè2*ç‡âÑtÏÏñÇ~!³×th%‰¥Ótm;»´$…ÛysÉav >ô€AbÙÁòφ_|IðËK“Ä|Hž#ðcɶûK½1Fϲòȹò]‚…#ÀI[ ±øã×Á?T—ZµÒ5/ßÞFÃVÒmá7]ò0ÃD‘«ü¤`²>Ä \‚WêÙžW‰­•§†ÃSÅE¿s‡¥}4Q«Kã„—üü¥Ìï«…=ÅtjÔýãk¼dݾOfŸg÷³Í¾øçÂ~2_j¾ñF¹áí7MµÎŽëL’?6)‰ÐÍ/ÕAÞpy<íåZ£Æ¦fÚKG’¬–ï_QÿÁJ¿f Jðå¯Äï ÚiÚ#Z7Ù5[;XR»ß"ùs*¨¤ #<’6çyîbH–ïà‡ÃE-¤I ÔLá®çL:ÿ{ TƒŒ€êù?ë *¹f5ÂÇÜ«(Ý=Ò“³Ùî¾hú,]F&¦«³ŒdÕ»¥uò>ý™üOãÿ‡ÿtOxGºÖ5D‘íEšDí â²üð9 ‚ra]¿í&ÞÔ|?૟±jZìÏ}eymq0gÓ^ÞâUû4¶¼u2&HÚ UI$³üqocðöûRðï‚ì£ð¾„²KÍ®–Z%¹‘Éó|̘.>⌅'>-ñ¯ÀR|_øE­C%Ñ:¯ƒìäÖ´Ö”nÍ´cý*ÙNA”¤ƒ®>Ï€9£ ™`1Y¤¥NŸ¿n^nönßsnÏÏÌúºü¡’ÿiJ¢Ñs8Y蟟t¬Ú·ÏM~ ¯¼ü0ñß[ü%žG”Ú¾¤Gç±T mÞv”uùHåNÜ µ ÿ ¾Ãá} @Ô<es6V×7ZŽ™u$77wOmù–vÂ&;˜D—ónU$ôÞñ‡¼㯠^Ie¨AῬ1ÛÚC*Ïp#‰rœìe¾öp0Ä£eu¹k9C³>›…8k4Ë',µ;ÓÕšm¹Y¥mÓùXùköÒðއàÚOÆZ_‡à6¶+p³½¾àR)dPî¨EËp¤ gåÚOˆ×Öÿ´ÏÂõøÃãoøëþ)‡VÔM¥½¥ÛÃUWñÉ 3áŸQwJù"¸ªÑ©AòÕ‹OÌüs‚Äàj{,U7 vjÁEV'QEQEQEQEQEV¯…|Q©x/Äz~»¤\}—R°”MÛCmaìx5•E¶¨ûÂÿ·þ•á]â /á^›¢ërZ<_Ú¶7­!2•vÙQœ&ठ“{’~Kñ'ˆ¯ü[¯jΩ?ÚuùÞæâ]¡wÈÌYŽd’x¬Ú+IÔYsT“oÏSjÕªâ'í+IÊ]Û»üMßx®_øçþ%‚q>¨Ûê) 6Ñ#E*Èœ·;×ßß u†ÿ-ÿá#ºøƒ§iV¯)’ãE»•aÔbnxÈs·Ð,‹½HÉá” ü䢱”T·=¼§>Ì2?kõòûD“Ñ=¯k_g«>Ðý£n¦ÒåðG¤VƒheÕbZaÈo+<á»»|Ä:q_;´ŽY˜³’IÉ4”SJÊÈðªTiº•$Üž­½[~gÕ_°´VkÄ›¤ë0évè °ÇÙáVfdzýœw8<¾Ûýž/b_CåÂ}ž`Í…TÆÀ²ã©œBG"¿0þ |nÔ> j·Í ¤ZŽ‘ª"E¨ZåÊè¤c”Q†ãØ©þ%l }“áÏÛàï´g¿Òìe"éi÷0ÜFå‘•DN Gf<ä`ã’>=øÿ4ŸIÒítŠ–WZºÁˆàñ‚¡œ UUYáãyá‰6ãžU52¬û1Â`8Š„ZÆÒ§ .^d›é¥›[§k§¥­gâÖTáRTÓºèϘ¾1~Í~3øcñQÐbðö¯ªYyì,/í´» Ü|c%Hm»€;Y€?Äz×¹þ̲ƯàÝj?øçLRÚú~™pArø&%IÎÖ#8<â¾Ò·ý¤¾øƒI‹Pµø£áË+{•%b½¼0N¼CDWz÷àŽGÖ¸¯~Ôß<'k5ÝÏ‹í¼UwܶzjHѱð¡(:òs_o‡ÍóüÅ}_êÆOyJZ/5§å™ãWö²‹…-ßS—ñw„¯ôèìµYTF·û®mäŽU$r ÀäÁ†ãÞ©~Þ>²øû>éÞ/DX/´Ø`¼Ìª~Vý܈ÎW.sÎ>bsœôÏxþãâ?‚¼-{s£Ýx{6Ï1ÒnU¡ŽF&cC… ›[æù€q‘ëç_·7ŠÃ¿Ù›KðÚÞ=¾£ªC ‘E,>lªC|Û@*¤Ü~l·³”MÃW ¥Ì –¾}Ÿ9•a~©Ž­NÆÊþ¿ÕÏ’bÏÜéçðû;½Ž§°‹'jʸ;°ó´’@Ç~•OöÌð­¦ñF+ÛHãˆjv¢yR0‹ûÀHf!y烓ÔçÒ±?dû­:Ïã>™.£y˜J i›j¼„`.ì€ ã äðH#wöÎñl!øo§ÛL³E¥Zˆ\£F%˜}â28€xç }MŸ´¿K<£*|YJ6R§y~+óQùžEàOêß¼E±¤J‚eSÖó§™Ô-÷á™:ðãi¿ãk];IÔ&·hÜŠÞd¡X Õ³"³Hý üUðóâÖ³á½FY5]KHðæ—•cáùÛ›‡UE3K>æ!0«€2ï°n(y=Á[x˜ˆ^,·Óô†…£ŠÇf")å!PÙ2€Ì»Ë;Ÿ”’Í‘õx¼>wŽªó®$—³ÃÐmÅ4¢å%ð¥Õé«ÞÖ<¼K^Íáio-=4þ5ø#Pÿ†Zð‚./ MWÅ>%¶’Þ$@vC*îùØí ´ìç*Æp2½‡Âíø÷ÆbÓI€iZ%šF£ÊÜRÒÎ0± 'Š n nÀàüM¿øéñoUø±y§¶£YYË¡èZ|¸xó$-¼àòÒg“åÆ×’ÞçãïÄŸøgßÙêÃÃÚEëÛxÛÆéì³ÛI¶KK!ܧ •`CûÉ:ø6i‡Y„]ZÊÑœ›·õ÷.' õŒU ¹MsKô_×F}9 x§Á·ÜÖñ‡‰.ì”Mqom:I5²ªŠYñžß(ï_3~ÑžÓôßø(¿ÂKÍ*ØÁs¬ßiÚB‡kÉö² ŠÉþÄ`Œ ›ŽA¯=ÿ‚oirÂkã]XF‘œ L£ù—ÊW=›ýíº¾šÖtdø‘ÿðE¨1ÜÚøÃIy¨¬Q°hîv:Å2÷Ì–ò'nçùœiaòÑpæH∫ «Ûslù³ÐŽr=àOà |!ðÁ>¹V‚{-*¯ÀŒ+Á,ƒÏ‚Èò¼yþ"¹=M|\hÕÃp^]‚K÷µ\9W[ɹ¯Íz\ý#©í9â*;F1möµ’(xËÇzìñðÿPøâ*ïV4« @VÈc„b0€lœ¤íÿÃÛÛüE‹PµÑ#M;XОíôÐá‘|ý;ÌxѰVg(¤ààWÇ?¶ßÆgøëñ²ßÚ,Ú‰/ö]‚À ¬Ó î1’FB ÀèƒÍ}s£ÞÅá+Oø‰žK+ xvám^Ȗ0ÆŠ8*¨­±}#^8Å~‘<ºž ys]¾í+ÉüÙôY^i_0Žk­'Éì\Rè®ím»ýï¹óïìíñÀŸ|!‡|}â%ðˆôˆà´°Ö§ŒÉõ¤h°Å ÇÑUàpUyäרÚü½ñ/|A Xêºz&“<šã¼vìˆá2H ´œç¦Oð÷ì÷ሿ­]iði³-ô·–w‘Ü+˜Îà˜ ÉQóžsɯÍO‰òhÒüFñ3øvíô&Ôn ”QHdE‡ÌmXòWÁ=±Y!Õ4¨dŠËR¼³ŠE(éîŠÊF AþuB»1xÚ¸ÇVÚ+h~kœgX¬î¬kb­t¬¬¬»ù…Q\‚QEQEQEQEQEQEQEQEQEQEQE%½¼·sÇ<ÓHÁR8Ô³1=©¨ëôþ åÿ GO±‚M/QWø•q _l!Ž8å‚L‘娱Hb…‹° ¸/Aäæ˜éeØIâaJUZÚ1WoþvoB’­5%6~xêÕ´˜Œ·Ú]í”yÚ^âÝãôÉ_ÐûYÙjЛmA-/-Ë`¹Ù"ñ“§Žçõ®*ãà?Á}2PÑ|:ð$WIó):%–ålpyLƒœûWæ˜?êW“§W*Ä)tP‡?Þß-¾æu×ÁªNѨ™ø[ákÞ7Ô¿³ü=£_ëw¸Ü`°·yW n!AÀÉ'ŽkîOÙ×ö‡ÁÏoâ_‰0A¨jÜ=Ÿ‡ÕƒÁnq÷¤éùA±oº>·ñ¿í)ðÁ3‹ SÇú-¤ŠÍ¾ÒÑšy# í ¬`€AÈÁ#¡ô¯›þ1ÁF¼ákŸ²ü>Ñÿá,½3j÷¥íáN?HÉ ãøF9Ã+Ö–?ˆ³¥ì°ØoªÁï9¿{Ò1Z§çø¦y5c'îÁüÏkñˆü=ð‡Ã2xçÆw]…¬mìDEÞiqòeqòî€G¹\f¿/hOŽ:§Ç¿ˆ7ýúˆlâ >ت††ßq*¬Ã–nI$ž¤ãŠÊø±ñ£Åßõó«x¯V–þEf0[)+oläˆÓ8\àdòNIÅqö™f[K, ©SÕõovû™Ñ¡ ´zî:)^ RHÝ£‘ee8 Ž„&™î%y%v’G%™Øä’z’iµÖü9øqñT–(d[ .Ô¾ÕgBaµR \㫱Rª£–>€=ºtçVjœÛÑ$tÆrJ*í›?üмA&­¬)O èÁnoX…ÿH|²áÙÛ®r#Y[øk꨾Ûx£Áw|qã-?À–:•á‹OþÑÞ;„\©a‹á2"`ñP0øÀ^½ÑŽ»­oð¿Â )‰¦˜¤]–rÞXtLK;»®æêªQG ׃|iñ§ŽjO WIðŽªúª MGÒô÷š;;p¦4ù‰Û“×Ðp~’±Òàì?°ÂÉ}nvsvMB=!­Óowÿ Ï^µ?©ÇØÅÞo{tò=ÃNø‰û0ü7³#R¸Ö~)ê¨å„¶¶sY[táDm$d€GRç>˜â¼{â§íãÚ§Ä>ðn›ciáÝKŸ§h–.c·RϵZf=B‚2H  ÇSXzìwñ›Ä$}ŸÀ¥¶yÿ‰——eÿ£™?Î}+Õ>ü×>kÿð‹^Clßuˈ¬–;k••lm$B7uʆ”º=R8úâVóß^Ìø«©bñi^NïÝ‚êùV‹åmlž“¯8=vÓwØõ…>Ðtí'ûoSŠOøVžÓ¦–@±½ëÆb˜$ny&“‘ÁÚʼµñ§ÇO‹ú—Ç?‰Z§‹u(–Ý®HŽ dB¼"du u=É5úKñ‹öj´ñŸ€ôo‡ºWŒ_Ã~Ó¤’ãPHì–iuK‚T¬²1eÛ·i霂€ýů6ðÇì'ðãÃ'ÒíÓQÕ \e”ã˜ü¢2¯DÕ<5áßh×> ÕãÖê%ÔÓÌ1¼ãÌBÌåK³àžAùA®‹XÖ¬<á{=:Þ„ÉVÖ¶VãTKòª€(ÀõøîwIã$²tÿy‰’f¾Í(Úñºï¤w~ŒõpXüðR^üõ·nß+kè®|<ÖÍûmþÛ7úËE¥ðÛÁN«1’bðLŠ[ËU¼Ùœt)sÐfý´¾8Ãð?áå´Wñ_Œ`¸°²1»+[C´,³—*˽`çsFG«è?øÃ_ 47ŠÃGÒ¼?lʳê aVË!T?#2Œ¹` ý”¾w^=¿íñâÇðdžüð¦h^Ê×ûoT0k‰ ª n¿'ïò:|˃œ×ÑÞðæ¨|EžûM°³Óü á†{˜âµ„C›2cm›FL²ì§œnÎ3Ï|Dø]ðÓâ׉®õïè-y«\¶én’þdfÇ À| N>µôŸZ„}ùuØÛ2Éñ4rºâ‹ö•¿Å%hÇÕGUÜüÆ¢¾ý¿ýþê°õí=ÏCâ8èÈsÿ×®KYý…|*04ÿjp1Ïü|ÙÇ&=:2Õ¬eÔøIpÞee ü×ëcâú+êK¿ØKS䨸ÇO˜sƒsk$_Líßþ}kœ¾ý‰|{l[ì÷º%ðÁŠé×?÷Ú õ«E‰¤ö‘Å<—0§ñQŸä|ýE{ïìñBÓ%4(.ÔfßQ·?Ž ƒúV=Çì×ñ6Ø€ÞÔXúDñõÚN+EV›ÚKï8å€ÅÃâ¥%ÿn¿ò<ÒŠîåø ñÏ‚5æ÷ŽÂGè@9¬_ü9ñ_„lÖï\ðÖ¯£Z4‚žþÆXcg ¡™@' ÇÇÒ©N/DÌ%B¬å¾Lç¨¢Š³¢Š(¢Š(¢Š(¢Š(¢Š(¯dý‘¾è¿¾:èZ7ˆà[¯ªÍq{Êc¢Æv®àÊF\ àƒ^7FN1ž*d›M&iNQ„Ô¤®—Nçë•ßì9û=^ÂD^–Ë#>d:½Ù=?Ú•‡éÚ°/ÿàœŸ/É]xŠÀ“ÇÙïÔãØo‰«òÆÞî{VÝÒBÞ±±SúVͧüQa·ìÞ#Õ­öôò¯¥\}0ÕËìj-¦{_^ÁËâÃÛѯò?Fo?à™ß•BÁâÆä}ù.­YGÔ}œ}kïþ ƒà‰ýâ³ ÿ¦Ö1Éú WÃühøƒ6xçĉޛuiÆ9Ï÷ýjõ·íñ.Ó_Žõüpú„ëêO©£Ù×_h¯¬å¯z/ïÿ‚}‹?üÇI‘Ùþ*KíæhAÿ•À¨‡ü¶Ì‹X#¿ü#ÝþWÊ~Ôm¹Oj¹õyÿ0jì_µ·Å¸ºxÖøñ™"oæ´râ?™_!ªÙWZrþ¿íãê_øu¾Ïõ›`°ÿÛªüÙ\3âómè?â@Oø_0ÛâúŒ\þ6Ðç6oÚûâõÄlãK’­ÁÚÜ(èåÄ2þ¾Cö¹Oüû—õÿoJŸø%ÖŸÿEk?÷/÷UZ¶ÿ‚aøz"E×Äë©°zC¤"g§¬íëú×Êr~Ô¿%wŒ¯N}1ß=–©KûGüL˜Þ2Ôðzí”/òRäÄ2þ¾E{l¡mN_×ý¼}§eÿØøinñ¯ˆnqŒý˜[ÇßžªÕ­mÿ÷ø%`ûæÕüQx3þ®ãQôúwï_\ünøv[Ìñž¸3×eü‰üˆ«^ñεâŸé‰¾!ë6‡qr‘ÞêWw3‹xIùØ"î,ÛrÆ ÆH öUŸÛÅå‘Úƒ×Ìý ºý”?fÿè—:ž¯áé.,­ÇÍ=Ö­tYÎxTT‘79ÈÂã¦IÀס|5ðÿŒ“ûM¬m>|"²•–Ö8ØÅq¨±3mey7 ¥Êg$„jƒ´Šæ¼Wãÿ„cŠûSñ]¯­,d'Hð†&’X: -sq"®KA#à3àœm&üeøãâ_Þ!]CZš;[eØhö+åYØÄ3µ"Œp03ÔýìpØŠ9-.l,ùñ_Ù…úE=ßw·c®¾?…Kê\ïvºy'm_¬º¦W´ÏÃ/ XÁ¦Øê¾Ó´ë>-좼…D>„(lç©ÏRO$“šæ5oÛ¯Àdîñ´‡¯î¢–lç=v¡ùeE||ðî¬ÜêͶ÷f1Ï(¨Ò£ëwú£õÃß¶Fâ=+ľŒf¼‹FŠ=¦[b‘Íu)a9nI%d®RpsŠñÿƒ~8>ø‰‰µ4—R‘Äÿh”?ï‹M#ÈänùØäƒ×¡é\O쵦h~êž¹Õì|/}¤ß>¨5-fæ(-n^UHÖXîD[‰QŸ›æßòô‰ œ$ý«ñCöõðÃoÙóÃÚçW›DŠÊÆÆ9fÒ”DZvÆÒËÆTÌÀî_‰È±Ô°ó§šöø‰~ò«û³øúmѶÛ=کƳ¯VmË®»ù_·é¡ƒÿý«%Ðæ´ømàÝZkmN)…Þ·yg ¸ÞÛp9'ì8Æ“¸ã?±âxËÆ^(—Æγ©·‡ô& hLߺºÔUâd„‚rUQŒŽ[‡òv­ªÞkڭ楨\Iwy3Ü\\JròÈìY˜ŸRI?~¨ø[Ä >üðv³¨k6hQiÜiÚhEZÁ… ³´ “½Ø‡ÚNFåÜT.ÓëUË¿³2êYnWO´þU«s{k»ó“¹íe8ÕS­‹ªãN>óŠmsµd£o=þêgû]üO“öøO§M=|W¸I<[CØÙ¤‘—\ç ¾Õ9Üàà ¯:øgâõðìZ®·¨j"ׂťiŒ ˆmæQ‰¶––`ûcmL ‘ x¦±ñþÕ_µƒ}âù ¾‹¨êXEhdb²3¶þ` ÛØy‡£HXð8û#â§‹¬d¯Çâ-jÎËQñÌò%†¤C[û4UgV5äœÛ“³ÒïËðô=ÖÛö´ñ$Gç³µcýå,?BMhÅû\^ÎÀÝéra@ÃsÎ>…yüëçš+€Ã¿³ø³¶Ÿç4ÝÕ¾1œO¦-k{tåì¯ÓÝ]ÿ1[–¿µ¾“´’þõ ÿÙZ¾K¢²yu—_3¾ (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ëEQEQEQEªÅ2’¬AEIsy=ãžy'`0 ŽXøÔTPEPEPEPEPEPEPEPÿÙkit/sample/mgp-old3.jpg010064400237450000000000000467220676156116600146040ustar nishidawheelÿØÿàJFIFÿÛC     ÿÛC   ÿÀŸ…"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?üª¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢”#0$) u t¤ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¾ºÿ‚þÊCã_Œ§ñOŠtéOôTgÌз—}q‚5=!˜ ô ~õ|çð·Á¯ãOØÚ´q=šM¸ûDâe.!r7Näô­ÿh/Û.Ç@”ü9ðv• ~ ÒlN–Úe£˜-gp̯#–u`‚1=~l³0ÄṟqYVWîNª|Õ:SŽÎËw)mº»èmO–>ü¾ãç?Ž¿t_Äz†‘á"-ÃÐÎù ‡žé‰ži:³ëÐ+É©óKçLï´&ã«Ð{S+êðØxahÆŒ6жº·æßVú™Éó;…Q]$…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@:(žyR8Ѥ‘Ø*¢Œ–' ›_Q~Ì £ðõ½¯5hÖMNAæh–ì70qö¢?¼0Bz›¨a^´0ôÝIì[+Ë1¾.<2¼¥÷%Õ¿$xŒ¾ëž²Ð.5»Qgý·eý¡k82y%ÙUAÊçn@8È ÷®f¾«ý¹´˜lþkפ©Ù^oÏß,·î>Ä:ãŽÆ¾T¢…OmJ5-k«˜æ8UÆU©srIÆýììW­x»öqñ¾ iž=Öc{1¨^ÇV,¿2ÀñIXöÜFö¯%«…HUMÁÞͯšÝ|Ž)BPv’°QE¡O‚ n§Žcy¦‘‚$q©ff':’{S+Öf[h#ø…­ÜG!ÃÚ£¬,Èû<Ñ[°‚B9ÄÍ8êTö®ø9ã?Šw^G…ô ­Q³ƒ"íŽ0}ÝÈ_Ö†ÒÕ—J£å‚»ò8Ú+î†ðLM[VޝølœµŽŸ˜Ø÷”¶ঽžO‚Ÿ³GìámŸK¡KÌaÖ&KÛ¦#ÒÎ?Ìñ½£©êÃ+­nj­Ay¿ëñ?2ôø‡Å.©£hZ–ªÌ@c´’^Oû ×§i±ÏÅÍFѯ&ð£i6(7IuªÞAj‘VÞàʾ¥ñïü3áï‡tI´¯†ÞÔíîWåKÑookŽyE>g¯OÀ×Ï:í™âO¶$ö6÷WlÉæëúµÕäÉÎå ñ¢zEQýÚÎu17¥7o¿þú:x:Z9¹?+/ó=£öBý´ŸˆkÚÇoÚæÞÆáìmaÓdW·™¶ Ê%Á ´’0sšÙñwüRK‚÷wþ °ðn`¾JÜÚÚ5ä—J:7¥HrNdcý9‚_ðSOx2óVoÚ]xºÞè£[ˆæXÚÛ #8ó®¯â‡í…¡ø¯áÖ«ã+V;ß^K6¾ºˆHšhÄcfë€rÀ•,zt¯Ê!…ãZÙÎ"õ£J„’³Òi%Ò ¤ï½Ü£òØÖSÀª)¨ÝöÛïÿ‡2la…“éüs¨Xʃý#RÔu+hÜó÷m¶³.Ú—#máû.þË:"¨|Cµ™|Í6»äg8ØZø³Ä?üYâ™Ìš­ìŽI;o­"¹>žj±C\ìvšŸŒuMÑÚâ䀢ßK´$žq÷Pä~uú†<=«Tmõmßñ²KÑ$¼ŽjxšpzRO×ü¿à³ìÏ‹Ÿ¿fm á¾»}á/i:—ˆ­íØÚ[|»<˜ã »æúÿÖøn¾ªøMÿáø­ñ¯5{H|§È¢D}`‘3.NG”¹tjÿm­ÿ´,%Š+Ý:;9Ô¤¯,¹²vmDÇ$’N x¯€~ ø¿âN¶4½F¹’Qþ²ibuŠ/÷Ûõ¯À½Ç/ðNð¶½¢^Eá{VÞòÚ{d1Œ4žhF3[=ÎxÍ}Åàß éÚVˆºˆ €À.$`œà.âzƒ=¿ û|²®gOë 0j_¼|–V÷,­×ïÚÎç©…ËáZ½¼RIönþ¿™òÇÀÿø'‡ü:mïü^ã_ÔQƒ´ÿE\c¥rÜç“ùW¡üSý©~þÍV§J°úö¹*º>ŒÈŽ’8ÈNƒŽ¾ÕàµçíâÝUï|1à› CþPVm\ÂñOt¼.REm¢2N2:äsÉðÄóÉs3Ë4,®w3¹É'Ôš÷áBU=ê¬Þ¶eO Róþ·>‰ø»ûxüRø¤×6¶ú·ü"ú¼gijªØç¬Û|Ã×=«çi¦’âV’YYåÎIúšeÛ¨è‘óµ*Ϋæ¨îŠ(ª2 è4o‡¾%ñªÜé:î«;KØÂgØr ³;rX»Ï—¤ÜÙÚ^¤·ömn½`YŒ[¾¬?•{ßÁ¿? þëñë|<ñ)¿Þ ½·‹ÞDãp8ˆã!YÎs‚kÈÌq8¬5',%R]—.¾ZÊ6õÔÚœc'ïÊËúò<ëO¸Óo¥µ¾·šÚhdðÈ…^3žA¡ú×Û_³—t¿„VÚ&ðºÓMñu¢ûTÖc”-¼xËHÒ@ÃÀú­zkÿÁBþüM™ ñ·ÃýNÖItožÚ-;*:Ê?à žµè¾ý–¿eߊv6þ"ðLÝEl‚3FÖ®’xxÈóÌó½˜ë_“ç2øãxsþ KFgмÃj6²,±#nÛ‡ÁÊ|Ü|ÀrqÖ¼î¿LÂäYF)a°´ãæ¡ÎÇ™:õ¥ñIýçÑš—í¥­ª¼Z/…t - ^IÿÜy9=O•õ÷ì?ñË· Ö&Xyó­}OÜñóM™¶ÙxsÄwŸ(bâÄD€LŒ¼àž1ž9ÆFq‡Ž>Oq:\xîÕ^A5Ìóøx"y‹°9çï Þ¹¯Çë¿Ú/âMÖ¯©/Œuk{›ÐVo"å‘#.p0:` `c…©üWñ¦²Å¯|U¬\’æBd½å²NzõÉ'ñ¯‡…™%8ÚZ±}Ô—ÿ#Ðîy­wº_qûþÌëu~ðºþ ‰p³¬ZuÝÛDÜp6GÎ9P©Å~S¦»©Gcö%¿¹[<öq3Áê6ç…I§ø›WÒdcªÞÙ8C[\ÁÑMQÆb#}íVß§æfó ½áò?@¼iû/þÏ÷·3*è^7ðüá‚%½…õ rägc,»• í¹€ Œ\e?„Aºiž$ÐnD;ÜêZÍœxÈ}‰#¡R1Èo¾kÉÚ3O!Œ€ 8à`qì)©4‘ýÇeíòœWÒÑáõE%õºÎÝê_ô׿sKÍö#÷ÕñGà›á¹¬Nâ=.Tž6g]CVµ$cî3ž§9Åx•WÓÓ‡³ŠÛõÜånîáEV‚ (¢€ (¢€ Ôðåþ³iª[Ç¡ÝÞÛ_Ë"¤_a•£‘œœ sšË¯¡ÿeχßc¸Ÿâ¦­:vJ…ˆ w;e[ß¹=1î¨Åͨ®§~[Ч… ½é4—ùü·>‘ÔæÖ/,ü5áýBþmgQӬ㷒âRKÍ3ÌÇ=O* ï¶»›½|VðÅ“,1^ƶ^j‡ Ã`ðv‘Ô÷ô5[à6o>±yâ=Bc †“šÏ ùˆ?y½ºã¾:Þ5ñÄ^(ñVƒâëXaŒ\EÂe·¬‰¬‘;r8ѱŒ…`¤déÚãÍMi~Ð¾É “ÑžA‡¨õ§Â˜Š˜\ °S^õÊ-z»§ó»<Ï+Ãf8·]Ôqu#Eîž–u—^§ã±ƒE~œx«öNð¶±¸ÜøjÙ“‡¶Ëo¨Æ?¯n8¯:Õ?aÿ y¨ëiiÿ¬b{ý3ßðûu‡ÚMNħûª‘’õiþ_©ð…ýΕ}oyg<–×vò,±Mmd`r=ˆ5ôƃûGø[ãgá:sË}k‡Mñ¶ž˜¼´;UTÎ ‹”RO'¯é1~ÁÞr² ­I£<Œ0gÜê4Ø»Áúd±³i·n¸ææ^ õÀò÷æ¼Ì†0Q•DÔãðÊ:J>óNéõLŠ^Ò·ŠH8iv¸‘ñßÄ@û—Ä_³ï‡¼oâÕñÚG$Öš·‘qw¦Ýžmn×pBz ÈBö yE­ß‡_¬´I-?I†(ÀFŸw°9'§?äW°ZxthèÑÞ[±³Ø|ä.S+ŽvŸæ:è1ó˜ÚÿV”#êSO÷|ËšPÒñKM´p}6½›O fK<¾¬1Øy*•#ñEì×–îéëçÙ´Œ¿ xnßD·F‘ÇåøáTuý+Á¿hÚFCÚT~Ö'··‚öâÒöH¢ÄR:©S<³½Xð+Oö×ñŒ|ðZyü'`Ú¾w”Ÿ\±AovâEå<àžG~9ã?Ù›áŽ~ xjétãeªxVæñEÄk¨À—6G!%òÝùN7€pr}× ç™.µ×V+{6ú6­i'ªiï®µÒæï:§Œ­óu’{­6ýn®šÕ6µ; ]ñF³¨É&Ÿ.£¨Ýœ"Ek€ã“2㌌qŠí¼eû>øã'ÃMcÄGIñ¶•oç_y0´JpJËäs„|•OlW¹üð‰û<ÙêÓø×ÅZ=î§, àbÆOrx`Jöšð?Ûãá7Û—þi:î¥etU¯¯lµ6»µ|q“¨Ü>ò½8¯×ñ噯%aòÌ<ªÒÓ–¼bÔ6ÛšI).–õÔÓ9ÅÃNÒ¦“[Júù«[ó±ð4È"•Ð8p¬@aÐûÓh=yëZÑÛÄ:ÝŽ˜—6öw2³Ý>È“€XààWΟgÑ_gKû é>Óæ´ŸJºÖgµAswâ JagdSh;a]Ø+“Á,Y½Jë|1¡øf}[LÓtë­nµXcÓHÓ“óÑ'­´æjúïm(¯Ð‰῾+:_޵K[@‰Þ ?ñN‰’I"º*c$G¼ñzǼÒþêÖ–ºŽ±á6û@º`¶š¦—§E¼Äcg%¼‘×k†~9S‚¸l«›¥…´äº&®ýµþW;0õ±ùq%óåÍsázÔð׊µjÐêz§u¥_ÂC%Ť¥{uǃ_dÍûxân€ú¯€ƒs) ´¯™k¼ãæ-c\ç lq^iñ³öf·¶+q¬x^Æå–âÞûN¹Y-åë·DYpyù äG5ô7Ä ?mïj/áÝÇá‡Åk3æÜÛi²¿Øn8ûélN"IùP„\pjüÔüOð7ÅÑ|ø¹£ãOÔ C£\]=£cº'*ðJ\ôèÍÈùÉ^*Ù¥B­‡.yÓ·=9%~WÕ-T“Z«höÑèz˜\4gR*¤ùT¶—Düú¥ÝôßR­¿íŸ¦ülð|Z/Òß@ñ,_^Áj¢ÇR‰ýãóG0ã‚JH(vã埉_ 5?‡^%¸Ó%’ßQmÒö;‹ <ØÞÝùIAÀ;H çäs_¤ºGìÇð÷ᦗªx·@ðü:«™£ ¤êˆg†ÊC0d0vŒ‚0ŒHç’@ÀðÏŠ¿4߉žM°‚-^µäÓ%I<»eɶ+÷bŒ¶Û…BOf¸ò¼VU—òá°rjœý诲¯Ñ_e{éÓmI}$8_6ÇaªbáÝ6ÓW÷´ÝÛ¯ßwÒçÈÿ[Bü<¾&…gÐäºX®QÀÙµ² ¶HA “ž'œ`û7ÄÙ¡5½nþ/XMo«@efÑ<«8ŒÞK`°l ínÎ)âüû2xÆz‰n’î×JÖ4ŵƉ©†‚çÍ<ªÀÜ7m'Œ£goý/àù<_á]Â~ ñ6›u¥ø£M¸X&þÒ‹Üù[Lr®3½J`3/SÏRIý©U”©MjÖ³/‡2Ú9—´Áâiµ*‰û9ë¤âµWÙù¯#à©¡’Úi!•)cbŽŽ0ÊAÁv4Êúköýø|e®¬ì|<¢á'º (¢‘!EPEPEPEPEPEI “Ú€:ß…ßïþ'xÆËE²ÄQ»n¹º‘XÇoå™ÈéÓ823šûÇhâËAðõ¡‹F²-Ÿl©ûÂä³¥˜ò{{k‰øUá3ðÓá|-2×àï÷²y±èE}ð_LÓ~x7Vø›âOÜÙØÀÆÇ3*‰1ÇÔÁ=ON }% 4p¸7Š«¼¶_×ÈýŸ†)Páìºyö-^mZ ×k‹òW2ÿiÚþο“ÂÖ¤Câ-z0%ž&Y~ä†ì8ÀÉêk€øwq ÏÁ¯InË ]=á–hã¦U•‹.uWE>¸ÝÆì”þ9ü`Ô¾5xîë]¿`cŠÕ6R,’ª}zŸÎ¾›ø1rן³Çƒe24Éky{f›“i²°<À™~Vãî°þ>KJr¹ÁÁ…\g¬EwyUS¿ÝÂßqÓ~Õÿîþ&x³à¶·ic%ý­ì oy(Qåþï†y þîrG#c^…¦Èu?ĶѤáîÔ"7ªž‡wr9ïZ¶^4Ñ×àí„3½¼þ$Ó®ä[4“î¢u ¶í2/¦$9ï–ü ðëk^-ŽöH¥û5€3 €ùDƒA>¹#}x×Çæð–=ÐÃÇÊçÝå9Oú¼³Lùcy(߬UÚí»iyž“ãßÚ?‹dÒI§c¹ ‹‹f;X¯ýsd\ÿ×@yÇÊ_·—ƒõ&]âï…u û¹ cªýŽF@’RF+Ð1Èùºü½ë'âßÇÍ7Mý²´›èïå:$@izš·*Hv·líRÏS•ã=+êk=7^Òõø˜?ö³ [JNPÆHù$r1ž>¿ZåÆÉd™Ì1oJU×,»)-ŸõÒçæ*RÏ2iЇñ°îñîâõ²þ»aÿéñ¿>#ÿkj¾'ñhÖtM=ÖÝ4븑¦22Ÿ›~ÐÜ|§9a×8"¾ù›O±Ö칆"ªÛ–7AŒàŒÛ žE|ûxÿà‹¾$ø'Q”%í´ÐÝAÈOnÃä‘[v8ÎÇö—‡õÆuÍÈ ˆG<ðçÐ󜟥~qÆÛþ £–eõÝ(¾Vœn¼ÛvßcÍ¡IË/úÔ¤Û‹}vò0Dø[ãŽ?³Ì·A¿²ñfræKÍ{…¹‚v<ä˶\‘‚J/~NAï‰gø?ñnkÙ4tÕ~xút }¦<¤X]³½±B£EÈ=öœqïÿµ¿~ iñÞÜxWº´»|­Þ‘vQaÆ8s d@ÙþéÏÝ—Í;oäýjóáÅm*ÍoÂ^ñ~­%¸vÔ4íN y³(i3>âza@Á c¹¬ï†þÁ{o¨Ú|$žæãL¹-5ÌÞ*µ¼…XýÐÉ#F›Tãêx,{ùߊ¾hZÏ'Œþx›B âkÍSqoº˜Ø Àè3\E·…>k)â{Et¥ÒòÝ{ùDwätÀîG…>J±’¯J•I;ëûè­VÎ1­5®Ü¶òGt³Oâ¥%è“û¸|IƒµÏ-—î|D-móyÉ{k‰€bߺCjÅxÆq·hõ5â:…ŸÁ ò&‡Qøƒor%Ev–ÐFÈ6ä2î ðqÐgÞ¼ªËöfðÖ´å¼ñB &e/åy¨Ò,x îØÀúõm'ñ£©|øÛðöÎÚãHׯoímÛ0Ŧêá0r1àuÀÍ}^MŸË(¥ì"êŸòR©Áz)S¨þù´Ö–;©¢2_i¾Wû>¡eJ}švd‰—SŠÊNz`×ÅR|rñV›¨¼î“£j3G3à½ÒcÝ·Ášõ\pÀõçšÙÒ¾)øC^ŒÇ©i÷~¾ÙÄönnìÝý nD‘}òzq_E†¯ÃŽ*œñ8ªô\Zz‚_9R¥ú·÷£ÕR¯N<Ôãz9~®Ç§ø3â+ü5øŠšß‡e”éÐ]6 ‹ ‹}ßr@6îÊö8篪~.6_Úë1èÑx¿á¶µ¸¾Ñ® uÈž‚a`å²ÉÕ‰<¸|·àO†zŒ^ÂèxëI·Òn¯Ø^•rT²È̘ŽM¤§=léÿµÅËO…ÞðÃíôjšÝ¸‚G¼Š#3Â]”«c!–E8$dú`Šú~?ÄdÕc…ÅáeíÑÙ?zâµ›Og}áS•le?Þ^2[>«þtdø3B“àv»k¢èšëk ¼_)›D¿¸ÝæiúŠu¶˜/Ýw_”d Çc sôÂOj^$¸htüÜÍ^cD¯‡ÚŒñü\~sœ×ø'J·Ôþ|gð<‘Ë{ wÔmom·,‹4;¶-Œ6UJ’Êœà+gö^ñâëž2Ð5D\'ˆtÙ¤gj¬à:¸ÀÇ›@ëÇXÿ:qg Pž1Ñô³OgÊõOÕ\ùœC¨êáñ{s>I[¿Gýy>7~Í÷ Õáp|‹þŸø}õþ…o…‚éúƉ3•-¾0v²ä“ϦüIð§‡oÙZÓÄšL1[x†^â̱ÃYßF›jÍ×k9åe`2x¯ìãûWx“ÄŸ´'ˆü!â‹¿´¥Ä— ¦<±*²Iba“n׉_®NäEMzÿìϦ[| ý«ÝNrÁÑ\CF”u¡Z2œw¶©·o+ûÖésõ·?Åa2Zµ(ÊÕi¸«÷I¤¯ßMt5ñ>’mtÍC\Ô&†ßû8ô½q•K´¶ƒ+gt1ü0I±°s ŸôÌW¬Ù_ÙÀ–W^jG´O 3eHʺó‚'‘êkCöiÔ£øðÿÂöšä$ZÖ—qáÛÖY.Ÿ<1€U„`ÿs=¯*ýžhi<=ÂiqxŽÑõÒl5vO2çLÜæ?‘þñ_.l·°¯ÒrÙÍ^7÷©·T¶ü¨ÂñL2)F¥—Ø›ÒvóÐíþ!kZGÅm#KÓüw G¬®›¶²Ôl§{[¸ŒüÃ(ý ¿ˆ¯þ)|;›áî¾"ÚçG¼m>í° ‘÷VðèNÖ£# ‚~÷ð÷ÂßxƒÁ·ºž±â¨¼/q¢,£šùA¶;“r†#î±*ã®:~ÎòÊU`c‘v•VêÙ ‡m£­}¦'êu0ÜðÒ¢~z¯Èùþ6Ãd”åSê–xÉ)E]^êûmçuó>¢Š+Â? (¢€ (¢€ (¢€ (¢€ (¢€ »¢j+¤jöw­wKo*Êa—;_88íT¨ ½üñgàoޝ-µøËRÓµy™ è÷V-0…ùÊ®®¿tdí8 “‘䵿í]wñ‹T‚ÆÇÂ6$G1žnÑ· A@Ú0q_3Ñ]UñU±)*²½¶=eÑ%òVA_pü Ò΋û×ÉKÜüÒÁÈ@Ä¥±ƒÐ¶AÉ­Ïj^{ÝiI¤fጺçÏN21Þ¼CáÇ‹$Ðb•êaš‹óƒÛõ_4~­˜ä´©b«`–‘®œ£å%½¿oSó‡öÿð„ºƦÔÄSP¶G·ά 0 Ýy³ž“ü øëâ€5ƒÄ^»(r«wc)̱“‹ÜyŒäkôöÐø3wñçᥖ¯áè#ºñF’Í#ؤ…^Xöå¶)?3¹Žç-Šü»¹¶–Îâ[yâxg‰Š`s¹Î2rG5øæu­ÁôÝJIÖËdýúmÞT¯ö©½í~èþò¡J8ÏÝÉ{ß™ÊBø…áÓuá×|5sæ@’mðì%(À:󟔀Ã9pß ~ÑðOËÿX\øÀ7:Ö’ vÒäMó@½ö¸ûÀsÃÀsɯÑo|.¹Ðõ‰ë{’>lg¯\×çÿfo‰~×fÒï¼!ª]4ryKu§ÚIqo!'*‘“èp}«õ<·8Àæ´V#UJ?ŠòktÌ+áéÖ%h&¼Ñô¯Á¿ÚJÕf‚x’ëÃ> »¸.…~ŒðNH;vÈÆü*¯ÎäŒgœz_ˆ£ð§ógñ/ÀVšØb¿Úºî.cS’NüävÁ׿…þÍß±ÿŠm¼I§øŸÅ¶cIÓmˆ–;9pÓÈÙà4d`/¹a_mxwá@ñÍýÝæ¥ ¶ÖR#2Þ)€ø$»%³ÇL÷úןŒÍÒÄdžŸ´›ÝooV¶ùŸ#ŠÁÕÁÔŠË&ÓëÞ?ì|Ÿãïø'Þ“â/ ¿ˆ~k³ÜD7"麑šEþ'{uÈã­|÷á/Œž?ø≴­R[¹"‚AÖ™¨36QN6¡<…àcp+ôWáŒ3øWâÙFÞdw.ֳƀ÷Á=Lzq_ÿÁF£°ã%ˆµŽ%¹û#ybîÃô<žÞž}'$¶ÑžžTó|3†2šmhÿÍ>Ÿš;¯‰> Ðh¿„Ñø¯H¶Ž^;2‡ gtLÍ€W$Œÿ²=Å|,ÊUˆ#_[~Ê¿´?ü/׬5=V;k›G’é`˜Jê¤s”Çã_(êW w¨ÝN™Ù$¬ë¸’pI<çšï‚”nžÝ †aˆÂb1y|Óötä¹ìï³ëÓç~ç«~ÏWÏuqâ}ÃIoy¦½Üh?†xun½Ôºð ;†x×ÑÞ0»ðŽüðÏZñõ­þµá{+Èn4›•Þב«bÞ6$qQ€ ‡ƒŒŸž>i"ÛHñ>¸È<æ…4Û2~ó4Œ ›'bàã¶E{ßÿÙÓ]ñf­$ž#Šoøn×?nÕ5òDG †ÁÜ~œw¯Ýxc—â²lî§-TsŽº´’M.­7¥–­Ÿ¢T¦þ¯Î·ÖÇEðƒÄ·ÚgÃߌÿn¯sfË †ðó¸.«È9è=â2ÿc¡-ÇÃXdÅšâà'*¼“s¢îõÆzWûTügðÁð݇†’Kwá«”¸¹ÔÚe‘¯g+‚»•T0 O8=¸ôÏêCà×ÃÏx®[rðøGEMÀ;ío·ÌËÇMØi&cÁÀ>¾;<Ìhç™–/0¥RQJ>ŠÑß½¿˜ÅPj•?W4þçv|¿àßOíQa«Ú;A,¾). L¯pC  uˆÆ+ôcÄ×­iûS|ž1¶éíu¨¥&-Ïåùkž3œza¿½_ž_²w†oükñ÷D¹$”iÏ&­u2.ãϸÇë3ÄŸWú;¡h×:ÿíq¡ÇŽö ð‘[€„m†úî`~¿ý˜õ;V%fÖµ¬£ ãyR²7Ða?«jö¯ñwþ )w}ÚG€4Î[Ë 4Å6;4¹Ïm‡Ò¼«þ yãK¿¶øKÀ6ðÈmma:ÅÓ"åZW.‰’8%Gš?ó²úyž -ðØuÍë$¢—þJÙô‘©ìòú¶ÿ—’Iz-TgþÃXü% ÜÃ"x¨ªïÉʶìS6á†qýîzWŠ?ìÿ¶¤–öÖ«•âæh¡!vÜS‚:p"¾¤ý‘ôUðWß _jÒý‚ >ÆëÄ"eÛ±YÛa?Tò˜¸+è1òwÀËÛ¯ü{½ñ$Ñ…b/µ9Ô}ÔóÔ(?ïJ W×`%ÏWUlåeÿn¤Ÿâ}:‹«§/ûn+ÿ'›kð>„øÿ,Öÿ²°6†Žçİ)” 1+N}G+Œ÷-ï_Üx‹S»Ò¢Ó'¿¸›O‰üÈížBcFÆ2àW×_¶wŠŽ‹ðgá׃´rêM®\ÆIÈ@LpÿÀ[.ØÿdøÖ½Ôî“<®,®±æ.qÛ¯»OÐ(¢ŠgÉ…Q@Q@Q@Q@Q@Q@Q@Q@Q@v ~,ëßµÉu- X•çŒÁøŠóßOnÒóɤ¿úùõ¯Ê +æŸåð›žu)7ü“küÎéñ.6¼91…OñE~–?]ü?ðÿö|Òïí²|?2û††P\`üž™Áé]u÷íoð_ÀVöïãí챩H­´R— ¶C½û.sÒ¿³V´½*÷[¿†ÇN´žúöfÛ½´fIúšuø?/ÅÇ—:•WiT“_uÑæ<ү؄céÝßþÐñ¥…¥æ‹ã-ê¢4kÈÒPHiˆ`ßì‘‘ŠñoÛWâ6ðÓL‹Å¾ñ5¯‡‹+ájš•áùcmVâ8£-ÿ\âÉ<žç¦½v )xšë^ñ¡-ýýÃw1Ùþê.pª=s5÷˜ <¾‚£~ï»/‡†Ä £Öµü'á]CÆzäV›’âEy˜ác³»ʪ¤“è*Ox3VñƬ4ý&ÜK RòÍ+ˆáW‘Ï ¿^¤€2HìßÙÿöpmKM—ì0ÜDs©jñ¨K­MÆ?qnÀBØÀl‚ÌK£ê²ì»ëmÖ­.J0ø¤úy.ò}ìáp’Ä7'¤Vïô]Û3þXè <oâýjÿ† H%!N·«%p1žª¬F ½|áñoö…ñׯ^{¿ëד[;“ž“°·…s„Î8äó__xÓöLø‡ñÓY³ÿ„›VÓ¼àý2?'KÐ-'k¿²Æ:±Æ¤nK6I'Šê4/ØÛà¿Â]&óXñ—>%0™ämEÀˆ ¨¸™°¡Iä22hÌóEšb)áð±j´)Ájí~½å&îÎê¸*õS«(òSŠëÑ.¯¯à|Wû>øãZ×ã×¾Íö•³¸H,mš2ßi¼~#Qþæwû£½}‹ñöcñÏŒü%ᇺ,¶v: «jk:ŒÓnkBBT¨PrU# íÏsÍmü ¶·×|A¨øêßDµÒ´í)ÖÃEÑ­c  *¸óð2Š>ñ³‘·IµñÔž%º½³²Ô!Ž(`iõ nWòí´ø—;ÙXœ;`ŽN99î':›Ê©Ç+§¬ÕFµ÷šÒ+ü)ýìùÌ;Á¨<Ç-q¥ñO»·Döodºœ_ì¿û1i?µ=RýuC«ÜÆ‹î¦ÑyHaþ΃qÈV Ì}UF8¾’ðþ‰¢ø&}wı[-µö¡²ãP™‰.ò"…NOT /%ëÈþ|AÑþ34öÞ†eð^“?Ù’æHš?í€2Í‚*BXÿy}ª•Æ;Ž_eøá+EÔ|)á—YõýpÉû™<Æž¤¶TžŽq…¯Æój«9aëÊÔ©Ú¥y=´Ö4üîÒmv¿Y#ØÀÐ¥ÍՒ曼­wʺEyÿÀ¿SÜ4#IÑ4›­u´ûk)ïTÝ]ܤ*²¼`»Û98ëžÜs^c6© øçÄbmSK´¸SºIfšw"—nHäàSÚ¼‹öêý°ᧉmþè–éuwkqª>N!Î PðG;~bfZ_€Rø‹Ç^ ŠóVµM6M]î=ËþªÄ&á#žv‡ÈažÛ;« qxL$óù]ãŽ.òNr³dÕÍCûKCñ;â=?e2ø{Dó Žû#Ê[hÛožqÐÈ@ ufp8®÷[øƒ¦ü&ÐÏ‹üAr¶Z®¼g¡ÛJHxí”*™p9\zû×Õ`hTÁRŽW|ªïÏ[¿½ì}>¾¬žxœnŸ,/¢R·,#­—»JVÚϹ矵ŸìË®ü^ñÈÕ¼9«X?N´M:ËM0h¢ €rIÉÿ9¯¼gû=ü@ð /ªxj÷Èç÷öÑ4±þj+íã6•ªlò/c“óùu®ÎÏâ4- p’F¼ìq¸^ vG1iÚKô< OBºö´¦Û}SæM÷þ™ùg=¼¶²š'‰ÇUu*Gàj:ý&×¼9à_(þÖдˉ[ L-Ñdÿ´:ó¯~ÇÞ×G›¤ßj<Ø'h•"{pPù×d1ô¥¹ó®Ì(|—à|=E};¯~ÃZÜQ¼º7ˆtÛ ÛÙ’6#2Œÿž+‡Ô¿dŸˆºsšl ½m6AüÀ5Ö«Ò–Ò>v®SŽ£ñÑuÿ#ƨ¯C»ýž~$Z›Áº¼ŸõÊÕßù ç¼GðãÅ~²[ÍwÃZ¶hò–{û)!Œ¹… Êp¬q׃éZ)ÅìÎáëSWœõLçh¢Š³œ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šú[àïì㿌þµñNŸ©èú=½Ó7ÙàÕžTi1]ÿ"7zVÞ«ÿÍøÃ§+5¼žÕ1ÿ>zƒŒÿßÈÒ¼»Ã¿µßÅÏ i°éú_Œf¶²…BÇ ³·uP; Ñœ ëô¯ø(Æ=<§­Yß…ÿžö©?÷ÀZæ~ÚúXõáýžâ”¹“ï§ù™Ïì7ñ¯F$7‚.®Àïg,rçòjäõÙ—âÖ–Ü|7ñ891ésH8ÿuM{ž•ÿ4øg·íZV•x3–æHÉöá¿çô®‚ø*?ˆÁçÁ–³`#ÔÉôïKšºû(µG/—ü½kÕ?Ñ$Þ|)ñ¶œ3wàí~Ôc9›K?šÖ-χõK2EÆ›w$ ¿ÌWÝ¿ðTɲ<ÿJ§<”Õí![6ŸðTÍ3íÔÓ¤w·÷iW¬?ýOöÄ/¹Ÿž !Ã)SèE}Eû2þØÚGÀ¸m­5‡šM؉ o«é¬:“ç –˜äžN3í^ðŸðTO ¸ýï„õpØê¾IÉÿ¾þ¿çа¿ðT¨çÃ:ßÐCù¹q4㌤èW¥x½ÕÿÈÒž…9sC“ô:øz‡Âø1åxgÅ2㨒uÏÔ‰M9ÿà¬>teÒ~x‚ñÏv’1Ͼ3\¹ÿ‚¢ø8óÿÖ»ÛÉ·ã§ý5úþ•Vïþ ‹á¤B,ü1¬o#þZPÉÎkáßpã—3À'ë)~\Ö:çjšO¾ãGÄ?ðRx†×g…¾ êR\¶6Mr'™qœ}Èãöù‡SÖ¼ÇRý¤k¿\´Úoƒµ½"7ùP龑˜¯!Ú£ž¤ñë^íñ¢BPÊ©ï9KÑÃá¡Á2¬mØ?ˆ¾#¦ÑÉ‹M°ëê7»ñßøOjì.?d߀? ííãÖl5ke®˜·r‰î¤ì8YHã’qϺW+uªŸ†úZ^ø÷ã ¦¥ª2+Éö)Vï-ÑáXŽ?y.9<*õoø…ûX\¿Ó¾YM [ݳý§ÄWî&Ö¯7gq3ËÙ9òO%{0ÔiÅUÆUæíÿíÒéè®ý×S+¡MN0æ“é¿ßº_‹ô>‡ºµøeàI£>7m'Âd ÒAàm&viW+]ʹ‘˜C»ÆÜâ­x‡þ á .ÕmôQ=Ä0¦È ³¶hcAÙFà0>‚¿:çž[©¤šiYdbÏ#±fbz’OSL©Çâjf°›å§† H¯ó}ÛÕõ9#U‚ýÝ8«m¥íè¯e÷]õgÙ-ûnø»â½‹á)»¹b±‹¢øgs *¨Ÿo§:ž,ñ¶¯ã-´›‹å¼²µÉ$ѦĺœnnÞ0 1UœO,kÈ?dÿøáþ«®ê¾;¹+isföQ[ZÛy×2|@EÁõ>ÀWk}ûhøoÁpÏcð÷áåºÍ8´ñˆ.<ûÇÏGxUDc”g Ïzö2L^ 'Œñ*Õöh¦µ~½<—©ó9Î/4Í)ý_ÚÚ~Ÿ‚Hõ{-)~xõoëSxOÁ—Ày¹¿ÅÞcÎrFÐ' W¤øÂ÷öËøÿ <ð¯M‹í—ñÄØžõ¾y9Üð¹ùW9!±_#xß∾#ërêþ%Õîu{ù &[‡'h=”tQì=+7K×u- ¥m;PºÓÚPCk;F\Ò3^.¬ñ“•Y¿yõê½.y˜²ŽsGÞŸw¿Ë²?I>!|OŠ÷PÐÿgÏIšÕþl5=ZÅw[é6¼,wUÞYù>„³àußþ%x#öø%‚|°\øÖæÜ’Dç˜üy>=>b¨UGçÇìïû@_~Îúæµ®iV1Þj·– enf8Ž=Ì gƆUNÐ@$A\¼q®|Eñ%Þ½â-F]OTºmÒM)è?º@z ù*¹µJJo÷P|Ü¿Í;é9¿µn‰é}]ì­îÓŸ²‹QÝõþ»žÅû:üÔ?h/ˆWÞ&ñ;Ï}£Átn5 _q“QºrY`R9%,GE÷"¾”ý¯¾$Að¯áõ§Ã Jdñ®¼ÙÝC`ÿ¼³´R‚;t ÈÞ ^à1Šò߇?¶Fð;àƒá¯ iCSñ|bâiî®!Ùok4¤e†y‘°þÎ>îy×ìçã½]ý¡Å¿¼A$ ñOrÚœ±™\\2 t+Ÿ—°Ú1Œ ïú¥J˜§Š®î£ðG·y?ï=—eæÙìSÆR§…Ž—»Îÿy/+蕵å[¾ïÑA|øCað÷Árbçû7H·†=OÅ«•YT‘žåwì 2wnF1ògíñªÿãÄ;vhÍ– -®›§†ÊÚÛ  ª=Î7sì+Ñ?jÚJÉ‚üq5¿€tÐÊìmFà3™û•ämÓ>€|á]ô)J ΧÄ÷ÿ/‘Óœæ”ñŠž¹pôU¢º·Örþô·}¶D°ÝKo(’7eqüYæº ;âO‰4 «k«O/ðdù\Õ¼¡é%sÁ£ˆ­‡|Ôfâü›_‘êÚwíâFxà»ÇPT&!]vûSº.ôé#oXgÈ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙkit/sample/mgp.mng010064400237450000000000004640030723705103300137240ustar nishidawheelŠMNG  MHDR&– v!ÔÂBACKô÷öÓˆÃbKGDô÷ö ¢ž IHDR&–ÏðÆ‚IDATxÚíÒ1 0 À°ò= BóM“l92Vó:€Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° ÁK¡Ò*¡µëÿCtEXtSoftware@(#)ImageMagick 4.2.9 99/09/01 cristy@mystic.es.dupont.comíèÙðtEXtCommentMade with GIMP~e•IEND®B`‚ IHDR&–ÝE³(oPLTE¸·Çýýýñ÷õéóðîõóõõõþþþöúùØéäËãÜÐåßÝìçôø÷íííðððö÷÷úûûüüüâìéãðìúúúÕçáøøøðòñóóóàèæáââÛáßÔàÝêëëéééçççßààâããçêêääåùûúP’‘tRNS@æØfþIDATxÚí‰rã8¯…#;’e9ÔbkµCËKÞÿ$%J–ÓIªgîÊùj¦ªÛáò$@Èýòàß$X­_Ã_ÓíŸhµùä§›/·óÍ^_ãm² ƒ ˆ¾^émµzU†4 ³ü_êy¼+^žMÚfÿõÄÛí69”e^|yÅ‚}5²Ûí*£åþÖzÿ¤[À¬¶Ékôdºƒ}BOà?1ŸEBëµ³¬®óà‹ud}ª}ÃËýñý¤[ðÂfx»Ý•ùòÓõ–$u|÷‘ý ÁŽë}Û†Y]|±uc ,F(±ªËüvá'Ý"ZÓ¼5u]—ÓìÉÒù?b WqUÅtÆhèŒñÅçº ™$]wNï"•*Í–Fþ7»Dpà‡’Ÿ®ÇÙ~K¶ÉšTçÿÉ‹2¥S>Œ¶Yù ™ÄÒú|>k­û 뤣¡C'?è¼83¬›6|حɘÎȧø6ò¨¨ÃTéoËDésOœ™+é$¹¥í7tòƒnÁ‹™{ž}Õ„óÝúŸÖ]ÛÈóú·ûåõjسýžL*uîï÷^̉>WlNÈ9þúòƒn‘›Ã`§éùšN6^—%QN‡–?µÎ…–ô¨(³6Mé07UOÎY&ZT¢5oºçê…ñ=mãy·Ažü_,Àƒë[ö:M¶Ú´(hº ùÛëú@ÜTX­V«ÇUq…tSGD¸Z½?Œè‘†íüd±Y­mÃíG4s°œLH%tm›&Õ¼ëœõlùXM7aÖíÆŽ)_qý-­§Â²¼±èÿc¯›‰9‘“ ý€VE5YéOXñzˆ­GZímQÔä>¼EÓ %ñ^eE¾®âýX¦ØUÕ! 3>÷ Õ6ëkØTš¸âV&}Ïö#ËèДҮ“j|…çóÁMÜ´i·‘S®\ê´ô;ždà°É–'ï÷³š˜6&¼íïlhü§u³®¶6‚!ë©êl+žsø+îªöMM.U\nÙè ‘êŒ,×tþºK¼:T)ekhÒÈä̲ ë2/˺Mز9F¾9¸~Øt=ñç§Ý2¦Lª¸No™‰ùëG²ÿ(6Ùö,ùʺH!þcœRƒ1ÇgÌ"xë5,°i×ÔáJÛx²fV&d;£5ëVd’ô÷»‰Åp •ˆa\Œ(þ^8l²×ý]6ñ»6³çŒ‰Òwc&Tc.yèÃÆ   ™¶å©ÝžŽ×Þ<Õ\hg ©¡PÃé;íÖ»æB´ÈÖR¥e•Ø*™TJÕ™$lT.7¶%g7¼`ìw\Ú›€¾=vͺ•{ÏþzåßÑÔHù7ÔÁ| ›Ü艔ÓÉ…Ÿ"ž“”Îô‡ëY¬ŒLÚ?¯­Y:4ðí1y—m<‘ÉXH…Bv®Y&Ö»öÖ‹ uHUR5V)K®D6¥N¹²é¼.Ç®¿)£m;›¥ÁIn èO»™t|ÜéY\!Ü™#TãÇ~;6Ñ|éz7çÁ´¥ëÍÆD.׎g9w¶xbv qEy™ÝX&W+¿P;ªÃø¹LdÏi«’šS©NQÖlS† j9žiQ©{È•Èi'z28Y÷D»#Ñ‚L4Ë„÷Õ:/Š¢Þ'mì:™'9òK‡X²ßEHâØ› ¯Ä;™È©ƒžW#ëdFAÙðAI‘‰+dVËŠ¢"ÛٳɂL‚5WI'U¸aФ»£§C29òáàíÅœ;¼~‡ÁQµHAÛc×£L¹L”ß›¾ùAdâ¶_À˜°‰8 ·ÁœðÄ&©y¶;ûlµÃJIJ5¤^Ä6 2±ÝÖ#’B)4^ÃF%?¦ý™xUü‹%Zå|Lžeâ2 ÌIÆZ›åF¢ÜLc'd"—‰c¸¿àÔÒuç/ƤpHÈ*í¬9 ›Á˜¨t?y¶Œ£ç[w$2éûQ&®w ̹)ë–,ɤ’çG‚ÈËæ6ñKÌ{dµÚÝâà +#Œ%™pà%u'Ö`” ΰ ›(6&ø+bNöƒ1I[-ÖFûñ+õ˜Zк ¹Èd¹P¾CíK›ÎR»³Áù&ÆymÛÖ\ØÍo¹ã&kmÜ¡™¨1ðòâɤLJñežÂvgÌ 'qt­}¶Sñ„†gË8FbÁ½ž„;7ÛÑj±ÐG5 µ?aªÌð Èy͘ڿÿ]n¤Ø¹uç~ŸÈd<°Ž2 !G(aséš)“äÓñÓç !§Œ“&AX^‰‰ ù´ûᡬ%B5/´Ú>—É“vgŒ‰)‘R^ñ’Þû•Ñ(s®]–‰>{·É#.l"óT³/B'QžV¹Y!»[g•L½Ûîyç iöÀJžÛ(Ù^ÎÚ›û›2ùT&é¿dMŒ¦KÈ,½m±_ñµõ§ÖÄIÈŒ2yÀ…M$~–׫xÁnÆ­$߀ïê;Ï#^'²“íŸÍºl:öî'`³t•I³$Ä×,CØDÂÚû~RŽ4°Ѧˆe“ÏþO¤ãy:®ÐÄYx“@û3O‡|¥Xîà¦Ç·Ýn]Ž&c–Hð€4b.0‡F8 ’ÜRíŽWÉ|W‰–ñ¥2™W¾15ÑFpOh.˜£÷@çk››ß7É9»ÔÉñ6*^wFOâ&®ÝË9uW¹48®TeÅpþø“Ll#W/‚úqH¶I׎þdò6±.J!Ï4§5Þ{{ ¼N<â— Þ'F6»h%éDr‘l£°\Hîe«»nê"ȳÕ!Þ&1+åþL&¶Ýªw ¹ÁfͶa'¯­zQØÏdâ'—Ь½ÿ=NS5ØCÈää• ›´ßÄ—òFÃ…oLõxÿգGå™dU]¯ø ˆC,/ƒI"»úãB7ÉB®â®¿v’ñ¨và ñ‚L†vã^7 ¹ã&é¨k³1]ö2‰ò66ƒ»qHG7jü “0„MŒ‡aÌÉézäË^›zRÛÀ‰=øó[sÉâä IJî5¹!–BºJ&‰!MÓ=K$(£I»Iì¦Z-1¹úûT&EÝv6£>Ž+›÷ß ×<dò#$lâÂK/²[ðÆpõÖld˜5ÚCÚÛi”@UíÛFOeB…êPu'û J·-ç%žÊĵ›xÒ¢Z©¼ çå›TÚKkx€éO~²ù'6m2ùáñxÑÞœ99v&î‚ÅþrêÕ8kòv%Ià]ƒªË^qÆg€mÉþ`^ÁÔÝñD?8v·”ÓÈ“l`eÜŽœU¤ÜÙØ¶{äv¹áªÓ©I¸N[+®Ò}Ò˜ ŽE’ºüs4žv¥Ü¢ò}£…@PK¶×0'O³ö/9¢œ_áWœ9bf·:;Ü:‚ÖÜ$¤Ÿ%Qpô¨Pf³Ÿ]bë™dr‘$G³ÈÜU*¹iy䵫ï¦a•ºêãë¾ftŸ}›¶UnpÊeÿ{¹­ÓnéH$óZ\øè×3LZ=®Uc¿þÃF2eÁÓqÖ"ÞQü´ä!AÈ¥ˆëÛ-4…\†;¿ÚÀ/šÞÇ„Iê:Lå¥ «¬y»jLp÷-ã?“ÉÒà$!®ÛðºeY5ÓÏ>úõÐfNsâ½—b¦¹i½ðEɹ†’ih>à¥Èü%œ½pÏ,íÿÉÞ¤(¦ÃÏØõ©Î&'‡‘ˆ[i¼W͇v‡†µòÒI^¬­H?}‹ÆéÄ]ê¿Ï>í–­^(§ä¡Å…~=2'þ÷ÜD&³ÐûâÞïM‘a"y=å½:«ŽTùB³Ü½s³æwÁùM:Þ–è?yAÏßÎzšµË-·þ+{\…³mnìòo4oD4_z*˜t+¥ù"qlqá£ßM*Íšÿ­YQAŸ ­—!ÕÐÿ&<ùÈŠ€Ó>Bs«Ÿ¹tD¹ ܧ¡M¼'dË‘ü§ñübS½|ÇvY]ÒræÅUùôU+pÜFN¾ô`Ö-ýºóo [øè×Ãi„eîO#}RLîç§™†î3–—$4óû¸|«_Ž_¶…×’]&.Ol¾¯F—ˆÏÚ-†v¥åé÷4š*úÊ@Qºkdš’òÐmdþ:ù}?QÌ¿sy~Aω†óïü”¹4 Í¥I„÷Û)ÒXBï`^ЫtêECǾçßS3´[K†ýÂPþøý£Q06²ðEÁÓn±4.ðC"±;byæS”ц+S© ý¼Ý§ ÿÁŸåE S „Tí·%‘Hni:FC¿Ôî_X](äÿ7]S}w9½ŸN§®»ÙXÙ €ßðÊæß.`Bî~li¼ÜC4«ä²F%ýÞ÷†ƒ_€‰vJŒËEjÃïý+à7`"p6 kßÏûοi~‘ óg._æš|¾ì¼íà è5³ºÕè¨8N˜ðOÛñoúõÕ°¬éÌìµNëi«qY…¡ÝŒLèùé «6{Oˆ&æx<†–jÞöuðD½¸¼ÔFc˜]ýcm]t:_zPèPÎÃVóŽýeçÆ¶kföOë*Ò­HaQ&ƒélÜÍ_¿m¥Yõ$žMfÓé| 5ê^÷UÐä-ŒÛp £] ÐKçÂ|„B‡rž·ºŸfÃæbàz®ïLǽÓZšhA¸\ÝÖ›;´ ÆÍv:23žüZFѬ̉͞µu¬ù¸›Ãk£I ç—9ÖtÔÕ~»è\vÎçH¡£ŸŽðĸÕþ¤ß÷‚ص§£iÒGšøq’.—i†Ë5:ð,çɯeT›=‰'8B ÇÞEÖܬ_uþ—úú—Ðj¢øöñ¬F#ß¹¶œ-ðä—š|b°kiuGÛê+:ÙšM< ÇzEu·Åª¬\ 2µæM$éGØhD Sû<µù– ]'XhÑÆµo®A McÊΣ¾®d°-ª|FY“æM£à…F:ûRÊže4 |XÁ(éÝ!zUéR¬Š¤’‹¢Ý%¶{ÙÑ>Îón5‹4ùˆ&©yÇAŠv0+{ÿ-^Àïßüóãg NÚXì-œL“? ’ 0Ç/ãœx)Øî<¢!câðM¾?,]°3Ùû¢"ŒkwÙ¾ëyášFê#3]BçïÐi¸rm*‡”£Q~f+³ó¤¯©…*sýW¸¦·‹¢ N– wÛBg’&貊œÇ¶¦Ë4¶§ 6œuÎ&qºšwQÁÅÃfÑ;Å~…n]õãåÔR*¿oÎ߯þááa•@°3YÈ}“—ÂL›hñ­î÷Uåæ„ŒIä¨u¾ãr4Ïøs£ ”°A ‚Fª§®‹“ô' 9Ží‹BÉŠƒ+² ê¼síDуm¨ò:Š7Ñ6ò3ÁɹvSdÏÊ4:oÞ!±X  ñÛ!ÎÎõ„ˆ[ÑÙDÖ<ãIµYŒu±[©ç°Ýå£_Šƒ¨ÍVÏœ@èÃ÷ïë̉܂zM^OD|ýƒ‚„ÆŸž“1‰b¤É×ýÒ‹²ˆie ·ŽïI‚šˆƒðN†Ô"d„Ñ…0?A…b@JnÇ$Lb‘Ÿú‚ !šœS•­í Ž@Pò¤s`–Uèiblîî6ƒë›áù "'A@‹Ž‚4iἿù"Ú¥ÞÈ#´·Yc¡mVÈ¥B)ù‡ëU*Ú } |r2 ÷0‹–³#KBr}×ë0vAÇb]BšPÄa¹÷v \.taE»—Mì\":ˆoÑZx$£¥6+h²YaZ70³ˆÁæ)’W]É·~xØc;@YŠùžC“ÀL›4ƒåþ;ÎÌ4Î̉0&n‚iN˜E^Ó|RDìúv„Ù ?¤9‰t"ua!M ŠB¸Bûý* 4žÐ—ľC†„ÓèyGø5ð—K™TñÁA‚Eè%)Ä´„`»6¶ŠÎvr+uÁ y(šf4i¯öûý: D tÇ6hóáfµº#;2ëÐÆä™¾ÉK  ¦MÒ`¹Þ£³·IdBZ“8YÑdZ,þÙ ¡ßv¬)Àr|J¼|}@çh’•ûöV P¯"º:ozI€-‚¾4Ü=²Ý€ª¹Sk‹ž(H˜ÓÄhkEà>`šH¥×tnÅLèÓNë¨Y¤É-r€j8PàNüÞ—>ìú¸«Õ#,áã¼6šPÚ$ ÒÕ ——v(̉z&ŒI¦FœH‘8AVílŽáhlŽÇ£ùvP¡I¥ÐTš:ícšÄ™¾î¡Š –¹¦ ‚§[ð6knæ4iÿüñÏ??¾ÿ¼]-ô‹ÒzŽ%jïì°s€Ù4ÂZäa0Tm–h’Ò‚ì¶Š0®ÑÀT螋8œæPWn <‹&ìùâ½ñh‹¤Ð1MŒ`µÇF,JJï\ÐÄu¦r;‘Þ¦ ™ÔZbÔí{¾,š@è:š€J=Lm,aü棺‚;w‘Ï-3£‰‡! z–ØWû3Zâ×%šìÈ2ˆÅ@  Œl/׫¤Ž&˜ µ=ÉÇÒ6Ðû5k""^ðT£m¶”ÚK–@çºÐbÀ bB¿†&¸ç¼©T¨´² y6M”G]œôICÏ·o2s²Ë‰»Ý±œ[MÌ”· Õ1T],1ØU$MŠBz¸’…–ÓDôK·R…ÌP«•%‘4%bIÑ+Ív´-R¬‡íŠÎõ‘&Xuúµ4i\YE—¤(„0M(mÒˆCpÏlÇ–æÄnäÆÄwÀëèd£ŠWVàO/·r´@ý„û‡2ÍÕBG£ãbþ[Æ=Z¿Ò4ØÕX“$7 ä^½˜$XCww2o·t†7Û,Úë…œ  åvL¹?pNjhB¯íŠý¹VN…i’¡‡f€Æ)²,ôSî’LW˜DÖ À‰ &èÍÙ{E:Ây0¥EÇ K^ âoƒ<“÷säK~¦*I¥ÊÑHg ÀѶ•é|>ŸhS:«pØ®œ Ü{"vy„&èf»Y%š)žOååÑÕs-6]§sqz#Äýß—ŽÂÔ ýy2"ãG4¡snML(Ô×Aæd%0ô~”&c£$·nð3…k”›·-0"f·[â`Lí†y»¢sïñ ž¢‰—ˆ]"µŽ& ÓðIЄ¦Óx†ædƒÙíO+„•# “ùyDŒFgf.­s+hÒC‡&•~o6RD%Ú¸«£ ɽ +Uê­‰9дËcdxèt r“Û)x€µ¼8 «©‚&X%ñ²Ð¶Na dê®ïRlïf‡[š‚ú®— ©‡OŽhPûiŽD4õ‘[&p7Ùk‘iug–ízx DDÀzUá‰ÏG®ë.“p¹Za¬+sÞ*ÊŽ?Ç!FÚk¼BH4ÅÐIWrP¥Üåâö€ŒŸ˜È¯ûöeoé#49èœG‡åQFT–QjÞw»ƒ·s š”e6J>Q^+MhÐðá<#h¢ò~Wú®èsOh–á&âQÚ7Ívû£ …²ûDpM:À%²S3¡Áñé »<þC-ÈÅÓÙ÷ÈFí|?gÖ1MŠÎ•àÑ…ŠžHÌV›ÅIÄÒ§KʤêΔғ:¼tš˜3˱ŭz¢ƒz·â‹ž™:‘3Íò$d*æxŸ&–ÆBìéû¤?ä’Ž÷û棹åˆ[UPÂsÓvKÊÔMP¡[Ç)]5Ïä–¸E'aGÙåNâ€9Ó"wøÅ.µbí¬sÔ»“±D-5K'ç ¦å8ÛÒ—9Z¥GM²'ùE壅ÕpâåÐô<»—±b4—ç ó"3qÒ0?†Dµˆ<õál–,t6(ÅÂ3ÏNÙ0ÿw»á„Î¥bÏ µzÀHqç;Mj ÏI Á®¿Cz·C©ŠU¾»YU‡xÃÎ9T!û°EµYE¾î¨øN Zz$åOJ—£É#þhà Žp?>¥V¿[ýÚšŠF£qéûkªÞ3åyf€³µ¦óùl†ûú¢¥nµ¡E@þ8t‰|á¥={ …™Ÿ`Ìx¢˜H[G † ,®<¢*ù£ª:rt.»†œÿ\jX3>øêh鑚ÓSOÊCWiöeÓYÑ5éûÙ˵ô^?AQ¡“†•ÏüªD¦ÙœîIбBW~ÖAÅ«-I{0´ñJÃðzbK¼@Ü Ìœœ~v‚±€Þ£õx¾ú;tÅ,}÷ ¢ÚΡŒ®RþFNÖ¬üÞ±ü«ômÚâQÑl_9(TÓì1#^ Iˆz_¯|ÐV¿ŠetýèYÍ€ô&!?þѳ®0knPV\Ð3š.Þ ‘ÙвÜÊ".™0’AÁom‰Þ>=M(•ÎUKV_§æåÊòfFàµáÂ×~TÖïõAmÙòœÿÒ7­›F‘)ÃÏ$.Ýõv¥¯”ä–52—,šþŸ_Î-:W§\õ‰¿ê ¨þJþ‚²¡Þj£Q¾üïçy2ÏõŒÏÀ*Ê/XšûÃÑ¢,WÞ®÷ëÛ[pH\—> ³¡'Ëaš¼hP>&É5‘ƒ èãâÃ!ÏP/³äEBÈ™…_£)¥Cã,úAÌ’ Êbm³,,&b)¡ŠGŽž'ˆYò¢I*JrÙ”ÇßáŽ@9Ùy2˜%/"É…û-¦ò-‘P}6KáÉ¿ývŒÿ0É…_6™á—~G2¡úŸIb’¼d`–ýt?¯ÿ{YLæÈ‹}R uÊÿŽÁ`0 ƒÁ`0þÑŠ{hQ‡S>IEND®B`‚ IHDR&–ÝE³(_PLTE¸·ÇùûúéóðÝìçàèæðòñþþþýýýúûûöúùñ÷õôø÷ÐåßÀ±h®™|·¦«ÏÄíííøøøúúúüüüîõóâìéâããáââääåêëëØéäÂÝÕÕçá±Ôɺ×Îc­—u´¡¿ÒÍõõõö÷÷¡Ê¾…¾­º©±ÇÁÏÜØðððn°œ•Å·ËãܮĽб¥œ½³çççéééãðìóóóz­~²£®¼¸ÚÚÚÜÝÝßààÛáßÔàÝÈÍÌÏÏÏÐÑÑ××ב¹­–±©±§u¤–•½±ØÙÙ»ÊÅÊÊÊÄÅÅÇÈÈÔÕÕ¿¿¿Á¼½½¨ºµ‰­¢´¾»···´µµ²²²ºººŸ³­°°°u©™ÌÌͬ­¬¨©©ÆÔÐçêêÒÒÒ‡¨žªªª—ȹǻÁÌÉl©–¡ª¨j¦”¥¥¥•¦¡§§§r ’…¢šg¬—ÀÄħ¤¡¢¢€ –ÇÞד¡‡»«ª³³ß}ÙytRNS@æØfÕIDATxÚí]û{ÚÆÒ&NpZãH¸ÄMÀ(¶®1l¤ž á$Dˆ‹.¶Á©rqOÓ4Mzú%ÿÿóÍìJ aì`÷œ'M<ïóô‡àÕÎjçÝÙ™ÙYÕç#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Àpeîê5¿ Â…{Fø‹ ÌÏþžØsòŸˆÀÜõÓÿ(~7Û$œõÇ©?_ù~!¸xC …ÃqÖ Üœ›»1Ä’?$žWc‚GìŒÏ^¹½´ôƒì—=7QÎÿÄ?·î„q¦½xëîyfaú§Ren!™L¦–ýþ´ŽÌ8Ò¹{+€U†…{kwîÇ2!Gݳõ xÄΨ¼›7’ÙõP(ˆÂMfûõó$ðcrõZ8„ó=e†6r‚Í: güÍûûÕ è+»™/$2éðÙÝð`%éApa9Z”Cqv}yÅΦ½›k@“t±Ì/-Mæï&Kk0éÐIm‰?”¶Ša¶Ž.: §ýíÁ*êk»¬¨ùŒ˜mò&Á(Ùõ²äO‡"3ëkBìLêCšlJ‰„T”ÃÂߦÉWÊ“ëw’ÁÅŸœI˜˜ {ÉÜ¿p…ÎZðgM©J//¦J¹‡MW Åðlswm%LUwå¥ÇY`JöI-#Ì8û„ؙÔwsÄÄÑòË3'ßM€ ÉÒ†êL‚`L’‹÷ù::øM„ôOO×*FݬÔâ™Ðl»Nl%™­6ŒzÑjïî!OžÕ¢0òÀLÀp¼bgÒ_hRUt]‰KéÀe¥ÉÜ:Xò­‡z9š˜\ÕÈ ÔÓ¨ÍKé3üóvúŸ„p±P®˜­º¡Ç3òŒ4YMfwŒf§Ûëvú€î£`2X2jÁ/Ïæ (Ö7;“þ÷• 3@—•&רn½oTjQÉ«.4&°×ôšZ8K“¦‰¢™ç³&«Éà£z§wpÐëôÛívÿ` ¸k4ÔÄŒû–0!v&•#Mv*¦¡)yÿÅœ“o€&J c†ÃN}PÎ{' èe`Tô¨”>¡ÉÈüüü•“à™A€FW¦'(ÂéDT×°Å0µcïû|*Ò¤Ù=ö:íVÐ<Â6 ŸÇœ0¹óWNªhâëFÀ-Õ-h|dÔëdÖY49•`Ö? ÷ylù¨S×T9aÆŒz«Y×”BÚcÕ…ù¹[ßß½û|©“B0ËsssW&gÁn´ô/%_ ˆbXš›óS(rLoèh©`ÇÏ£x}î*ëXÿéçtDô.w¤I®Ù[Ò4+–eiƒn6|Ño Ê.7X¿s Þã/·Ø° Þ„1¡Øù¹«?Þ½{·/@êx<¹¹[uÛéõ:¦ŠlœP¹0§PäkåIäGäB2ùøeǬyb0&Á,üü³–Ç]y„ù[Kë%;uqã~^)++¯® nv¥0F‚©WËjFþùÎʦ?Y¸½ºrE×¹82þâÍn¬yÇ«÷žƒVÂSMÚ]`‰a•Õ˜ª–[) I§m6œ ZÍ_½³`n… .½Ô¤Øë8¦H¸¨Ü]°ìeÕÉÄ0<À|p1˜*•R¹rÞŠx¨{KÆÓp6‰¾Ìß…ÉÉ%“¿¼8hjnïIöI0ùøßÃnËŠfÆ4ç–rI;ƒ$Ø(Kƒ$FÎi¦aZ£…çqõ5øÐÆV=„-©;ùxÞ•çúîö«àøÐòŸ2i—θ5é-,5/IR" ÜëtZ%ÁÌ0mî®gp÷jé;ç“bY‚5_^Å'²ì‰êý„,ôª;wh${³r§Ód$ò[ Éõ;è‚ÕøõMÇ,Ò#6 1É=Í&ùí-Ì·ónâƒ{`dS[;Õ­ÃlȤՓ9'¤ ŸDh¸Ê•°Q ÚÐÖ1K%Ùé0®¯B¾Ñ,Ï_€‚S¸lS[U»ch¯\Dá4é÷[•2Ä6!Y–Ž¡MµÖFÎbU\Ò–û¨ráçqL¬ˆnšŒÄ²«º”*¡Tþ€–—üb[%è†õëï¿ÿúÎ7Ÿþs{Θ ŸÙ“¾ ŸzØÞK&ÿxw€FÃ1'̘l¼O%y÷fدŒÝ®ˆÅÝår­¡ Þo–pf·!r~®F1÷Ẩxu­?WY£}h”]¯‚JU5Z˜ù@}=GãøO6ss7‚˜=;®):xõíWr>1Ò£I«ß®[è$b ¶‰ób€S±ä*5Ë–\<ŽŽ&IJÌÙ:[=.+5½²‘ƒYÑÂÈÄEBEev¶áÑÑÜ7%ïMòŸI“3xò¥Õ~^ÌVj~øÌÉÛþ@™fLÍ- ÉŸ/á ›&º,UM­iÓ„h£½kq1™,=µ<÷‚[ú+ltßiÔz†X”4KÇè:bëK-+Ñ?é½~š¬GË Í`·v·' Й͇&¦ÅŒÛ•` ƒ{­>ìBzœ †ÁÊŸ«:ô]lïaǰE¥YÐ=)6³Ì &K»KÓ* Þˆ§«¾ŒmãrF49úóÍQc*—+õYšœRàpŸ¹–`uÞH)kبÅ4`¶!M^t zU˜JA_¥Š1€‰OƒB,À#eÕ7Û˜õNny?¾/!MJxžS}òêõ:óT³;&ø´Íú&‚x5— ~¬q¹öà:9Ü—´2‹}“b<5Ôétúm.µµ¯òÌh8G>`Mj¸é½±­‰tšß Mîc¢µÙûðV݇¶“9çÆ¤fôa’yÐ7œˆBƒàÖ²¢™¸XM£¢aö¢…¦â—ã„™Ðhñù¨‘Æ=›|7„©c– užÝ6ꦦŠa~ ú=V,è:ï×Ò*æ{Xæ†æ„©F]($¦öM0&ýºÆè‰rSÇ®ÁáF²]nÕ'–óðŠe49ì zý–9À':ÙdöS}À2v S ¥™orptt€V¬à—g÷M¾š`Úiòò7 É».Î7šÛ˜˜ýÉäãaчÑäÁ ,zÕ2@uCÓËŠª*5m;‹{·:@h”ÝU-ÓÓÈ€eúÇ`I¢£ìÐÄlÕ+,ù;·aML KŒJ£À3è¦ üFy‚&àe³¥Ü†,A×7K&w“Ëmq¹JYG¹‡Û¨`f¼b‘&ÙG½£·/{}³O(J}Þ°Éh„íÅ€¬‚û¶×=8è´µ8:9¹hò-$Ø0mRZkvŽ^ÀÜ5 ¶ÔÅÛ̘ Z퓇GL,"Ž|!ͱÎYb)Q,…¸j¬2ša†.-zùFÚA¤ F×cšÔ›˜÷‡ÅÛÁdj¹6ð±~Ëì‘D!+CÐc1çĦI0øøwÀ¯‡{¹í÷†Ù–ôë¦Sñ,Lcr[v'…|Ti‚yØi¶yðˆe49ü4|ófØmUj±|¡P°ÐYkñ‰@ž„ã¯aÍô»Ý¶Ù·*ä;M¦óäKkýÜÀ´I©Ýìt»@ˆà f¾Ó‘ Ö €1i6?_öûM˜ I†·1¸¥WÐåÀí[*¦™Dy›Ó¤‹4‰°F5l,±3…‡à8¼{{IJxcš´˜¾Ò¸ç”ÑÔ¡ß¼äO˲œöK…¨OQÔ¸í0¶?|ûvØë£ÏÓj¶‘%l‘Ær%Ð “+´*¼XÓ¦ë³Å2š_tŒ‰Q‚ ¬ÑÚMwÀeizÛÄpíõÀrC³„ÓÈ`•ã2ÝëôغB“àN6¢ži3„5íüLÆÞtÞÀ¦Óá¶1а¨Œ±Dp .6>œ¥;Œ&-^(qÒš‘™B“§_aú¼:…Ý>,!Iº-¡Q¶‹ n×38|ªœÂ•Àh"M§I›&MNK›l M 6HX †ÃÞ>ÆÀ˜ŒÇyIh)FÜîqÒh²×g«~L»hÖ¡‰¨®À¼¶'h‚1Õ©4Ë‹®~?C4}ù „Ìì‘+@ÅÁäŽ^q 3CgÑ„1<àÿ M.ë¦óO›0Ý%2ñ5<'Ëᑱa*™ÚGX‹- 1Ùr“nÀŠÝo»ÂEŸËº6A‚~?µ¹ñw–ú÷¥$¯1§ø&b‚æÛýŽ&?póúøÒê脸ÏÖ~`¢Þ™iäîz6A¼µ‚%$Hý”MÇ´)ä¦IëBÖÄè·F’‡&Ò«¢‹ LsfYÜfQ‡”Ž­ƒúpÿá+T¾˾ô ³µþ°$˜_bG#Vë¬.z¿íF°…%3§º°¢|?–lÔ¯óн×dû’·à*$hœ 9¬“].×ÖB¥Ö-æ“ú§F:ã fšðR,aöH盥Ékž6aê‘åü«=Üï€ÊyÖãÃ\GÄ@“@a-‹à•Al®ÿ•ÂbÚq@,Oy#4ålŽæo¯ñh¤×™–7~ßC¿i;:º‚-Ü’eç>ùY4ÁñNrÝQ´.ˆ7ï`}Bðbßùi"MØIK›àp(\ÔÙqÿpxÐåYæíKãˆXL—Ÿ™>ñ,v”ùËཤÜé5ALÇð0°´ß®¨9,g,œÕxÐ:쵦$ëÞ/<Ò´ _ÜP®Ìý¸‚U+¬t2™…&bZÁÁííš5L¯ âü-¬ˆû¨±ƒWzmvš¿ø.%M®åxڤŠ6"rô5ÙxóÂðD,.{"bQ–U¬D«n›z,«=G]V×ÜÉzA eÊ›X¢˜z²aV´¥+øÀS¬îy‰Éúi4Á~±Ô ·[o¨ñ|ô_K¯˜˜r<žwÊeϤ ¦ƒeé9–!e÷Ÿ=,Çâêý»x7=wŒÚÌטš¬÷î0Ÿ¡IÈwi2J›°Òt1\¬àîŽÙðN[nÑ«Ý{táb¡RͲ¢õ'ë¯VP³Ùjã™ûèݙҷKü£üÜ?õäþ ŠE`oš–û„ØÖÞÆÓ'`©V×_¿^`—ÌR›µr­æ=ú;ƒ&ÐIþá#6¸ÜÂëõU6¸ÇìÖq]sýý š\FkÂÓ&uL›°@FDsr¸ôÆ.XgRÔ³Éì³Öh"#²×vK#³‹Û5½ë*$ˆà²ÎÄkïwXu<:Å¥ÜÓš^Ï!ßzêMF'úô…~³ãŽƒø”¥±Œ N§‰uì»·µ«±B»Q‘G¬ÏÖØWïOcš´./Mæ—J¥½µzÛ a9Z¹þÁK¼šÃÏE„hµ´·]¯óV¼û›N¨V«Z:Ì"J¹í‡º5è=þõñ¸,‰UFu£½¿wøøñans­Ñ°0T¿Ë’âOJ{Ïìú {$¡6Þïï=ÎòŽKÕ5xÈ4M^˜Š½Â#¥*èܶl'i218 ÉÃFŰ+ x5·G,Ä÷¥­}ÞŽßûÄN¼?!&4b“ 8›9_Zé€ˆÓ “f_E[³êý.»ù¯†ýù²fš›&>1ä/`ùÚö§ý'»Ûï5­20ëÍ~o8Ä"G•§ç±‘Oçu­¦0ÍO…|À#ûF4F‹´0 MD™õ[ïúôdswûé@ãÅÓucT¦ŒØ£=qç›+;Qøà67±aÚ%TXç›ëBR´\¬”íøÞ7ñƒ·Ñe¤ дiOšý9 }×Á9 jc0À¢c^83yP««ÇSZ¼èÐÄ*2ç’¦0¯êå„äSva=Þ ¯·Ž’ÁÇXsj²üú›Ñš6¨èª}Š3Ù¯ÉúÅB¸]2àh¹›qrò=°Âk¬•ÇbK‰Kì(^±À \±Ëõ-ÏOœ&ÞF—’&0š…Åë,o‰»{ÙÒ´ZÌùkÒ`•†Ü,‹¨ U¯8÷$ZŽRëøi¼€qu1™Z–q…_—áDy†®I§ÛÅËŒ&h•t ëì*±ý2SÄËIx‹p £åõÿS|¶»üˆŸvƒ†’ç0|^±è‘'bµF£•ÒΗtÜ?ñ¾']Bš„ü‰¨RS¢»Œ½Š|LQÇßNCÅD\UÔñ§pİœ)ÄÊV…]»Bï¡‚‡ú œû^¾»~'ÌÝÏÇcJ­aU¸ç ÞCýÔî°sÛ…¢¤qå’ £)7x¿v9ICaC²õ•Ê–Ëj!ãOQð$ã‹ÕìÁ±>,ü>ËèÚŸ[,ØÊ´Tˆ*jÔõ÷O¼ï‰F—&h<‘·36+Òþ-ç»yÙ/ ׇµ`Ýa®±ž`aÕG, ˆçY#A¼ !ÉÇårLU¥\Óu½q¼‰ÇEï›ýö¨V ø|¼‚‘ƒ÷Sô8ì ѰS´‚ø5ñ‰É½'[œûÀ’v¿Ôþ;ëÃ)œd¯›(þñç$Ý?Ùãò6:¹ÕÅÌùÒ:¿Ä\Ìð+âöûDÂrºˆßMüàÏøÓòø3}B'.E`ÝGOõÙ-rl$òR)Lm›]‰FU¥1hcJnqÍÄÒ2B1}úì ÆÑFÂX'gô‚žñª¯û^ J¦ˆuHÞÉÈ7œ‚ƒÃÛê㯟øØë8…“Pº˜ayÞQ㟜Þ>O£ÓhâÄ©ÄùÒ¿pæeY>í¿DÂaþ¥\ç‡@˜7qÓ+€…ï°Ä`‘I¼^7Š$n¤XöÞZÝ<~úú#f¼×,4ubOüOö¹êEø,¢ŽxÇž§w–S „˜”ÈDBÂóJœ £><gbî7ƪjÏû~r]´}ÞFÓwÏ&úªYÂ& z?)4ñÉiA'šðÉ Éi0<ü‹%X ?j‘ Ë‹ãLKtåž²ÛxüºÓ/4u F¸dfÎX¿ø©ÚI¡Æ˜÷ÊúV»ì#0ùµsÏëØ/çQ²ý“[ìd£‰oÌ0Ã/—R#˜˜cfaµÍR–3…ßϳØÍ^W¤}fÇÐo`ò›Z\|p„ :*¨ s›ea—ª»kš6àw6­¿º(œ/ý†„ÿ0„Œã‡xv1±‰ °³¡³|Õhr €É–hMãÙö:˰5lhzÖO¸K¾yD0)§`¦Œ“3µFEWlè –|ûÀo–IøEga v?/Z˜ýÿŠrO¾ôËþkÀ œ“\˜…m4ôZ?ÎW”ggÉç¿ÌKø€Ÿ*ðK‰|<Å¢ñ|Bòˡȹ”L,¹ ÀœiÚŸayüL‘%ºÎÛ‘ä2ý¡ÞÏ …MtE.HÇ@ Â¥Äÿ™¿[¤W¼9œIEND®B`‚ IHDR&–ÝE³(ÔPLTE¸·Çþþþýýýñ÷õ…¾­.’t<—{Ç»øøøúúúüüüãðìËãÜÇÞ×Õçáh®™¡Ê¾íííðððóóóö÷÷œ½³c­—aª”—ȹ±ÔÉØéäúûûÝìçáââääåêëëðòñõõõÀ±Lœ„u©™ÐÑÑÔÕÕßààééé|·¦çççº×ÎÆÔÐ9”y®¼¸¿¿¿ÇÈÈÒÒÒY¦] ŒS¢ŠT‡B™××רÙÙÜÝÝ‘¹­¿ÒÍÔàݱ§¼½½···²²²ºººÊÊÊ´µµ¬­¬ªªª¨©©‡¨ž\›ˆ–±©ÌÌÍâããÏÏÏÚÚÚÀÄÄÄÅÅ¡¢¢žžŸšš›¥¥¥sœ~²£Á°°°’’’•˜—[•ƒ€ –4“w¡ª¨‹•’§§§“¡r•ŠÐåßîõóO”€àèæ«ÏÄu´¡‡»«º©•Å·n°œb£[‹|z­z”çêê<Žu†ˆ‡ÁÌÉrŠƒM ‡j¦”•½±ÏÜØÛáßÂÝÕl”ˆY†yˆ‘‚ƒ‚ŠŠ‹´¾»‰­¢ÈÍ̮Ľ¨ºµŠ±¥»ÊÅ1’uo†h¢‘Hš‚§¤N|•¦¡u¤–‚‡†„—’r ’D“{±ÇÁl©–éóð…¢šg¬—âìé^€ª³³Ÿ³­àntRNS@æØf¾IDATxÚí]‰›DZŸ‘,M`$Á+ºvÑažÑ²°ÒŒ4#Œ£YÙ„ ¾óÈ{ëï%õyÆ8~ÎõϾªî]+‰õ:ßg{·~ßDZ£žîVׯ««ª«{@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ „} QôxDñ»”wðãoöû÷r`áìn|ýÌë{ÆHžÝ· ðH’$H »¶8…½4ûìs‡î4·[Ñ‹ÿ&Fÿˆpä(ް49Ît·®TpÜ&¿.äWš•J>“Òù\¿MúUÃ.«ë»ÖH“µj»»±1@ž^‡¾Q¶òÑ ŸÓ¡½4‹49Û/WKõV6)í&û'âÒäê¯l½RœlT&Þ³Š^RÓ î ˆ»údô1ÿŸ?‘+TJå²R/fC‘Ù…¦ !MŒÎƵn{–³ökèàõˆ|îr°ƒ&s›Û..:kºm ³¦h2—û&ܼÞ1”ü”:a^ÁyͰKõŒìû„}÷C‡~ãT‰KHÜ  ½ð<85†H2žIWTµ>±ØMU,±JÜq––¼Þs&(“nÏ(—l Ÿ×ûvÛÔëÅxX—ÊDçæ7;Þïgá• 2µ“žG%fÖ´~¾²iÇWC‘}B“·8MÎlt4uRœàŸ´;mM-Äã/ _ü…c+Nèâè;‰dØüøñ7ÓBq ù^<þvøÝãÇ—þd•–—–Ž­çó…qÃ<‘÷|¼âµ÷'BÍ 5£I­;èöì’Ú̧šëФӶûid¸‹ç>p;wã¬#2Ö©ÉfÅGŽ,G ão~À›ýõÔ?bÊ‘#GŽCmgVÞ~{å\¥O$qæÒdå0 ÎoàÏlôJé‰åFç&|ðÛnMIç’#Q|v<€á[ÎŃðï©PÅ:ÉD¡¥ÓYùüeP ð1Ë™V ýYG‡‰âQßdô,.‡¸ÌØHsmÒé¶A½¢±F´˜^AštjzÕCÎ …GD™l–EÎ’¡ÿüpôÆê/³r‚wû4¥QÀJN°nÄýÈ“Sðõ/žñzÿk««U2rxÈT&Á¿ÛºÖÖa=é™\˜·VWyðâv: ŸÈåPªg\¦ ùîd–1J•ËÊÁ$ÈëN4“idƒŽ _Xu$åVìýð¿cqGf0ÒŒ&àèl–ÕV. åÿAã©ÓéU+-9ì´ëuÛu:†’þ¡o–ÑdIþ½oü[) PÈåÉMÊj!&Õ5› â~ä ØgÞêà¯?ÞÝ¥12ëP™Ôá¯?ÞÛî”›Äð&ˆ¥cMÐùý?A®| }Æc/~>רÞÉÒ3ëXèþÍ3›y ­h6ȸ4šÖa>º§PJ+Ë/ç몥|üà,Ö°r:sd6¤IÛ,5£A¿‹Å ôtpU´ 諺,áí*¼Ýój5€k‘MÜfš¼ íž¿ÓL§*ê}lt­YˆÂ Œ'b$Ì}*k°½}­c”šE§÷ß™'?´œ¿'0l¢]û_T'r}¤N˜2±^š|¾Õ­Ö3Aw9Â|G MU)W5Û¶o£\àÏK­r’‰cv¾wBšmü~~°Tô®~.¯ éTj=‡E]‚,¹SLW¬¯ø‹‡(³:pæ¶Kfl£ú9U ^Ú¶µže4q;gaͶMŒÀ=|5Éqá ãÍ¢5“ä´{[Q-KÑá7à…OTÖGöEI9 üþËÝ{÷¶½ª•n°Åj!Oö#MÐÉ´„Ñù|`XëCu‚ʤ©¿ôAšÀräxÄ/ ìRéŠR¶1 xt•iäO4Œ,Àûh`¡‚Sa|Éʬhšn¥£ÀEf$\¬XV½Î, â!–ï4X¯:¹}Ù‰žMÐ$ºç-fÉÜÔÆ´ ¶ë{Ú­Úf­½«!OÎZMX¤¸+4Ù,Òm3MÓªÕª>¶ù:ðJ·RN›¢?Ï M¶?ÿüñµŽ­°Ód?.:6Y3÷Plô˜)ÈÔ S&ª†4EGß¡É*„ªk Ó0lÛ0.±±þªÓ³ûù(¾ˆ…NçÝB¶ úä –¯¼×VܡɃ¾®[ymñÆ0rÄ04ÔAæë¾KFmØÁhrþÉõ민òþ±ŸçÄÓM´MT¨Ú=âtÎ67k5èÈyòHþ‡–3o–½Œ&¯ôÚívû ßæ<ø¢Œ3^ iÚdè˜.¦‰¸Oi‚Òèn£:¹Ž³ÒQ'L™(ÆWðå‘GŒô¹‚¨mÖ E/ô*®;Þ?\ôt`Ñ,>šVË’¤ªóB8õ¿Þt`À(ÆÊ®èš&`ÌCÄtïr¡RÒ x…Ջi”•f†-"Òd g?Özàé”Gí.³v{¬s¥’^6ÐòЀ'Y&^·Y…5ËiòëÁÆF·SÓÊ:¼Q†òO ±ƒò`›Ä.¿7¶·îvLT— m“ùêä‡ô÷Ã[œ&wÃÊñ5Úh\peR® & Ïºã¿:¹ ê SÓûj½Ù¬«ý*.;¿ƒqÔ*EZb…6¡Uá…Pç|½µ=@ï:$1™_©†^& LÖZuÔ¼¢@½©f½Â,Œ2ª.âišœPÒ6;f¬$¬ÝµBE76{5›wªÀvi°Z0õ0j¶åÒäl÷îööFÇÀ7êuõœ×ûZ͆`; ÔÉPZ ˜UTl¡žÎuòC úûÃ&ÌÎ`·G¾Ú¬ª…,î¯seb÷:8éMÒÜh<„ff½d#KJ•|¡˜É )-ÔÏÁÆ3ÔÐd¼2*„4y¼u­WB”Éë¦V3ËB!D˜Ã7Rý*²¤¤¦ð•L¦•®[J©„–Åš<\[»y¡T6@—€2Á¸—ÄrŽŽA»À¨„µ‹U@Õ¯™eøh9›U °iòÆ`ëñö W¶°ÙâúM NϬâžT鉄`å¯ôº]°LP¯…çÇMÐ䇖ó÷êéËf§ÛE½ñvÏ`¾¦ç0W&f¯÷6ŒqŽ£ ~ð©¥Rµ]hde@6Z¸€ÚdH,Tw 7Š…r™ôj73)/Úž)\-X…hVƒrØ&¡NÐDà¯l2饨‚e œ=e‡&ƒ»°ä˜ÌÍî[j3]äÑ|N“a»n%Ð.~xʼ5iMlŸ‹¹rÊ&#‘S±'o¡ß|õö}¶ ø;.&>t›¯o»Áz(T|ÀöçnÞ/fƒ/œ`en…&"T‚9ÔÞ«ß~œÂÜæÀÏÙJw§¢cØ„©6h² Ã&:Æ $0 VÅ_¶îÝÛ˜L™x¤$ùÕÐ#f§æøFíÛï/¿ÈN:ø>j"¹;[X(–Æ4ì1<ü(…oýÍÔ&ðJ”Åm@w}ùØ‹ì™÷ÖGùf3yÊ‘4™±Áû”¥Ðz×Þ»pçCÞ¹û•nÈ fKJD“½€‡M&èCŠS'¿Ý¾÷xÍ VO&õEwŒ!’̶*Ÿ\gÀßNוñD Ç‹õòŸG¥|ï×›ÖI¯÷; ¸6áõ^œ8áõ}ÐTûŠ¢¦ŠÙa"ÁBš°JNNtnõ¯À÷ÙÆÁh2e­&,l¢a,#…‰T'l«~ÐÓ™2Ä0óˆM<ò†ymÔê?Ÿ¸õ|©®*ÒäñvWã4B¹BE7o¿Î’忹lUT¥ “û[[½‘§s¥j‚× òy½VùöëCßzð&\W'Ó’ÖpϦ?‡&¼’Qç¼K÷+Ë´ÔJ`®$#ü¬Ï¨Yvî³l ®*ŠéGÂ䓃H)™K[U¾¤p]‘+X6¸#xÐï‹øåLSÑ첕æg0"a9“·ÊÆ£/ŸÜ>yé‚eáM³=¸fG»ìDJ¤°ÜH Ó´«˜;¨—«6¬g¿Ã-{…EÁ¡éuµlcâÚÆ  x½›ßÞ~òåÉ›ÿ*Y}¨Ø0ªÒ,:ù&ø ö–æfª9“êWGo@çn^(YŠŽÉÓ¦÷T0j²YL¢zI³ãÁ S •‰'”&0ëñ¶á€9-GyÚÇÐ1 iU/ëêzŒeÉz0‰8eaž+f­V«šm°ô n·ãdd,50ƒ)Ó<ÿ™~»±Ñ1úlO ¸V])—­TFÀ”éQ½›¼^¬¸†)£”i\Sxo³ÉÂ`ê$”-6ûevŠ­U5èÖQª¸G†ÇšÅø LhÖp'sò¶2þD8˜4‰Ã¨ê%5åÁÏHFÏaóMV ž4-…e²dj @Ö¡q0L'¿Þ`s/ 9zã„k¥`Ñ`‡°„ö%¬PÀ%LËÆzh¥´ÚïƒÏu¨UÒø¹çà†¦[Ì4Ašx˜"+•0í]˜!VI"[LYœŸ첂,áGPÇšÅÝ0z×+ý¾šÆJM& üŽ ÷Ét£ÂÎ~Ì{ò.…ºZIaõÇhUóõfº˜s¢\P$VHÕñ$ç —gºÒ×ñ`‹Á’>0^QXê: Œøe,³žªà)Ð °ðü <Ÿ'›c‡%Ü–0§ÏY±z£ëuKg Ê©Y©äGg±Àôh5k‹æ°“‰¬Ó9›×Q.YMv¦Ó•ù°ÙèJ |ºYÏã×uj˜xÄ™zrðh‚š¾Ñ¿)f™L#><Ùëaªažð›«˜ŸNçÓ…h–zk|µÖÓùf½¢Zõ%`É™š=vËÛ $åÔ‹ŒÎ°²z‹é:¸7¬b¬9ÏOv²+Yñ•Xz Bw¿Á }‚_iÔ¹¾Ú\Ï`Æ#ßFoVÂIÌF‹îÁs‡hcœÉ4|2‡ûœ&b$œs±ælðC¡ž@8$O\›*ñLC9^ ù“@¦Ö:’¨×SéB&CäœBÒ›è]ÈyÖ×?ùüt>.–Ù±“‹ ò :Œî¸Jþp0+]•J½™_oE³Ã³Ýl½“³¹ÜÄm‚3x‹¶ÒØ9¬YÅÓáù×5ËŒ±d0žÅ[ †Ç*ƹ“iâÉ ,$Î-ä‰àøåªRÄÆm”áŸxJ°LÃáÀ3ìX4Sl3™&Â' ¼L E’l çüÍû*´Š§Ÿ‘y¨—•ªÙn¸€[‚õ&ܦ¹ˆPÆñ\êmA͉['Õþ¤s7é8×§à‰„Ýα:Ü{(’O4‹Ìä?Îh=r=™jpFæ?ù Ž»«Y”ðÂà±+ª¯þÐ0»;³ó¼÷™ç™Y)Šˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆhkéto»DÿœvíÞÓ±Wo0M`Ä72£Î¤é·ØÜ¼og—Å`5nrºj ý÷þ`5÷ÐLç1½Ýa5ne±õ:~bÿþ“§Nž|øÐ¾ƒÁÅÖÝ‹A˜ÔK…\^óswhú~5—ØÖ¸“ÕSu몱û}™D"iY7ÔcPÛ´Öæ)ÀävM–Ð…·œ#˜´tïG„ÉüLU M¸!©Q=|à ¿>¸[,ˆQm0Â2øæ³¯—÷þéhÜí™x¸ÿÜë€0Ý»¸Çéõz§¿úÈáNžè:ö*§t”õËïN_~E qË%Pœë€‹yùK?ž9ÐÄi«@ŤQ-HáL²’‘ú8ú~šÒ¯t÷¾Áõx»þÙI»®}WÑ®Sgû£8!†ƒÎ|œ4cŸœFm¾tá/îvÞ¦{o÷þÓ =<5Òõ°¸݃qךɷþNïã~‹ògäôÜâûü)/>–á»÷BíV•´]Giš†êÐ0øÊ´õtÜ; ÊšÛ?tšM/rìÿüÜÈUÚë×;Ùîæo?/ÔåPÊnÔÎ9ðÐËP«ÓÉœ—ûŸ±½_ém.·65wïÜ”sN(§XîéÐÞ^~´b‹M:ë^§÷§hj"¨ÍÂîú¯“<ØŽ¿Õ}‹®èKS6wËÚ“bQ†p$f·Ç’Yîn£TKb8×¹÷ÅÕög¼ã4ù¦ÝÏùNþñ—)D#¥{¿‹vî=ú”ƒc:oAmôâ`Êf÷àJv}ȶ»c& ð6uÏ;ÍÉêÍ›ö}Æ>qŸe,–˜µõ sÞñ1žyðr²¶àø®Övv •Å\ó±—a†¯=cTA¡¹o/˜»K,‹RóñC/vur}ý–åòh˜`o‚1Ùµ{ÍòöÃÁƒãÝ<Å üº4Oƒ0™-àÂc4:¾zʦ_TKrü¿¹Å0Ο†Ê‚Ô¼ Àð7“ñXkRew'-lAy¼aréLÍõ> ‡¥g€åžIàWâž×èù'¯^-5r‰lÐnm.“͘ô²Ï—Ÿ0̃'%1¢Í|íÚÝöïI&Ësá@Ì€Ï8|Ô CaAÊ)òØCxYçåD%¡Y{ÜJy\NÓ<Ï=Ë…’8A˜Œ'¢¾”" ô&‰c;fàbèà+·§º+Y`ȸ“Œ2F4…C3ÓõRI|“¯?éeè§CZ=õ;4›O¦Z“*!±€ÙutÑÞš¿v, ˜Hµú0›¾Ú>Õä‰=B˜,&²œÐ"ëí(y9YƒÉ‘[ôú«ç0êÔ•ÖØø Þ{U›fþþd¹XÎÆ¬è„÷vw0ÞÓ_fÊ’"@Õ)ÕÙ鱜 è!Ê5îÛÃð§2™p^‘AàeÚ#R9‰rj„I˜ùâ["ÇD?=š ’zðÜì0ä¼"b¶0I€³üÜËò}#€Iab>´Ÿ¦¿ý ×ÍhþrI¦lê¸Ó‹ûöN¨¬&Ë~H׸©‘œ`×ä¹>2ÿP6ˆ‰2;b ÀdæÕ¯ õ¹|eF“í01órwê³ó ±r8‹3NÓÁ“¬sPh L&çŸÞªD<}íK4“JQ²\«¿€˜"½ D2î6C`⥿Åå…+rcŠ¥èû¿4q"‹1¹™ËxƼ»—éÜ›L¨DÕ¥VXžAÀ!_ƒ0I?ëë»6þý…CJJ¥ZˆÕýõ'Ó}4S†zš¨¢Âì4&‹•0®oPB(y¶œPïÏ–Šs…H®ßgÓc""„1 !L~]j4󕔆‰Ž`²™á{†ï«ÖŸÌ³ówKùdÜVÚuÑËåëÓìߟÔç„HЃ¢#½lç^DA³P“ò¢˜Ïý2L±Ï_Õ!‚±œ {é!¶ž¬ r1÷ìû|¡Ñ„+8LÀäZ-—û©ÿA{ÇØøI¤Q’GвŽ <Ù2¼Œ€ã sb†{äbB“À™0]‰2nGµ£ÖG3éz8 n ¬/Üâ›R>ìƒ:&ó/ëõzµˆ›\xI§_ÔÊê4ÉêÊÜ„Agyi²¤„}~—ÜL¶Àd×?À¡— ó =SÏ¡çÈÃ#e¥1Ã>xÙhŠQ?zøßpÒ}‰p®Ð”sb8”°B†aeþ%Œì Àäë‹·øÑþ0XO-¯„Â#S,ýà×Ù’”ôcLøQ¹&…}zîàgôÔ`HJ”|9‘©T28ÐÀãòg€Éš…\÷H­YªÂ#^ë½#ÜŠ–dª äÕv\Ydç_( uz0Y¹RSʨՀ =óbvy¶Ñ”ʉPF|Á§ûšRÈ‚+18¢§èù»õÉFA¬´Æ,„Ád&>eÓ£ÅêäËyHx EHñòÝŠ(7~˜ÀbB2γ`f!'d"‹%é¿êevrwJ²X™@c«ʹô‹¹¢ O‚«M Ád LŽŸdŸß†ð½…iÔàYw|Õ‹Þù)…Ò Ï­T Ц¹kCyˆD¯pSUYíÔ÷v÷ò+ 8 ôžL3:­@;ÛÀ˜œÿŒ{&Cy.‘m•dž:é™…Éj®²“ì~zø:ÔøÕY-(.^e^ÅäÕÒd£TD‚8$áÞæÐnêJ®ÙTPj@„ÁýèOìƒ%hš\ 3ñyÂp=j“ëX'Â$ךÍÕ^ýµÿ^Cd]ìîd¦i›9¹gfJJ" vƒ !‘•1ì¢Q'j˜€÷GÚ­­s7$WØô‹zUF˜<L®Ô(µ\uÝŽ½ôýåFIڈɟOãÅià,«ö1ZîÖÊhŒI}ia¹^šCéu._ÎhÓb“ª)ã·ÿêaˆœd,7qØCmÀ$ý¢Ô€»R'„ì€É3hCXÍÕ­¾!Ž^‹ÉÛ6Ø[Çäü=\§`à®OS鲘8ËÓÝCbMVÄæ"3S•s¸SxŠ MÏ­¨×0EúØéÛÕR =Æ_vÐwFäfË£jzÌNÿB¡ùŒ˜õÏû!¶)4Uߣö+AßiQ"»Gª 2X-&ØÂ&h´È•C•d4’Mù!¶ÀŽæý3ìóIãjmÝÌùÿ¥ïŒ5UG¶“éÛÍ"^J£[‹I„`²³ÖvÀezµXTÂÑÌO<›^.ÜL³‹Ç„$,Éò ;Ýÿƒž[Ó¡Óìô͹Ê…ŒÚUÐŒÛp†I¼‹JßÖʵn=üó ›0‰=d¹•‘Uç¿Éêz“*jV ÷õ«« îý]Qűu3CܳŒC•­0)̵ëqµ0 LvÔšû¿w ½=ñ¥ŽM1ó/ëw8~TÀÎ$ûh”î)¨SºxÏ?CY‚¶®.ó×yÀ¤ˆ11ØÎzù•Ò:LŽïg·ÆÄ0È£Yüu˜¬k¡ºÞ¤$ É”Íew;ÚËN×›9œ©ñbL6:ÆGlzM‘ë·Ç/$€¬ âóš•ÒÖ½lzv›^»™ƒŸ±é_”m¼É¤ŒS C™`òfZsÿœaçû Ŧ”IÙôƒN–NsÜÝšj¦¾wò/ (§°!¹CH1‡_¿á«ìú†§ØéI5„5"£47UT=®QDß\EÚ„Ið,ÃÌL☳½^îÃÝÖö®ï5 6-’Ξf Sã|3‡ÏÑÜJSA±‰+Läö<‰æMj“ߊÉ~ÀD†>wÙ£§X–‘OyfR1ÿÃ[üJSVÇsüãvþ®jZtã‘[,Ŧo7pBl0ë÷^b¹»Ú|?…÷Já÷³âfLÜýO¡¨¤&µX>å;ÏÙBë!ͯÇD籷ÂÚA}}¤MJ­\`ò¯ÁÍ®ÉèA´º¿ê`Ù3¯–ê%l7„3…Ö$¥Gl‘a¸¾ÁJÜåqüåÓšÚÍ>¿»Œ'ëaT²õ¢•!§ŽbÁÝ':iº÷Ì%úù«Ùjnãd½É{ô˜g™éÑbsX­ïÓÁ±Ü©J*ŒyvÂĪ‚vÌ?»ŒÚáùá\'Ã^Ph‚¦&ÿL.rôÔ`RöÙzÆ ‰ 01¸,M'x›ôâO>êåXúÚàvþ%~õ˜íâ·4ËÐÜü<Çs Ýqã{'ýàîº7Ä&f‡_ìãàXï·]/œrò4Ú‰šŒF´µŠ¯Á„2º-ƒ‹ Ëð‹ß]ø±c*êÞ[–䦶í”`òÇS¢Û;OO]Ÿ+âuaðŒ‹Ýó÷_½BKÀëtÉa¢N3˜úèåE´e¯b½ãáÁûÈùh˜ m™BÏ0£V Œ ‰ëÎùŸ·Âò•X`h”C(ÐÅŠq^'ÂáP$®-$بǧ¶ƒÆíà¯!J`lÄ Ö&ÿLŸãègWšê,„Ùžá“KË0LàWíÙ›Ü@ÆÄ¡C¦MeGUïãËåpq¯7‘H’Ñ~»¨påöϰ|÷éÁr8¿ÌÏÿüërUjcÒÔætuF·?*Ž-¦ÕuG´óÔ^A¤|¸½, …Mi+L žx%wuXݧÃ-žÍ Àü ‚ÖzEP—%Áe”Z˜ Síé5´9tV©µ1"˜l‰ÉeÉÀ£¨½G"¢\jT ^º¡óÄ3‚¤Ha3Ú,{FG¯úIΣ…‰Õ奥٪‚çRPyª"ÔŠ¥j-ƒÌçån~faR]½¦seÑi)ý”ÉK%ÅBu.vs¼™Ë‹’"×$´þ :Ë#!.¡2áÞ„ õXBÒ\]=Uóhõ­"fÔ5i¸£¼Úf“5˜ ‹9E¬´*{ „ µ—}4 ‹™õy7Ádc\`Ù\®¬n»4Ã3ŽV!jµŒöx´œ¾ > mÏMäå¹"`Ëå¹H4ªsxñ!ŒV{PÈÕÐ*h¤¹—ºÌÖ‹ù( œQEÈ õ¥°Ñ¡dD¥P,6 5_ /b. Îi5k3&:ƒêÉךŹ‚¬ %óˆ´`ÙÚèšHB›CY½Çdò} 1Žâ%¾èvQ$1DÙ0&&>›Ð¾H@0y &àü# A@Ÿ 0©ãJ¥œZ_ 0!{”ÃK«W]qèvdQYVYQP€V~˜‘îò§"Úž J®)cSÌü+ä›°7¸â‘D9P'έî`|U­u1´,6ŒÖ8¢ŠÍ­f[|hÚá÷…Äœv\ ‡jkžáT_(Æe‚0ÆRˆRçú vܼ#ɳ$µï›L^‹‰> …"1ö§%ª}Ós›ðUÔ/ä ™=±¸qPCŒ(R^@ÂßÉBó(ôŸÎÇ©(Þ¡’”Qš»ÓÀÛk7£kW¢Õ_èï à1Aõ>Š$&¢­MY`_¸P»YííðgalÁç‚/«QTÀЩ©HE»«+žÅ_CÒ§™Õû 5ïbuùÕr‡‰`òL¿%˜°i“Õn‹§RÁ¥=}n[\Û¶­R‡Ðâfˆ<Är"“Œ‚|”Þ&ù ‹ó~ ø¢• ä,å°ÐÃ1ó/šêO(7S®`Ê’¢4sêÌV»>É$] ®VñM´¿¯fuQ©@¨1lõÙ"ÔŽ  § áP´½åªŸ°XÔíFG Ú?Û§ùÃ`*°ºÝÊý)(wY7bB¾–´® Ž˜ÞŒÙ[›Ç‹Åì­ÍèO½J[ïg»~" $„B™¤Ï’Šûýþ ò)Êq£}_)JE|‘H4)ôxYÈ¢ä¹f+‘ÀËm1GëmŸÙêF}I¸V(S‰ú€NGË\FË ÚV+^o/µnG%ˆ·6k§ªŸŒC.Kk¿±}»p]}{ñZnkm]&˜l‡‰Éêp»V¿é«3<èµ}ëáRWz íåæf+pOY–ÔDÐsìn࿉³†÷Ú…¯"ä.'Ç2SM´mGLÆí8Ò1xÜhc{£ƒ Œm N€Û€«Åƒ1·gÕZp¬Ë…~Øú“Ѝ.=xt*ú,e^sªÃÞº#8ÌmwxÚ÷c¢ks/½m‹½}N(³ÁjµVw˜Ìf³iÍ×…¨tÍGÙà‡=³"h];þJ³ÉÀï„84 Ëq K/^Î+xI¡¶ƒÝd4X×~ì†Âä¸àZ6üu ãÏêEÍÚÖ^¨nÜŽ˜}ý·…Mè–ÔWˆ€úóúûY۵ܴ¹‚Éú€®3mîµÝ®ÛðêZ§ÝÛÚ÷L*2ØM·.À Œ‰È™¬®‹Þªï‘M=èb†Ã‹®µª`;séÌÆv;6Æœ¦öájû×]w]#´ûÛ\É»NÉj¼Á1[Ÿ¸Aj‘56Q‘®Nñ Åx;ÆEí'ÆŸn4nzL7\ôõ™ÅkZ» Ú;]c‹C¶l×» ÉïÕÖ}‡g½’\,çäZNÊKJïL­~9dÇëþ~«Ëþ{ ͪ¤¢ê×MjêÌ[SV´7Ï@K"M(Û´¥¢ Ͼ©óª’i}­Š`B„…f!l)_&,æs (' ´wÜc&”­ MÂÄü–H%—Ëáp(éKéíVB Ñ:¡y—ÍŸÊF¢ÑdÔHcnB ÑFáiO{LïÇãþ mu¯ÞÛnÑ¿•ÔÉ7‡Ûm·£ð˸ã?°DôŽ Íš±ÞùYL¢×êBDDDDDDDDDDôæú?²w-ÄóîŒIEND®B`‚ IHDR&–ÝE³(õPLTE¸·ÇþþþýýýöúùÀ±1’uh®™ßààøøøúúúüüüñ÷õn°œ4“w…¾­ãðìËãÜÐåßõõõ¡Ê¾Ç»±ÔÉ.’tº©íííðððóóóö÷÷úûûc­—aª”—ȹ«ÏÄØéäM ‡ÚÚÚu´¡âìéS¢Šáâââããééé•Å·ÔÕÕêëëðòñéó𜽳b£ÐÑÑÒÒÒçççÇÈÈu©™ÜÝÝLœ„ÏÏÏääåT‡ÂÝÕ9”y‰­¢¿¿¿ÁÂÂÌÌÍY¦ØÙÙº×δ¾»ÄÅÅÝìçB™®¼¸<—{¿ÒÍÕçᑹ­Ÿ³­ººº²²²´µµ××׊±¥“¡¬­¬ªªª•¦¡\›ˆ–±©‡»«···¼½½ÊÊÊr•Š•½±°°°…¢š¡¢¢žžŸšš›¥¥¥l”ˆD“{Hš‚¨©©„—’’’’•˜—ª³³z”] Œ^€ÇÞ×îõóÏÜØ§¤‹•’2r®Ä½ÁÌÉ~²£z­|·¦O”€[‹|ˆ‘ÆÔШºµÈÍ̇¨ž§§§Ûáßùûú<ŽuŠŠ‹[•ƒr ’rŠƒ»ÊÅh¢‘N|l‚|€ –Y†y†ˆ‡±§g¬—ôø÷H~n]€v‚‡†sœÀÄıÇÁ‚ƒ‚B†rj¦”o†e”†l©–:‡p—•¡ª¨ÔàÝKˆvu¤–àèæ$ú¯NtRNS@æØfæIDATxÚíý›U–Ç„®%FbnŠÛ1ÄLx /J€nƒ£Taª¢DÂKÒec^œd£Ñi“´¦:šÎ8“¸ÑwÜuþÎ=§ªè¦ ÐÕgužœÏO]TÕ½ηÎ=ç¾T[,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAñ{Çj³Zÿ]K'þ_رÓ>Ãñ¼Ã¹SZ&Û0¼~Éc»vñPºm«ëŸØý¤ÛéÜò2b2{ž²û÷š¦Ø>Ö 6Jq1¶Oðx}~ëÔ;,{gfžfggžùó>ï´m£š]Œ±=P:ïÜââ=l õ“N¦ð€ñ†NXv`Ïñ𠎘åÉ9›ÓÿpÏŸuŒN€!ç‚¡°Çg›|1ò<âñˆÇí›dÓ¡›@ƒl6ŠÆxëô6L"žIb%tÆ=åg^˜a½ð :6Ÿ|Êåà}>‡sûÕŒ• >ï‡â‰@Ò;RþT™°¹TXp;l[U³.=¤£nÿô6=Å2Ù\2êåI&™(ý£'fÙ‹¡$<î›ây)扊g»õ¬×´;Ï\G ÅRZà·’‰=3?÷"GÌ/£Þñ•Ýô2cù£…r<èqLoȤ¼EÝ#ûG ë$蟼2Ï*ÇÒI?|jw•½Ίgûõ *òíõš(•ëaßt™¼Áª'Š’¬(²|òMÐÉ[q|Äô€Æêxéícª¨¦?½MϰL£Yªçb“¼±…LžcöS©l ìòñÖŒ½“^àÂÞ‡ø]ÇÉÄáᚪÜ*$’î­d’?-¶;ÝN»×ëaìl!Ë cE:t/Ê¢,¢[ÊdQ*³ia’×!ÆšoãóÝÆ2Z¡Äy†aƒßÈ6ÜÄÇt›õøc “–Xˆ„·–É»½îR¿Û–Î2v¢ÅÓ«q€L¤–TÞŽLÞSÕÔÂÃ|Gé2i€"ìçZ`È¡dd/¸ýó…Fj!ìûeõø½¹xQ­¥Ñ-;ü¹öÒR¿­É²Ü»ÀعVy!ì³M­|U©¡6šÜÖNEk‰Åz”d2ëx˜ÇïaÄx¡#6ƒÞ ŸÏζäF<·É Ø^¹xñYž$Ê#‘Ã/¾ïp8àäFE6w8PJ¥Áá.<ŽCnΡf™t@%²Z(4Ô3vv¡§fCCMÚ±ûânwøCßÇéMÖ›©æ æÐ+ÝñäÅ?­Øø’6É%¾NÒ=q8æ‘gºLþ€2q]î5Ö-i} ?ûvµ3dÝçñóÌóI¯úé½°ÙúÙ÷¯dôLvOÔí{uæñÌ“¶³¦‘tØk1ë>¾¯ŠV\ôºy¿m“Lú¹ÑŒÇ³ÍÓyv¡-—‚Ã<ýÒUý®Ù=QHÝ×o²í›}»ž¨s‚ÛiÝ3³Ëïpÿ¥ý{ ÃçQ(xÕÌÌL†¹?þ8Sà<<å:°ŽÕ‰yä‡`õb6¯³1ÓŠ$½¤“ñX§Êä³]Œv±›«½2‡®?{vÎòù-»ý‹åv!àô {ð1­ÌÏ£!*Ç8Æ^K†ÁÌÆé½øi~n•´xåš½úz8*xÁx(“†ôé×=1ÏŒRtÉíÿ2)¸yÛºLzm¹¸ŽycáŒêôTP®®’Çu/6ŸA‰-Fr8ò6ÉGA.ŽšvYæ…çá‚êü<¶ô«:\摉QŒûa†‚!ÆËdp´ãüzfìëN <£r±#߸ì·×:ЙOîËøˆË6Ë…;‹V)@&T£^ý4ÎÜÌ=)¥ oA×3wÇ^½´`z‹éMðºçfÁŒ}’€RÞ»e½d¹¨×ÐÉ Ȥ'¦8¯Ãéþ…±o:m±¡p¼ÈÕ/ãͲz*ª\‡<Ý—îMpÌçwæ^ͳÊ;ñD©x£Êò'ê!ì‹0ÐuG÷±êêêrW.Drày~k‹ü.±ŽÕÉààÛÆ”Ûvö×%1›óê?þû˜ýƒË.ûßîvk3:x²Â\oÔ³åš$¶Z÷;ÄØá²ž0£÷™göÃqý¤(ßC²üi ,=Ý›|O¤Ãh±Ïài_üÏz³¨—r <Ê\¢Ǻ7éIÍçÁ5i ýÈŠGWêÍ‚ 7€›N]Ü29‰G8á.–©²ÌµT¹ØPÅÓvöf-t5ñ±äQwïß½ÜVÁøH&ã+“õƒÇæØ‹ò7Ù÷kJ9íÑüg«ì*‘öïïvÕ„L4 8Lª($"`-Q-×±Wð?ÏØõRA•ñ¬|Câsb­‰ô “¹£åT$·sÜŪŸDR5Q¿P9±Èì¯gÓQ&/†L0fö?¶º°«òÀ›<áb®kpWKÑ4Ey7Ϫ'Jé¨á(æ¡¥åf}¶¸zZ”$ ‹ÿœå/•#I]M¼'ô!Ëñ÷û«2s°‹uœNÖÿŽfØ‹Êò_™ëë6DŒz×Vÿ xú¦ýûµ.DºLvWXæz -¥È­–| z)öyG«AÊj³¾ë— ¢~R{ŸƒL¾h˽8‰TÓï¬Ö,ÿj¤¬âˆ<\גϽ¡–¹˜C÷&ö7Oºuõíw>¸¥Ro¢fs>}¶çj<¥Ê/˧û‡šå G1ÏkÅ8¶er¦ÝîiÐÀVë$c—U}´F— x“û÷ï/·¥fšd2žq2Ùø; ½‡²ô5c·»R)èÅgt‘ÍfkÝ›ì¯Ë5«‘~°Á±l¡¥i2ؼÐP!èeºÜm590¤ÔÏ$ "œád¡vÿ¯û5F¶Í€³Òg]Ö ¹©ƒ½ø â_’ÑqÙ4C\¹$¶;+5ôeÏͳÅcMU^ÑdµÖhÔdˆ;:ÅD…mžýX¿ÅA  M´÷ûKÝž~™šggpؿÙ¬­®v•B‚b“ L—É+(“þª‹å—qœ‚×C×Sbç{öýRG*éÑÁŽYV©—EmEV‹Íl¶”RÏ‚®Ö–Œ„y†íÏ–%EœÔ ޹½Úoa—aûœ•,–qPæ «ˆ¥FK‘¥BªgSEU”ð|ûFe’Ѥ•NÒ×KöU¼*iÕÊP|³Yл8 Þ‰$«©´!“óýÕÕ~O*6K¥T†½©I)½ßsú„·ÙÙËKKº3ñR¦3ëlüù*¤,Zwéxl­¦' slÿÑ‚Üû/vöŸð»1¬?°¯©*𠦎K×K¨Þ¾¿Ú+‚L¾'Ñ¬É ¡rÜ8y›¹þ¶¶$cŠ2ùIi ‹‚‚ç¿+ŠŠ"K iŽãâ©B£X‘Éâܯ5D­Óx6s¢¯ºVWzr£IãMÅ<{Ót “DE, ™|³´¶ ÙLv!®bŸ¯˜ýžÍáÝÉ*ý®îLb3çý(1]&`…#Z§ÛGéhÌÿßyv+’¸2{•=Vlõ4©\EAH¦_7eðØždì$ØNFÌ“·À›¬-)ë2ÑÀ^Qþ¹ ;‡"â\Xðx„pp!Û,AÞÊ›™:ƒ¶Ò‚¨¥×î´åb=ì¶íó_o(=¥Ö äÁƱEh*: ]&ÈDðÛà:mi ûI(]H>Î5b't†6Y§mÜ´­U¹ Ö©@¼*C´¨e;!ãCÇž¿ý ä gûøÃâøÚ3¬ªÖ´;Ä|<Ï{£×!6Y[Öe²—åO‚åB"äÑO†ß²»¾^íÊ䓪ë,× qó‡ÃçIrg$· “Sýµ»«ýN€PTndƒ‡Ö*)qeú­°J÷ ÜaæêŽbD&J¹¯Àq€-*šd¨Üj{¢ "îÍéLbºLð×]i¯ˆß@ꢩÙЧ³l±ÑPñ4«^6, ¯ê‘À_¨+êãŸ~7D¾–—P&Î+¬ò“ª¡Idì d¾bñ³ŸSôn{¦ŠŒ–I{“nnœt逇÷ø÷°ê ¹g Jw'Çìùsæê&™¸Î‰ÆŸë¹–Ó?Xx€±IwùrW“ W.¦JsDþý–©iš )—9ÔWZ¨çf™´:íVÊìf@&’Ö*/L¶Ét™0Hp.%~©Êþ§-Õ2l¾T“µùd¢Ã¾ÌØ¥ž öT§ú=þ‹ Êøt¯O& ¼ÉäUvÁ4ï˜V ºZ-•'" \Θ9´îØÇú sãoèOÀ{ëÈDìõTsÈŠ2QÖµK2Ù’­dr^i÷ÔæÂ—‹8tyéÁ²ˆòHƒ4\Éæ9ÎØÆ=¸ ¤{=C&ÐÿÒV†4ôÙ_ÆÊ$Za™K “´¾šrœLÚÝž”ªs¡œ>÷l,1øl'$RšÒ0g °§Ê°óâŠü܃2ÑÖå´eT \D2ÙSUò¤…}…2ÉrÜ-fÿb%Ã2…Æ~\…ÇHÇËøx³Læ7dÂϳLoØÕ¼27V&ŽYõŸ½©2éÀ…IO â•Á‚%‹õ½*»§)…ȺLžcìêx™HCr"™<ÓÉ“`n­½RK„Â_2öñÏŒÝRÁ™@œ)̳7WµôZ­^ˆXNC¢ƒëì®nÈÄñžêtöæÇËrï3=ê$“^SÞït®¯O³X¯ï‡ÎÌŸÈds)âŠ\'#ò!™<<Óe²—±sJ[kD’BrŽÙ?fù%Y[Ÿ7ƒ`E1œ%Ïζ×ÓK«W“ BXG¤Šs0ë©È ³ ²–CXÿ¿òÌub8„Ý}ð1ç@à †°X=_1×È͘Ãú,ôqRkE†ètT&ª2"™d²]¶#<¸Wx ÇÊÏö;m} Ä·‹-öô‘›ÕQŸgö Š‘ö/ã$.ä¼zBìO‚¯ùXYÏ–wâB‚1 ±?™ìÙKЙ ñ 3lÿ§ncø$™X-¾/í¬ÒE¹ê}ÿi–?Ñ´ËF2ùµ˜.“},ÿO × >ïnŸ½ÔϹù?°|Ïypz^Op‚}µÚî ƒNçó¥¾>¼fó~aö´px͆ËV]ólÜðšÍ=ý%úlЬÇfËü ×B:§É„>Ž*ƒã°Ù·»\ìÍ‚ŠRptxdò ØJ&Õþ ÄïË=ì_¬-wõ©b?8šž‚#«Í: .âÖ±zÒÍ q5cVÁz«;ùº üÄÕ£9Ïñ=û™}öm}°þ™øÂïdƒ‚ÏÃØùO8.¤ïŸ(«Cˆà•'SÜuü*4ñ`úͳ’L~5¦ËäÏlñd¯×²p1¿ÃózžÝ¾{—x62QõßÝŽœÇ¾äо3àH\o”\jLýáÍ·6Ö˳¹ëwì8õ7*Ü£w—½U~xíàÜËQ9˜ÈÆr¸{y²LœÞÐ5}%öÕ×öÍáÂìk)UYõE$“_-er©gLÛÜ×çØ¹µ»«íFçöƒyvc0¾Æ éïÙB•û›9CluÆBY-cžu}”mÞ°ßüzŒLÀàÙ;ù¡U%ךÅB9Ž+Y7Éd¤É¾hý§³ë7-ÄE J­ŒùI&¿SUò ˆ¬ôôˆîeÚ—Wû¸(Bä~öƒ¾I܇ÓyÉHã´a,×ÇšEÉb¹}w¹§/K²ù¢ )ñôç €ÌÕcÍrã »ù÷µNG“õm™hð@J;o:žÊ©rM²Ë’t™,kfCFzX°$Ý2åuøhªÖÒpþ0 ¡ ÊD’%sYRF•[åúLp9Ô†Ld}ìomŽß)SUb±ø’Ùšb޵ú=\JîtÛj<‡ó'|8RÅB$i¬'åJ5ùÄ­[‡HåBC’Ûýåå¾lÌ 8<¡DQRYRkš*^`7¿XîŠ%\äèÎÅ¢”ÒÍÞ.†ü懟_½V,6¤–Ü29Z [K4d¹† #GÚìô…RÒÊé[?¾s´\P[ŠÒÂE¸È1Æ•T\œ 2q‡6*ÌC3K÷%¡b±L{ˆ'±Y£21~?ÉxmîdBŸé7~[%šµšþf\:¶ÂeËrK’Ä–¬ô:Ý.>ü(¿;š.Dýå$ÈYvsy©#á®Í—Œ”UpèŸl>Ë6Z¸öYÄRM–ЏdšÉGëeI,¢(-¸T¡¬)-«Ö´V­Ðó­ãµE±*2eb–ÌC>\Oá†wz#Á$6{dÖoŒ_ÓH©P+'Œý:N/KË;b¹º¾ ´jhµ@`Uð;ßVÙÛáî£iéBOže·u§„~:šf±œêsËzRŒÍbÊ×߈u7 …¦ñæ‚Í­DuÅ‹èEtd±Ñ\0¶V@’UOSuô~fE!sÛ6cú!”ž-bDï7™À™àC,p‰f³žÃñ‹ÓijÆî(L1ð¨Ô× Zm¼'§o©By+ã 嬾Žõ Ë_ p+Ÿ*I’ªÞ³³Ë½NϘ^q¡H6{Í xát¶\Qd¸ªT˜ŒéKÝý±P¤ÙL˜¯ÇÚ¬P—Ðw’áMj¡‰Ù‘Ío¹D6¡·‚‚XÑú¢ã0lB·XÏfA\´v›u1ª‡7Ì-Bºp'ä,‚×| =I.=Øÿ !‚'Ȧ Z­PLe‘H¤Î…qͳ¶?ˆ$²¥T¹\NArœ—Wz昭ß ¥9ss(®^¶p”Ò(”- ÜØ©›ÎéB@p𲽑nÇ ÖKÆ]ÅhÁcî]æca.Í…=FEÁ4—Ô¿‰uôKOëÛUksü^Ù¬’ÑC0~8™¼¼~ìôyÁ3Øýíw{¢á¨ÇüÝ­~Ød!ž-•²‰.”¢º¹|;!Å9–ˆÔëõH")ïI뵌ÇE†ñµŒfÂ{…\:/5›¥xÄÒ·cCðD2™»hFº‡Û¸Ë¨;¼ßš¯7ѯ— ‡=ëù†±th½Éq"#º°Œ¨Æá³ÄbnÞx±³ÕÉû܇s`Ÿ×ë¼þú$´dK§¹PRðÄã]#þÈcùÙkÒ¯¾ó"d­?âÞ.œ…ÁÊü¼;æ( õƒes\:ƒf¼zÖ ×Aþ›mjïºÃÂFiÐ|¯Ù ¸dýOëÆá`™œÑ r&™$ã¬ÍÂëï 7NÿÆ6'œ[S Ü &÷BßÍëè'ý±O2C{±ì‡Žâ®š‘VC!|¿ÒFµ6ÞçõѨ €×+‰:°!¶›mØÙw èì|/ϱ 7qSkGo5[ñ[ãwÌf]˜ÇC§m£ »û‘¸{o®_5O:½¹ë?¯®æ”¢>†ƒ#…ÅØüøjb|A֦Э¶Í/µŠÍ¯+ÝϦod*x8J9¤°#2w~Ì ›˜ð±!HKËÚÏ™!ݬA²*ê{Á%Ü‘®¦†_4ûK,EFþ7c‚LCo²1« JÊøZ"2ï£ÉdwФpŠF6†IÕr"Hc,“܉tR/•ª$Š¢T+4#œà¦×Ã?²LÔ‰[È"8 [,§šñ@HpÓ¿®y„™ìObÑPz!’H$êiü/K¤’Gš±"Á! y çB¡\2ŠÿUTòh3V%}ÕçözqxŸDBLz¹9ž°9ôÿ9‰ ÔAAAAüßù_uÉp±œâŽ IEND®B`‚ IHDR&–ÝE³(õPLTE¸·Çþþþôø÷ãðìÝìçíííüüüýýýöúùçççøøøúûûðòñùûú¿ÒÍY¦Lœ„–±©ääåö÷÷úúúîõóáââÛáßÜÝÝçêêËãÜh®™B™z­ÔÕÕâìéº×Α¹­ßààñ÷õÐåßÕçá.’tS¢Š®¼¸ðððóóó—ȹaª”…¾­Ç»ÁÌÉ9”yHš‚±§âãã±ÔÉM ‡Ÿ³­éóðÀ±»ÊÅõõõб¥ÂÝÕ‡¨žêëë|·¦4“wéééØéän°œ<—{r ’ÐÑÑ[•ƒª³³•¦¡ÏÏÏ1’u] Œ´¾»u¤–ÄÅÅÒÒÒu´¡h¢‘œ½³l”ˆ²²²¿¿¿ÇÈÈ\›ˆe”†D“{<Žusœ«Ïļ½½ØÙÙ×××´µµ···ºººÌÌÍÔàÝO”€°°°¨©©ªªª§§§…¢š^€ÆÔÐÚÚÚÊÊÊ€ –ÈÍÌÁÂÂN|¬­¬žžŸšš›¡¢¢¥¥¥•˜—¨ºµ“¡c­—’’’z”‹•’¡ª¨„—’[‹|ˆ‘Y†yº©ÏÜØo†rŠƒ¡Ê¾B†rl‚|ŠŠ‹•Å·®Ä½‡»«àèæ±ÇÁg¬—•½±~²£b£‰­¢]€vr•Šj¦”ÀÄÄH~nu©™ÇÞ×:‡pKˆv‚‡†T‡l©–‚ƒ‚—•§¤†ˆ‡ä=MtRNS@æØfÇIDATxÚíÿÇÖÇ#¾X# ¥J©¢]…Úº£-Qº´„$lÔ°$$áû““BB–ŒI4ñVMs{¯ÏÕ6MûT½mü;Ÿ3³€F›ÚÞ—ííyÿb`—³Ã̇3gΞAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAþè¨òïž¶½jVùû÷·ÞÞ¶W§Wíº¦½Ýð¦»äOjq§Tö½¾É-˜=oíï8`2ë-ZÕ«O6lk³¾m¬ï¨ÍZÕ®¬ï;tØþ®¬kT¯8þ4¼wä­·5íï¬Öÿz¶{°ýÈQ't Vy›¡;þ>}ùŒŽfÙ'Õ.·^óêÛ>8µ_áð‡võí/ZgÚ>äØÎ3µÛüJëàÓÎvuž3›_nÙ‰¦<ÿñþO¼äçδüþŽwŸÔ¯%”¦Ñ¿ÐÁ²ö‹NÏ­W½òĽŸòìöwOûÝfƒê—¬ö9Ëz‚¿K¯}Õ‰T&G]j£Ù‚þäWÐÔƒïuÛÏø]F/éèm™Îööyáç§ùmÖU‡ö³lgÈáôíôƒo•‰Àsã¨ßzO{è&Í–‚¶×êÖV™¤Âéh¶ôËÞ„ŸY˜«ÕjD&ÕÅ8;Ó/FL¯9ˆLl±ÝxI|)› ;t(“_ASO±³,?YHDtÞ­YçØXË÷ÞÊB·z[~φööö—&´ííûTÏYgÌj[IL„#ž¦ìŒv_{;¸®–™ÄoW@%UY’äÙe6¾…Ñor'`¾Ý zN&.k°œ(‡š'°®DTÏÉäv:šˆ˜¼Ãžƒ¨pgIŠ9][³ÎÞ¿ñðÞ¬œÍYÝší€åàÞ ccgƒV—^cqµ·¨šM»§íÐÙ±³_Zùz+5]*[ò{ë†4ÇÚŽ;ûVÊä5hZe²R©Í^&Êe±p—çîå³ASãSZøÔ[ccÓEŸÞ°C1n±NgLËÁ¶óf•Ö|þý#cŸ€æ-[Æ Ûþç@G`°2«ì4¾ÖÚí¯I“JÚﳂ ¬~5—uø³ŽáÂ~žgW׿ä°Í¸ÕÛ{ŽÿýÉmØ?ÿÚftžÙÿê-[CÖ¾wì&G3œÆ/?¼yÀ£·Ðýôçÿ{4’*š\õ¹ýýö+|W÷'N£Ù¢m‘Él59ÁÄ"ÇÝ­F·¤ÛþÙýSÄ|`ÿ¿>¯¾Ñ&ÆñðÑ71GÒ£6kÞ¹³;¢×}r¼#ÛÙ}ÚïÕ×e¿÷Ú©ý¼èœŸJú^–ŽA^ I&ç?f‚ð튔35fc÷¹Žvän­*Õõ¾Öž;Á2$µZ˜È…ÖÙï¾4ºÃÜ~ásx_9øð‹ÓŸs=)·×LÜ̓®Îî”ÍêwS jžÝ/Ðr¦’DÛžtææd1âÔé<¥Qð&sr9©L{¶Íó'=.oÃWM¾›¶9!ÒÖ¶}Ì m¼ý¯Và8œf‚ÓhëHNA¸ò¸P'»¥I&m²ñÞ¸ðýÝjÙæª÷þû‡ù ~õÎZ%›j¶¿îbùÀøÀ@oœc?œd}¡ó»¼E%§88tu(Î Ë7¾ãFs: Ã\èê<“$YXr¢¶í;ËÅɉ30æÜÕI¢mˤZM—œj·×êaã‹sù„ÃO.¿ïÿN‘k="æùÞ>›ÏM}Ã|9¸<í´úzø"ÜÐox>ÐqõÑ8Çó4õKdòp&çáÇWÃI,†'»£I&{?e/.³Â·³™ˆß¬Ì9gö‰ù€ðíx¯>µÙÏÎ…KáĹѸÀ ³ŸÐ³–NR,÷´{#ûzâ¼ýßÜ ˜rêŒz*“nG‘䵈ëºß)®Þ˜Î…ÅtÿðˆÀ lÐ$Ú–LòÙ„,ZóƒìLm®š ÂÊDe8þ.Ëu€ùpÌ üÐIèB[—IO¬hƒ)Èäéa;ÿôL)XJôóÑœÓG¯ª2xg:G¾ZY«]§«l OvG“LÀ#?^ùJ¾_‘J%u²÷S¡7?VšMéh/ñI(œMG¥Âí!`g{o„CE™‚Ô¸«_Gb‰LT’'Æ.?ùXˆñÁ²â-’× ¦<Ä+í§c¿ …ɉRä ‘$Z“L@Ú}{ÿ ­ü\5CeòÞ‡<ÿèd0–€kË?ÏÜú†M‘È„ë)É­í{ÿà~|àlFª ã·‚N5 -n[·}äγ'+X=ù½XR°;šdrh??Y{²Ê®ÞË—‹t†Ñé ŒfæÇ…ï‰LtæFóîtNLË…BAίÄa¢ŸÙŒŠA„¸{Æ: •3’ ` Y~¹’.GH‚þÉk…sE"·¶ùÀÅPNTN”«‹q~8±Òü/‘Éb¥"—o¿}ú ÏŽOæ®g#pùö³]ÂÓs90×.\_Œ ñ©¬œˆ¸¦¸õL¸”Ò¹5Ö‡°:›Y¢€$ÏÝã¸õrÄã"ßÈb,öƒLžü´6+…S;ÞÿAv I&:@&+«ÄV²Jêäüµ€ý¢8?#|ÿl6 sQÎ…üÀ’qÈB0ÿ–"6q÷~ÊÛ»se"!r°°Î±ü¥j¦DVŸ‰.ûT6A0Ú ]Ü ’(H$M§£sƒƒ›ÙX’z$ ×;<|õòÃ+§,Ë _¯Öc“÷>äì§Á|¾‹V9a²fh™ôeË V‘ „½•¹<9K¾ç'¥XÊO¾z“×£I&g9n°²pg•}¼-‘õ§öøa~¨/;»Ì~¿V‰ÂDD”ó÷@`"LU’Ίe1±ÙË2#ÏjyXŠXöÁòy`# *¡Ë 0Vy2+‡‹jF2¹M‹!°sðïlǹ QI4“(‡Ãb6*Ké²Ãd4P™lÜð¦q.#Uçæ”àƒNœ,ƒùh9”tZÅH?Ì'›à à&2Ù”Ó±"•ÉÈÝ¥µµY¹ Íp†Gùø‚œÒdÁ®ƒœ«gâBg²[¶erð*“Ù'#ÂczE?}SXgI He«áüz™ Ááñ¹Œ.Ÿóäx*ýÞ+ì`,SÈGËA'9¨öôu WCeR`Hœ¢þ—0Ó_ޤl)iRÝn—ßš †hMQ=„­3˜+H’œ•äÓ1r;–QÃ`^CN?¹¶çÒ€p§¦¤2)Daz³8ò«÷jk sšáŠüí/do¨R_ë¬ç«ô.ªd·4'a¹‘õÂÜÜì$Ì:yÑáW_³Û/ÂüR]çâ+yðÚ0ÇÎÂÚ'!ÃHÁa¶,fWl} !Éðy“#’!P+7 Ÿ,4É„x£µ[˜ÙÌÊ µ”Ψ7È™~«Ó©£Á(‘ɳ…gÏVfÉâê\5š$Å ÇsƒÄW‘Z¯ž|hú2;²$‹änïs2yR[‚γèmï™(ÞP¥2Þèˆ/Ê…LÎéF•ìšæ$,7²˜‡ÕÁ"Ï/ÏgJÖÈaè†+Ö©ÎÀ:8ú”ÊÄ>?h2R4ý©Õ;ÖÙ8üò‰L¾¸I5Dãå`îßüµZukÒQdòöC¾w3]ÉtA“ŒFïv©ÕJN]‘É“g+µ ¨äzAÊ„ÉrV 2 ŒÂ|-ñ›‰c`ôŇìêRέ2‰¯@ø‘ ê`åÄX¿áâK"sKýñ¨$Ãg¼˜ìš¦ìÚ>~;_•³·†ØÇ+R8u®#Ð#fd9=ßÉ Ê’H–¤ “ømð$VPîº1ÉuvæçÙj]&ë™üR­õÂ&Mð0¿¼TÉ3/Èd¼_"#§dv¡Z‹Ùë5Ó;ytÒYX[«Uò°æ†%SÉaU]€7YOÈôQ¿ ¨q~ Þ$Ÿ&%,[2a@&ÜÌR¥’ax¾áf •9ÊäõØ–É—° ¸^•Ä)ž»›Ï&~`;Î$¢r4që©° 2! ®=g»¸u)/5îÄÅQvf¾r=Adr˜»Gœœ©­ß;Å/CŒ!>/a¦&ÓpÁ@UBš¡Õ4ÚF²~qv©6'eÅp8–‹MjšA{ÿ0/Zh£„·²Î¢?ÝìM¸™Ÿ«°–q’Ú*“Ÿe”Éoa[&ÁIa|¾Z†ƒçž²wæ£ýãÜp_–&±CÌ™ŽŽjß‘Âd>ߘèéç3ãý°™Ø®°ËrASBæA?9[¥Y&™èþ&Ä d²h”5¥oêYXP‰XŠ8RE§‰Ü9$Æ „].·¦à8ÌOVò ›^ÉõLÎCäļ§ÈDùÊäuhNÂö “ýÕëéRrãªÀ BàXJ¤¡{ƒ‰^v|âR[«ùbÄ”'å*¡ ûA&Õ‚2ÑuÃÁ‚Ô˜KTª}÷9~r¾Ê<'÷5žÜ,›{ªÚQ¯^«!›Gç÷©õª¦˜Ï×ÝåA'hƒ¼ó‚Ljù‚r·P‘IÊÄŒ2y=¶‡,u{7ÉY§ãb@¸s{™'õí…t¬[‡?iÂC«rŒÂOý:ñ&u™´qT&Ä›¨Úë×£å¤ÏÒ‹y"“罉åd'ÌE¯”I•,Y}n¯4ŠÏã0O&¼†LöÜÀªeg™(sÊäw¡I&oLn‘³ÓÉ!TžôÊ dCÖÈT`fÆ—Hã3‘É ŒFcÒyÿ0Kd’'2ñ~}¦«íIGCªC–aÒy.6±¤Þeã‹y:+(íÐ;¦m• )$p´Ú¦:F31_‘·ç´Ï>åãµèŽ“NM–ÅœP&¿¦$ìX‡0)¯ S‡zx¯QÈÓÕ§­Û_ NµAe~ðâ yËñ»Ï³[!¬|ÍȽj"X¯¹nû82ù¹y¥CÓkã5ðWóšÑ6ö‘ÕÜ™gÐâf4ŽËüÈ`~«¤ûØX?Ø'ÑÖò‚L1L]&2Êäõi•É]¹J~«nÓ;)ž^¨ÌåaTÕ¦£vP†’x0ؾáù;³æ=GNB² f|z¯¯Cx¼()+VíÁ±<œ¼2[}ΛôÓßÁl´ ×R–DǺÿÙ´ Þ’I³N´¾¾N!~;]ϧî;tX°_LÈdAl4L£Lþs4%aI®^¦a„Ù A+;rg¡q$èA}£cdPVòkwb@€.“'"4Üä¹_Y é5­95ÁÁ@Fs&¯Ùµ÷~wâçÙ é5Åt SàzoŬ$mÖÞ6ÖÅÚ»M>µ·Qo²£LTfpsüòDÔ¥Ñì9t…çz™Âé5”ÉïK“L>ÄoªDzsjJ`Wï>[¡%fãÉNán}!ªõzòã?~ñRÈf ~ÐÅzh²žÜÓQéÕ=<Ë ]¼þä£SžÁ¥ÚÊl!LÅp\žÜ”™h;bxsxd„ãñÁårþî«?‘Z’,±¸<ÁÄæúÌã‘™ž£a±ç¿}R/K:=Ð;¥”%i!Ä19ó½ÔJ`æê¹ 1“ÎÔË’¬3“µ¼LG™yþ PgI^ç¸8Ì{eP‰œQÊ’"=ãëy¥,Étf¦·_ŠÖWcŒïè¸ò’fa½_LND•/ó¦»ÿÏBÓ0^S0!A÷‘™Ec´æÒs•j&DnŸ0zu2–I‹Z kp›"åèæTÏÔ7çHéº\]XPŠáƒ^_±”%Å‹éL6›‰.ŽŒÜY«]/“"G‹ºH¬i±¤^í %¤¹©ËSϜŠ|$v˜È¤£u{BÙú(·¶ÌûS±Ì­ øÔfF̦¥‚Lê±I‘£ÁèÌeé¶­Z˜ÎÄ”ûNŒJy©ä†•Þ— gÒe‡e²[š‡À«s„3õÎTÁäQŽÒT éZ‹Ë™i±3ñüfa1*hÙ²$Ëùj¥¢·iÞ‰$uGŒè„ …‘¯À)áb`%¤X!Ud^?èIª^kÑl©è#‡è(g²½T-îÄ艄‰‘èµA%b½dZãöDÊLD¨!S_,!ælu™(/•Ð|±$&bI?îH°[ZV›þd©¦Oô“Éà ÓÈ~à@¥˜òèaŸ-$¦%¦@¥@sH“’vÍÁû˜lÁp"¥‡6{…ÇO*)fc4Œ¦nÅG­èݺd)Q×)°Ï’Є,ˆµJK¶ö=jq' QÐIãcRF Ù”§{4^°Ç”’:/È‹ÁF“wÄséKúD<|µH,ÂmpvO‹LÔVG(Tß&g*’òÐ*C^9"ʃXDCn?‘B†$Mnö‡Ã1ò8—–TÖ÷m©P)œÈf2ÙôRœŸœŸ#q±‘a´ÔJRy`F¥ÕMÉy(¬n&æ°Òz2¬ÖT(XÔ5ÊËZ;`$éµ£™D8hóÓÇCÒþT0E]‹ÞeJF6úȱç2#e'Ôê·A3L.ÜTk·4€ÅíóÐÔítxeò0Jt´Ûï!OÿÖïèéÝ0à¹XYËáRБJ&“ôoRwo¿s8"¡\)û{…‘õB5Ÿ¡0\~«³^;JÔ»t6G) VDÌ$=«)-Ñmíh¢zN'ždˆ\[,Çrg]%¤¾zƒWmrZÉ.|** úRG_‚ZÍ.ÒŒ7ÝûšBXÙ¨öûo£êÐ뢛:*¯ÌnµOí®'€Ž·¥"ÁPÐQtšt~ÎG57?xÊÚ{Òá`*å˜7Oðüð9éºRϨ p°ÒØlBK¬„BÔŒN©*!©wCK\ÛÛòµèÄâUëœI¸v(Bö‰k3ä˜ÞëÝÚ%„Œ•™ñéÅlˆ|Š©>m®¶qhûeã•7™þulu³ò÷‹_8¹1X0*úÖQ‡YǹÕK³°,èíÓàLHšt+ÌhMÖ+z=ÝN©åb/´¤e~¤:"×Ö¶4±¥µ*UëK¦õà›îöÿz^èâÖå’3—ž'YØøÐD_9‘¦Ï¾¸¹¦JõZ#…Ãûç¥%¾4šáŒ$K$ K²¤y%MŠ«Š¿<-3‘ÙçlloBv8!Éô—ìý‹üÅhY†¸ý6e'%%E› Ó4é›n"ò Y'z·ß)•I6“É–KºÙÚ›n!ò eÚ!ÙÐb„dac¥\$éña" QhÕ‰×å÷ØŠÉT*ióø]/ù¿p¿ -É’èWûu:Ÿü7<¸E/²M«P,z³·þÄÞ›nò£)ñϨ´Ô‚ ‚ ‚ ‚ ¿ÿ¤²`8þKAIEND®B`‚ IHDR&–ÝE³(òPLTE¸·Çþþþýýýñ÷õéóðîõóøøøöúùóóóüüüúûûùûúôø÷Ýì纩B™n°œÆÔÐõõõêëëéééçççííí¿ÒÍS¢Š–±©ßààö÷÷úúúËãܺ×ÎÔàݡʾ‘¹­ÚÚÚÕçáHš‚.’tz­ÔÕÕðòñÇ»h®™aª”u´¡…¾­âãã9”y¨ºµääåðððÐåß<—{…¢šÜÝÝ|·¦Lœ„´¾»•ŷб¥\›ˆãðì»ÊҨžÒÒÒ××ו¦¡À±] Œ···ØÙÙ4“w1’u®¼¸“¡ÇÈÈ€ –ÌÌͱÇÁ«ÏÄM ‡ÂÝÕb£D“{¼½½ÁÂÂT‡[•ƒ<Žu‡»«e”†¡ª¨ÄÅÅr ’c­—ººº´µµ§¤²²²ªªª¨©©¬­¬‹•’ÀÄÄŸ³­ÊÊÊY¦sœÏÏÏl”ˆ°°°¿¿¿¡¢¢šš›žžŸ¥¥¥^€[‹|ÇÞ×r•Š—••˜—z”„—’®Ä½O”€rŠƒ§§§Y†yÐÑÑáâ✽³N|—ȹ±ÔÉâìéÛáßÏÜØl‚|o†çêê~²£Kˆv†ˆ‡ˆ‘±§ØéäÈÍÌu¤–‰­¢ÁÌɪ³³:‡p]€v‚‡†l©–u©™2rB†rj¦”ŠŠ‹’’’H~n‚ƒ‚h¢‘àèæH¿tRNS@æØfÙIDATxÚíû{×ÖÇ’PÀ •›) §¦ŒP£Œp£b`Æ ÖÊ ©¡/d`¢Â56#˜c­9Õx¼Uk5yÛ÷ÿ|מ/©íyúôéúüàóÙ³÷Ìì﬽֚½·… ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ M¤Ê®î•²ù㯢>êîVk”Š·lÿ©Ý¡ùã®âï@ÇܹS»ñç2ZÍï©}£+wíÖ}¼G¯R½¡‹(wöôŒ&À`V«”ŠmÕN}´·W÷‰Åª²iÞZ°ù»gßþ¼EPÈi€ŠOôiä§'ý¥ù•ŸíÚA}Ø#íìÈOí4}ÐavZµŠwº??Ô/søÈç{\j•VùþÚ©Ï>fèÞ£nZ¥ykAù÷?û½¾7é y í°ë˜ÐiUãÑþX»õh5d¥=9DÓô‰A—ÉcÕ¼« BqòC¯ã=xʨ~ƒ²6×Níï¥iÝpÀeP«o-(ýÞ2 zœzÕÕ‡l¥ýžüØ;,?½Ž§úÏC#F+¨çtÒÙ‘§½4= „ÝÎÍýø™°ÇqD(£g\dìyOíÐù,m‹8,½æ­¥ßûú™³Q·É¬×Rȶh€»±£ç\F³ÞÖþ×_œ?ôxÞüBo»vRÓ—¼±>õ¬ï•‰÷âèè‰'ãã,˜ 3ã±E&Ý_Ù™K|2àrÚÞZPú 2ù:ö¹Í*tO¶Gûüì8ûH´Ïe¶¶›“žcìÁ¨ÛmPÀ3íìHkàèÑT:”t˜ôÊwT(,_3þI^Èd3q,ÁÐÌÔeŸQm{§¶à§áÜ!$¤r¾ÍÝ¿IOÔ¾«Ìt*—ï3êqÔÙíp_?Çͤ£A·SÛö×=½tÿ`¸ÏµÅ”ÿ¶Ú¡lfK.TŠ÷6d2&–ÊåJ©Z-ϲܵɜϰeˆØ$¥ÕŒ b:Ò÷>™|3ÊÌŠ`vÔèÄnö'H|@û@*׃Â:Ú#?\ÉIâù]µƒL<–\JHÇ·cMì׫åZȤ:?NÇn„òÏ;ÒtT´£ç»/ï|sפ¶i´êž.UËšƒùh.çh¬W¯éêþlÿý߃3©iëÌ»²LÊU!S7Yö^%”³´ÆBJÛÕ½oïÞ=djoXm Ds‘|ŸI­ÕîìéUÛºv}ygo¹ÊVõÔÎù^6Q®,¦ôa·EGç‚"8šôHÀ¸îÄî:q)½ Ï4`ÚŠºöñ“XÕ¿{¯IÝîÿÔd³­w„²{ïÇúÒÌ¡AŸÓ}ûбºJ¥%†àßú]!jiö÷Î}§Ï³¤äÕÛu£^¥é”I¹$£@=7íeïÕÄxK§Êßìö“Óü?œr“Ô[ë´S÷È9ÂÄÿîóCCa•yÏ19mÿjAomù[Ÿ÷÷÷2œ×¾°0Ç»Õ6tb·A»LzNëX;C߉4Z/®òN/{QG_[©Q·¾¥ƒ“§uÍýpþ‡Áú,½»O­·ÚäþÒþ爎Ҵ÷‡GÁa]oQ­¶RÐîÇÞC—}·Ùª‘åô/?t"KJÒç8ÌëB‘dRªdø¼Ïmrù¦æ^m]§Ê“Çí´Ü:­{0«×åuÆ®{’÷YŒN•âänïèS×»\Žºx´an¥ƒŽ­'în=ë3èQ'Û ]&ÝGtã‰÷ã½ l ݧuÌ×~îù‹š˜s©åç¬ÜµÛK³Œtt‰aiÝC~–þ¡n2xô’´v|ó?,Ç0‰Ñ1–c:óÒ{þ 9á,‘É)‹Åä‘l•fȉa–F/$ $í}ùØ6dR­ ‘>ƒZ¯vÍqÌÍr5:%ç<¢ƒÖHëÍ <‚³šš>2©[\‰L‡½c½°Àp܉£ƒZÖÉîØ8œÈýüã·²u°<켟v™œò¾š¹ÆrÏW„¼Ü# Å?±FfÙûËSÙˆ¥)“nx›½?Éå’üä 0ßè—É0ô>‘–ò›~–õ]ÎGâé³ ,wá‚×…d²¬JÙšôùšy™ÿf¸ØËo£¹dQ^`iæì#·Y–š,“ÅPÔ¥ÖjlOOбyðSr âYw}ê§½¯Bë©Éœ5u™õ6ª%“hŸÅ$[“ÞƒvÖÿ0RGXf®è#:r…VÏ·~öÖ‹Õµ’ ¿!ƒl¡]&»3ãó÷~æþ÷—lÄ'‡5;¾ð³OžÍ²ã÷V“>dݵwÎs±¡GÑx*-²s1Îî¥MGê>£^#½ëÜèÑh®„ÂØ,Ë2œ}$ ƒ[©™¼¬ ¿ `Ïq;wñ@4šL…„BaâCëF.y<’e’MµjÀÈq×®—JBÎç)÷öÒÞ¡H³õrV¾ÑT×9»w8Y6ÌVÅwC^—MLÄ“q>$Œ,q #9¸@RL£7œñ³Ïo¾X­eŠu—½Ø÷Ó.° k^q¯`Ôq%? û;úìY‚}õ|¥ï3K±ëm¿]Ïñ‚˜ÉdÄÅ™qå/M¦ã$Y¥Ðîï¥/žÉ'S‚H["¶–.æ-0ŒLúF"—ǦP~y•ó?ƒjÒ©du†a§y‡K2I ÝJ©p9è6þãˆf¦'KMkòÝ!¢’fë™Ê,Ë%2õ†lŸÎؽgSÉhبWÞ} þÑÒZA@M¢8Ã0ó)¸RL£7™,ÿò V•þ†2y/í2ytd²öŠãž_OGåÔÉþ^v€gÙŸŸOUãaÉÂhO{Ùƒ—s©hzA˜¼J˜½^¥HBÑ3Äxä“!èD cÇT R8 2¹p…/FIú üeï'ùˆ$'RPIÌMò9ð)5’L˜ÄÌ̯/ "ñøÂX¶¾‰ lË·vö'>Òj½P[☼ƒ|L”d2%¤’·ZCdM©š•j‹Ñ‰lÒá&7Õ´&Ë`M²ÅZ“íÐ.“S ôèHyù}¾™:Ñaü“ÅÌìøÏÏk‹Å ~ÖO_¼ᡟ !¾X,¦Æ– fxPÎÀ)6؈—ñ¨DRp°˜žeéñåZU2O.ÉD:!’ù¬Ÿû‰±‰¢*Æãñb¨ Èç,ƒL6&Ь¤P­d¥HâsûÃË|!›ÓПžçf'"Ä€H2™>ßerÿÅÚZ¹*’«,\ãÆäô¬B©ò ®û&}è›lƒv•(a¼˜)¯¾â˜å* 9Ï}ýÜh:•Yþùç{ðæ9Œ*ÙÀ̤‹¨$•ÌÕëù?ËÑ÷™ªBxdS|®ÓM’w]L#ùz=šsŽM%T‡>v½fF' é$ÑÛ·vÝd®¶$ÍG¢õ@=)†Ò)éën»L8Ž]˜²¥’ÖL2„ÖãB&KZÏÃYWè¥Z*jK&É$[ y8"vvue¥VMÇsù|q†Y¸.ȉ\…M}î"{m¥VÎòél‹v™|ôÅyzz¢R[§¯•Ó9‹G«9®Ó ¤ÒÙ›¯¸Ùr†—ò;àoÃ|šôSÎá³4,áüYxq—W+)‡ÁÖu˜î½R²¡ ÂA_ðÙ-züÖjYÈ·d"Rq°,ÚÝìèQ›D¹ Ëe æ“Åb†Y&÷#0¾pâñDš¨¤*ea•_ø™a>”ÉŠ©HÀgú£3l Œ_$‰L&D(è!2¿¹²ºZ‹ù°Å8ëµßSQ)VÒXO]dg¯Wˆ11èј¼Ÿ™@¤97QªLݧ™y14X/Ù…l±I2©“üZ÷ol’E;ÜfÇl´À }ÿ¦$ÕÝCôÌ3èÅB1ï3’£îË—ØØ="8Y–IÌ’õÿÑs!¹>ê3™j§ÙBÉ“(HtìóµÕ•Z‰|ÓÉTA%T<¦Ày\ÇŒÀeBTÐe€úM¾!s³J>Cie™dÒŸG 2ùùEmuªŠZàBOt±r ¥Ð<%Éú*¹#ÌÂn‡v™týKGÏ‹¥Rå&C/“ï„!|îYJÌ܈±‰± é ¥b×1fa2”Í É ÉiµÙ(½ùr‚¾õb¥Dd²Æ„‚…7ÚgЫl”Õxí-O•¥n›L à\:‚}µJ«Õªôf·ÅGRoš¦LÖåb31:1I²¤É°é€™›”@E`”ŽÍ/¶ : /tªÒ £=ÕK'Ƥ¸£e±ô›Ûày:QÛåG;6Éi8mJ@þ+)æ¸Àޓ֭¹/û{¹Ä„øÆAg,#FâÒ L~2±âaèP—ÙH&ô°ìÍR6KR—æo/23%ÙTxzÁÁH_ÈBØÍÐô¥²ìÂj]Ó 3³HD!uãŽs~šÖÍouaµá_YޤŠ@‘#ï>½óoYÁ ?ï¶94m@1ç°—½VN¯·~ò£;[ !ÓVv š‚qŠÂAçw²I&$mBròjϹ‹4M¿(Wȸ`T?íe—+ä!ÃÖ§£{3KbrÖNUh:±&ÄÏQ?ÇÌšñŽ/¯r™STÚœ7ј¯Øá€!‹´Š]Ñó¹_÷ù¿! Ö¼S&ª=£”w&ÓÕº>=Ï%²!9¶Ò Lþ;tÈä¸Î{#S%ã€^žchîþ è|é³ê?.€iæ×l†ÍÌ=‹ºœ*…²çÎUÖˬ§×”Öð€—‹M y·Ze%u~&vskzMi}4Íp±•4ˆµ£û¸ŽÖÉ“!©™lòZlæ‡D^Œy6Õu§—ÓðBöMé5”ÉE§L¼ºµlUŒÍ*•顎æn½X­UIWÙî^ o•EéÓ«BëÉO{A'ÙHŸÛMæ yJÉz雎Be¾<ÃÒì‰'ƒùú‡¡ëøÉ[^!ßt¬2QÎ$X:6ýì‘ÏdlÜ9ÄÐÌ“(IÖ“¹Õo—‰V]ŸfhVnýûÓ~š}9˜³‚´Òï Êä¿BG¦ýÙjÌ4Ѫù{ùŃZ&6«”¶9z¡&?…Ro¼ÄÒsá‡cý^šc†ŽÞZÿô§Ð:]ƒ—®5SDw 8ÍŒßëøB,ËDë±L,@9oïá¯÷‚{ã}ÌçóÍÝÞ2è—Z?AJ“Öu4Í<, ’µåÓÊä¢ÃœÏAd¹X•}SUø±wvõto®AP~Í‚L¤ÇªƒÑw&ÑRk/ÜjM$Áj ó_“™ò4Ç2£Ï"¡&¶¼ZNo’ éoG6Ñ&¨>YŒç‚d"$“©7ÊZ÷¥×uÈêŸ)¦3pe Úd"ÝãÛ"I”É6éxþ»^ŽÏLfHd ˆÖsef¥¼²<JóÉÂÂ@Bc"­ÚàÏ.³,Ãľ~v9¾xëÇ翬”¤iI •§Qç'çÆ_Å~}8˜ŒO\co-¯TÒdZ’i öëDô©Šô·%Z˜&Õz^½Ì‡Ò!yZÕ8KÔ²Zµ­ k¢yñ Òi㣟‹i1Sh~ L,Meä±±1¼”¡¨xóFõ·/&Æ¡•…ýþרܢ(Í+ø³ûà¯@GXM¾P§ Pzw=U­T ò Ú•çÓ!ék½Bi…N‰cS¯†Òñb*-VËkSµ¬lk4zC™Ð,Ò©T*”»>ÎZ‰Ì^£”jW½ØœäHf.‡#!qìñë³ÃŸ ‹!A¤BÉ I Æ‹´—*q)«²ÅœX¢¼tÚ“g|1%ˆ2õEšä–&ø¼E­‘š"·hB¥ãy‘»Æw ¤ÈÔ«?» þ tÊ„ 4äé*§;‘–@ˆò¼øB¡@`85a®žsùêy]EA(Ìy™•JVšoMA5Ѥ¼ƒLT17IÉÈ©Y€¯»’H!ž”Z§¶˜h=ǧ›'‰Ð…Ål%¥´N·#—ÌÓ¢$W‰Z7 6¨NEêr… CS ‚鉰۠C&*sÃÍ¥>¤`dqyÎ!ó¸Ãõ@ŸI^#®´ÂÏœ´ JÒ©b<™LF¨>²œëË«ìPÝÌG’|* ¥ š!ô›ëÄUPik9™ˆ-Êë¾ RÙ«@Úë¦y-áæ–*›‚r1òr.h>TŒ <’¯Ko òr.Šò¸ÂÕªM}ÙõMšÝBÆÍ`Â*\£³:2œZµ¡áóQf9{®Õ›M.·¬¡Èëgv[,¦æq0w_ —$K,’¹¼# J‹C•ŠîcŒîaÔá¨ç£¹H$y”Ìpª’øI *´j©OkB“ÞL…ë‘d‘çI=õ>—YšÊF)ljƒ‹¬I—7hÚ<ì@ë>©u¾äÃpÉr!/e‘ד뇦ÖoL—›Ú¨På4º,.£ç8n‹v™(­N³ÑØÚ®WaÓ;Íuó¾B¥÷¤õâÍ,—ÕilôòuGØâ–6ú•–šÛNõrÞÇgrõ`Б<;Áp‰11+MgàT©Íj£›Õ#W…zú,FiÑ8¹.RÐh0ë›Ý¸E'ë­ˆ<õ­w´zÊ`0«å5jÙ}mV`Ó{(Ãú~PƒÙ`vââ‹íѦ0ÌV=Ùa¢¹’R«"_ð›Ç4*«^Omì@¢Ýáuµ€Ëjvª½•ÌbUº†tç?x›O^¾ýRÇѺ¡SuˆŸäjš׫1“j|‹Ûè‘6®¯K¾–}€7;ÍÖ-.“YÝÔù»–Ò«õÒÖ¤ )a²q£ÊfËÔFýúÚÃôoɆJH'ÚT6íúFY ¥<ã°õÃfëØšˆô¸Çl&óAT6‚´ÒêÖq öb¡P&+ărˆÙ,ØB«Ò“jH=*ÍÆV[òµ´m¢Õ!JÙjÝ©‡8[±ns””­u䟶¬‘P[…òíàâ‹m£P(Ú¼«à¦ÍßI—«:µaµÁñI‚!YXš%iØxJ$ë1,fÕF{íC¤•JeÓ(;[Wl¾–޶eÁµ«zãßvý¸¡:ò‡°)\5[¢¡±¹¥ñW¯?á‹¡BFZf¡çßœN™ØœnG’,O‡R“äJZp?ç¿=›¢³%šÉ/’,åI Ów6™µÑ—O¦¤ÝgDi[Š\Ø„ d³w¢6Z¹8Œ8ixŠÉ|ŸÛcŘéÔ‰R¥6¸úÈF¾IiÁÙ€ýW„Ú¬›ÞctùÂA‡#Øg1™Õ¨DfS6]¥÷˜&·ôõYµ8â -6 Åfµê« E‚tÒž%¥Ji½ÞŸ}M‚ ‚ ‚ ‚ü•ù} ØhÍ#IEND®B`‚ IHDR&–ÝE³(øPLTE¸·ÇþþþúûûÇÞ×c­—B™б¥ßààøøøüüüýýýôø÷«ÏÄS¢ŠY¦±ÇÁö÷÷úúúéóðÐåßËãÜçêêãðìóóóâìéÝìçùûúØéä|·¦9”y.’tM ‡Ÿ³­âããðððh®™aª”Ç»±ÔÉáââõõõÂÝÕg¬—ÁÌÉðòññ÷õLœ„¨ºµu´¡Ûáßîõó®Ä½‘¹­ííí<—{j¦”ÌÌÍéééHš‚º©ÏÜØ—ȹ§¤çç窳³´¾»€ –1’u‹•’ÀÄÄÔÕÕÜÝÝ4“w] Œ¡ª¨ÒÒÒ××׺×Ή­¢êëëöúùÐÑÑÀ±O”€•¦¡¼½½ÄÅÅ\›ˆT‡sœÕçán°œr•ŠÁÂÂÊÊÊääåÚÚÚ»ÊÅ···´µµÇÈÈØÙÙººº°°°ªªª¬­¬¨©©u¤–‡¨ž¡Ê¾ÏÏÏ®¼¸²²²l”ˆžžŸšš›¡¢¢¥¥¥—•N|^€•½±…¢š[•ƒ–±©e”†•˜—¿¿¿<Žuz­’’’“¡[‹|D“{z”r ’o†§§§ÔàÝ„—’B†rrŠƒY†y¿ÒÍÆÔÐ~²£±§‡»«…¾­]€vˆ‘•Å·u©™ÈÍÌH~n‚‡†œ½³Kˆvh¢‘l‚|ŠŠ‹†ˆ‡‚ƒ‚2rb£:‡pàèæl©–;–B`tRNS@æØfhIDATxÚíÿWÖÇKXë#ýâL£¡mŠV!Ý“‰01aL¶á‹@ø¦%$€º‰2ÑH45É£VS»©5vûìóo>çÞdB4Ùv·¯nŸž÷O’¹s¹Üû™{Ï9÷ÜQ£AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAß%Ú[>þûëoýÃ[ þÖ½ñûå-÷ïêR­V%ÝžwômŒÁ 3jw(¸‰QG0MÚªzàO{Û;ö±³Îô¶’ÍÏÆýïø¯ªFT¨{ïàÞ}£‰výS³ß{ÿÍ/íM­z ?<Äñ‡­6 «ÓîPpàБw€®®®¶£Çºí³Ñ´kõÀG<ÿñ'¶»Áô¶’ÏŸîítgYƒîõ"[QõžéÀ‘Ÿ ´ãÔ}zòÔi§ñ—>w[Æ‘ ¢ëŒÛêé1˜v(H8ÖÉoÒûùŸmvƒN»cõôê¤tŸÕë´›µo+©|&29kÅšQ'»£ê=ÝG]íý–è8í–gïÃxì~YwnÇ]ï<çó{,­£¸£LxqèœÇ¹}†Ø.“½.žwœ»¬ñ­?”BdrÚëõØZ "o@Õͺ âE«7§îüKÇÚ„{lT=ÿRýZÍþË.ax$"…§a7™8D}ûЕÑÑÑ^t³†,;ÏAäó_¾äÅñþh,·èÞZ’~™ôö% ÌlhžìŠª÷@|G‚ñÚ ê>=y™ûø/UÏ¿V?ÌQΫ§Ï&SÉôDˆ5íPÊÄ5žÊds¹|¾pmXà{¯»™Ð.s|Ö}öÕáT2)2¶–Ñß&“}ŽÞ‘¢ÛÇ8Y\uve‹L:yq,ö{ìªéV ~h2‘èµ>Ÿ?·~ šRùR4èÙM&ÇÜT¡0]žž®T«7nòâ­l‘ Ù;ÝŸk8RÊ&c~ç.2±ýÕ¡Ÿ‘¢± ¯e²+ªÞûô¨žfÏG‹dIØìÓS.¾ó¶»´:Éì¼]&ÉlJú§drgzºV+™T§8~¸&‡­­SÄ6™˜,ñ°\*ebÌ®29ìÐD2Ñ@Ü‚ÆÉ®¨zÏy쿹©lÔç±›6þúá]ž×_“åX"ĪzùmUíP?ÈÄàdÜrFŽù¡® *2™-—ïÕ¦«°ìäæïóõ…¨ËnÜá.øl²{ƒéHF Xmæ·–¤Ÿ‰LS¥HÑŠ2ÙUï…Ÿâ~¹cztÝ«r*[’}^•x´ZÓÉw÷ðÒPU@ —Þßó®Ó`ÖMêá1Û¬Aw:´6Íhi³"uõ “[µrmºPŠÈr$ûPä.&ÝÝ=æÖ<°çë ¨¨[ņ˜p,]Lx,:¥]ð/}¸gW]?ùÙNÉ£lî ˲ õÈîo™KËU9fãï"éJ¥št[U29yላ8 ]§¬ö“»GŽ:ͺMƒæÒ»Ÿë‰ä:Ž2ö¿??qÊBõ¢Ñ<~òñÓ´/FFS‡ïÑA<±ý¯¶°]‹LÊՔ䄋ю{XÉJ¡ærøÞQzŸþÈÕ5o4ÌpêË»“>_"†éÁ/¾ü&¨3|}Ù!@ÁC-vƒ®QðÝgGº:EA?<ì˜)J‡:ÙµLÀ™Ôëù¥ç7JÅø†{¡]tèù•Õr>ÍXšÔøRÔ4"]ûB‡ë↠BSoßêñîÌ>o‡~ÄcW¢cûF]/¾óƒ/ÕáÉSªšÏf7U2»$ 0ñxw` d2]ˆ3Ú§à”5C*>qö°æÆmìi}ûY¿ßê±´ïâ†$çWoÐôž¶:-úIœ¯Á²›qÚ1Ķ3j™¼{„¾" [[”üÎF¿ïÿ^Ï ]^®Ý+H~[C<î‚ç“s urÐÏ£Ço×Å»A –rýÃCðœ úöv—À CÇ·ë¯3' Ð_ 2aº=6탗é”4ÚA+8¡˜6eR)$a-[â _Ÿ®&‹ÊŒvò+”wõB;Ä+“düM29Î0qâ;™œzê";Hð¥÷¶ßӣĄT2y(ãbÛµLötÀ¬q“_zUÎøÊ¿pAÉpQŠŠ ãïKÓÚ†Lò`&Á—ž|Æ ·æ+U0®‰L¼Ã‹/®†Óp_6ÿ¨Îsc’Ÿl)2-qYtD—Kp´“$9“ê»Å×£^Eˆž‰ëzîÕëµÕé¬ä‹c$vgÔ29Öëš*?œã—Ö RB‘ÄÁÏÅÎÛ¥;ÜÒóõJ$¨ØŸ~/‚JŠR¦”Ïårù¾Y˜ø…ÙóI/c¨±õÞ¤#¥<¡oV$ŽR>“záê©Q×Xš„ÒZÓ…vÞq:““YZ´°Pçg‡ )‹Ž&'ƒsÎ~ÝæâõcÕæl¢Ï\-Â}ðý9r›~ÆðPy±·õ£}éts¹.c¢'R2[šI‘GÛLe" ½h;ýÍÇ`‹·æ MoëB§04é–K¹m@u™ãgÏ’•ÃHeâ‰D@”v#‘ ÷°\©.B1˜Ù`:™4b‡ ™¼^[/磾8ÊdgÔ2ù½Êús_©ÁìN"—¾à#RnyîïK÷ª™°·±¨ˆg¢R2_È•’4¦³ðº¦ ³é@ßµ/FT’¥W3S`s¬ÀÔžöÛÌ n<ŸÊÄÀD6~ÔÅÿÔï&³N6™‘£r„Ì*%¹HW'‰z‡XžÏW§ ´ ?ô3ç¢D%¤‘dù¦P_ÃݤÅD&óɤ¶Z¨L^®Õjå |eD†–ÔW³RPyìþ‹°è¬®ƒmCÛdÔ*ùà2Ìì•Ú«%~n-Ow]ˆï34)ç–—þþüF5£¸ïîªÏÇ2 ’T$í.ÝÒÈMA˜[»WãŬ;æÐ_É ’RFŠÁÕôùY^|þºFÖ1‰ƒ?ŸM¦áß'¿êÕ_Ë Z2vƒ±“JÊnh›L¸ ¥ÅJZbÁ€g§S¹B>%CÜéÔ8'.ç•ñ'2™ÉfildÂÝ_%TJ¤`ìš«¾Pȸ«ÖÄ2Oõ®åZm:/ûÐÓÙµL⇪å×+¢x¿’!ý¬ÝçÒD’¹åÿVn,fÜÄ0 ÓÅO“reÙô3Œß—œâ„¥åU0^œæO/ó£)sI&HÀÕ {Š—~\¥""2™:¯ÑH` ÿã™Ø1™Næs¥HÌ—`ºf<Y*¶ÈÄåzq8Y*TÀŽ‘!>ÖÉ=èÏäs©hàŸ(΃Õ1OÆß@dÒ;“ÏÃ*“¹‡«ëëµB„´4ѶW5•NPË §I¥~'N&;£–Éû'ˆL¦Ë—„új‰±ÿ8ÄÏž—K…Õºx¿Fl£öpFǤd®•‹~¯ÓfsÆÝ.„@mÜÏNðwJ‘|!Ÿ‰MÄCN›Óë¿îŸ«eÒ—+‘hꟿäÇÎE² 'RÒÖcsz˜`Ø]œˆ7îÖààú`¹š³%W­TªÙ¨&Œž£znà\©P(ÉaÆã$·M^å„l;ÛM ™$ÝLd²´\[_.Å^§3t|”[®deŸ—%¿ÜsÚ¡_(Tó¤RŒÂîLKtm¥¼X©Þ»)ÌMÑ€g'7u6“Ï Þo™ø¸ÈÜ#2™Ð%Ý`6,Ö§záåÚ •ÉãwÄ;Ù,H°ôЫ¡Ãñùú½V™°W»¸9 #š'•5ët»ÓËøýVÅ#&2Y]}ýz°Lvˆ©Jóóàe}}† ±Èh p[lL\ZËÓ p»LVk‹rÐc1˜Ùþv×r5O×NøédOg,ŸƒÙÅiø­‡á?µL`5Y©-V ùeA¼?sÇgmœ~&’¢^íÍ{´CÍD&ú°LèëDª,‡ëÂÊj­ªÈÄ5žÍò‘°UÙ¥3Ú'Û¹ûƒ0V-2ÙסÌ”rY9§ÙF`/,Î ×6âÕõµ×«J&Á"·Ô™Ñ€L†ça6K‘Ü&RÒÄúAkÐ>0’í[eR_-צiH£5íëpM-ÒKÄQ¶þòd!CÃdÔ2¹Ð +|7ða_.€¹ØE„5'›/îˆ7åKÄ¢ 2H‘É„š‚4Tu¶.Ü¿Q^$¡°ïº¸©ˆˆ¬YJøÜ|ª{X›ÎE·ÉÄ5Nu2ÝØ¡%nfíöÆþ]tV_¯×¦‰gŠHa¿†èéàe×ðL© LôŒÝwA&…l–²™Üœ.W3ðä¡þ†Lˆß®A™ü¶D×ôÜ,Ȥ$Ëã<÷°’‘.êŲ,ô‰s $ç,DeâZ€QÚØ…ƒa:^nÍO2™­æˆˆš¹&2×Oƒ—²M&Ü8xÀ™f¾‡RØØÜî'2¹qoµVÉ‚/•ÒÅ £ä‚LêƒYE°¹¡ e¨LÀeñ°­2¹W­PGÔµÃ5^ º¤©((“µLŽ ®©¾êb2îë%¡“®w$J–…ôYûKdhÂìržŒÒÆž~Ï÷a„ +&ìÊt.Ÿ Ç›"2Ö»¦À²ZdòI?›Ëåå€WIdÓn¥‘H¾l¬ðŒ×i§6ÄÉ/ôÂøGé-&mâwóYè¼ö™ ߨ*þ ™äamr¢L~ê\ã•*Xª‘ŸøúTa`˜ÿOè×àÌ wÀˆÚ5Fðtfç Ê ¤°ÿ[½0ÛW%Q ƒ³¾±¨ ¾rõÒeüÐm2!žÎìsÍ-$••n›Lò¤-¬vC&y”ÉÏgKtM˜[-Áö:ÝcœÀqÜòb®@úÑyõ'˜Õó4¾¦a'8B›ËÊÁg"ÝæÏ™'ÆD¸DluÍh Ȥ¼Í„5® s *öO÷þƒž+'jØ’H°)gyʉ÷k¥„Gð»RP¬jv›L4ôÏ›2QŒ Êäçð™€[i±>íåy¾¾0 ³€ìóZw‰·Êy%¾¦›¸&7k$}™ ჯôd‡¸¦8ĦÐ÷’Ÿnf"ü´79Ä]÷E½@Jn8Äup‡¾&‡¿IËÞ,RÐðøyn¹°¡SXó\rV±ªQ&¿ª8Ð%€»‹CÂÉZúg^|¾V+“='ûÙ]aåF^q.ŒX’`Ù‘”èÖɯô‚(l„×´¬oÆÅ×Ç’áxÁd|ÿ™^tô¾)¼f0ÚÏ]½ÝË€ ‰0>¸ÐÎsO!^Ó¼U&€ÎË•k!¥lb“”‘ìñ(ã2ù5Ø"èÔÅ*<Ý6ë»ÆñK+këµj&lµ˜»ïò/ñ5“Ý{»Œ‘‰qÚ-àÇzáùë{JÞ’Áyn$6Úv5îÝóm;/žiáê¶=ë9ë€)ëÁä„ÇÂÚ¿~¦ç…ŸúýL\Ùˆ{»LŒ–0´N¼r¶·±Îc]òRxÙØúÓêz¬ýCâf Àù¼æ¥Ám2ÑšLYÛ\C‡.Óå"¹Ï‡‹á@BCö½]&ZÖ+Ã÷rCONŸè»È1"“fzeò+ îü³uñN_µšrƒIi²÷ƒ¸òúõz9 ½¨ÑèFD‰â¼!¤êBSŽÛ±Úœ°´ÜÌ‚d=‘GÍËú»çb#½soÚ!†YÁ[¤’Í“?MƤh:¬œýVÉ¤Õ 2Û˜~¢“fžF3Ù\^9—…2ùPõý§GõâÔù >ãúðBmõÍv4iŒg{ë ‹%%bbC ‰æ¸’cw'cò£¥¿/ýؘ/´›5éæxnôîñ´YàæV^ß[Œ&šù&ŠOJ¾ÄËÕÓÎÐi)ši¦%5d²¨ön®:vo0:¯4„Ø/‘\¹RÔ窑–DscˆLæéqÅM™i% KŽš?*AIe'y;[-C&–ÌÓt :c¸S•òt^¢~ˆÉÈ©T”^Óê,ñ@4Õ7óàÚݧɨœ)å*µÕÕrŽæ§íò+©‹©L&’I–¦¸¹Wë5åªÎæeJ4É‘Ôã JÉüüµkPÑ$©h#ÉügBJQAm“ 9‰\”ó#ЀÛýÑIÎFÜJr$ë:S4É‘¼@N%ɹv*³Sùr†îé4Kââ]i‘‰;’J6’»ØPP³0&9ð´KÓ$™î¶™X2L¥|!—/Ѥõ\uzzšX5$.jdmñ`:£$Öç³Ùü-~nù^9ONƒit=ÝÅh¤`SÒÛ­ 7RO–V”ƒ¥CI™Öh蘦è˜n; l´‡1P"½|?Émj¦Ì“K¨ÅK§×'e"ôŒ<ù­ð ‹r&î¦;ÄDˆ1™”D™ì™X¬I&/22Óõ¿;,E¢n¿“%Á òüJ4ÿ… £(§èù *r‚" X{túVìØçeéHŠ«È–æÂËÕr¥”¦û÷–x0&¥éQ ¢('–’dœ¢JÊðv2Š:m©sû[ÍïDŒ|¹n.EbÁ¸rPZNK5‘ÕÑ-¥¯f"SdÜ—–6^¤%´$¾ßdÔq+£Ý“ÇŠ^>Õ“ý¾bÀ¯|Ò˜{¼‰p˜¾âD&?,‘óZYxž3²FADx‚?êŸL0á,©T2Y¹©i²9Cl€Fµ³8Do =Frš$M«¡‡!LМb,ÜÄ™˜ 6ï„r`ŒÞuOÄ›Çù,›-58­Áp8á%J#iOv?P$gɨ.HÉ@ø¾¶å…J&Ðõq&áW2Q5 „Pœ±*gé`ÐXgœaù‡4Ï †Û-É‘HD–èN0è÷’“Á﵉ú6ß„/Pt§Ó’$¸ˆ/]Í)¹…ZC§ÛÏ4ÏkÍv§u¢˜ŽÊ‘ Ô”vûEI94±6/£#ÝÚP¥pÕˆIä>hÈ™$Çk•j£¥:KÈÊ@ŒQ©ÄÅø»›¯‘„ßäm”ü­‡á?•L`Èl¯Çf7+o1ØmN’p¨¡Iþ¡¡™Db°;ãþ`¸èv} Æ÷’½~rÔœÝ×λÈT8¾€4£8p/èž1yˆu,Ô£”TtÂj¼Ìh * A¤ä+hËè7†lv]KCæ Õšð5` õl‚–…B¤ ÍšÔ„†Ò”/ïaU6š&»±©†™¥oûl “Ñl`Y³¢zÑn±³›ïѱ=¡x7ã‡çÑã´õXz”[µ¦î‹z^è½;ùÝ„ïê7íàµ^9›Ì”P T«3Ø-Õ IŒ‹Óceü~?ÓíU^j 44Ç¢zkë¶uæ ¸ÏJ´mÒ6à pŸŽ=ˆ‰|YãDM¢´Ð—œ(5%q2Ù•M•ÀÀè ’ ؼdRò •O&£ÙlV•IÃZlN'HÄÎÌúŽë'ïæÚ šudsJêìF=êŠáô8!¨©ñ>êUï–Þ*¢·–l!÷)o;'o3×lVADI.mTiÒÑFÿÖcðû@õ¾4më»Ó¶VM?˜pèK©·Œ¸Ò‡G›Ñz¡÷z„ö¥ùóÆm•(õha¸hEÆ–ïkmÎÖo§Ã ·‘÷Ók·´Xý‹4­Uìøû_­9ñ“#? “ÝžŸ.NFi|#ó‡ðõ«lZb=q‰…dSIð^2©,9ìÛ š!`¶ú $Fm¼³„D¿ ùd4ŒïrFZ¦“Fì­)”RF"ï¶ù%¯¨Fþ_ÑâªZ<ŒO‰Â–`å!/Ôò` Ù®“5p§% í$¬øFM„²U'$ kõO}ß„ßê±±øf„ÒK·Ûœžx<îõ8ßòÿj!LZ„b6°v‹ÅNþ—> ¢fKŒTk¢üÖmBAAAäwÆÿ5M–¹¬U3IEND®B`‚ IHDR&–ÝE³(ìPLTE¸·ÇþþþýýýÇÞ×S¢Š<—{—ȹøøøúúúüüüãðìh®™4“wº©íííúûûØéäËãÜÐåßÇ»îõóÂÝÕaª”.’t±ÇÁðððóóóö÷÷u´¡c­—«ÏÄÕçá|·¦•Å·Y¦ñ÷õn°œâìésœj¦”áâââããéééº×ÎB™g¬—ÆÔÐçççõõõÀ±Hš‚l”ˆz­ÐÑÑÔÕÕÜÝݨºµääåÒÒÒÚÚÚéóðêëëðòñÝìç±ÔÉŠ±¥9”y´¾»¿¿¿ÄÅÅÏÏÏßàà] ŒT‡Lœ„®¼¸¡Ê¾ª³³ÁÂÂÌÌÍ××רÙÙœ½³M ‡‡»«¼½½···²²²ÇÈȺºº°°°ªªª¬­¬•¦¡\›ˆr ’´µµÊÊÊO”€žžŸšš›¡¢¢¥¥¥r•Š¡ª¨•˜—’’’1’u[‹|…¢š¨©©§§§e”†“¡D“{‹•’—•l‚|ÀÄÄ…¾­ÏÜØ•½±àèæb£KˆvŠŠ‹Y†yˆ‘öúù®Ä½ÁÌÉ‘¹­»ÊÅN|ôø÷‚‡†§¤ùûú±§„—’[•ƒh¢‘‡¨ž–±©u¤–rŠƒ<Žu†ˆ‡Ÿ³­‚ƒ‚o†]€vu©™z”ÈÍÌB†r~²£€ –‰­¢^€ÔàÝl©–çêê¿ÒÍms÷tRNS@æØfÀIDATxÚí›×ÕÇ\D2¤IÜ+`ÝB nêÊÀŠ‘ša•‘Êò:$k“Ôší&¦‰Iªfý‘4±IÓ¾ýGßsî 캚Ým­é›óyžäæÎÌÝ9ß9÷œ3÷Ž6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAü@àØ;üÁö$ÏAƒ <Œ'’aÿF†±dÂõ1ÖIäPJÜŠ‚þ¢ãéLÊç´oÜRxs› ¥RÙ\€ÜÉ–„ÃÓÌŒ†E¿SXû³p„M'}›ßÊ[8ܽG›;–— E1°™8fæ§Ž?^šC”N$£¾€w“3o1æ9™/W2áÀVdR­e‚aÿFÇ%& SÌsª– e×új¸”§ÙL"šÊn”}ÍP&£îB·ßläórýwéieë¾ÇÛ¶½°º£õ£Ë­UT5 a²}";t×çrñÄ~R¼R ˆ~…Pîq¹_‚÷¦Ã÷:J%4Žû!ýy™xÞëõÚðëªx„Ã"˜¨:vïc÷_~y›kbd®‘=%žÄ~ð{,ðâË»k¸7üv×ô•jº ‘Ž×Žpd/OdÛdc'¯ÚLdÒïv{ͼô‹éôëìœiãçøIØöYÈÃÜó‡N?WH'’ÑœKxíƒí¼.×>p`˽;rp û8#Ú¾}:Â<¥óçKÁ»y):Ùž«^eìÃ¥~93CÀ†¶—±?.w5µhÝpp}ÀÃKðŸgwJ4;â÷Çœ.ËÄ}l–㢾şÕZ4ç¤qgS„g·3¦Üw² ŽÃg)âùۯϲß[êåk¢Ëüñ×ÏÁ…>Q¨Hå“7Áó·;„5ªœy›îBÇðb¢¢–ƒÍ_d³íZ2Ä­cz¸Ó¹LìoÁxSºR‰ëRþä Œ ž•*8×™BÊïu{E0ê¾^ÇY.“«'Ù'‰\+F}6÷ZoËäã9æx»(¨‡æAPJ-déÄð¥§Ydai©kÈñ"üú´ðó‹°¬y{Ȇ×ûÄòÈÁ¾‡±SR‰ÝùãÝŽ\ÍâP—÷pÏÔ*R£­4›—æØÜqƾTõt1Ëmô|’(Hr]Q´Kp³Ï²ÈEU¯bÔŠ2y;O³14é« ŒÝ™´šç‡ºx3rȼM+Z2‘ÓÑ|ÛG}·×Éé0ÊäuôSñïƒviĦòÚÛX&•x:õóAçô+Ý“$ NÒ¼ ÎO‚ø™7tÄÊU¶¸ôõõåŽîÄÿ˜ÿ/Ì|7—>dì›.Ɖ|üø"ÂæåÆYvç/w;DØÉUò<Ü»'ºÜÖl-à @/)u©šBÛ¿æaޝªz¾ÞÄÍÚ%ܼ8PxFÍerT— ÓÉ>s0ÏÑD¡\W4 uîö«ùtÐ´âØ›Äá°þW@Pó­‰7yBÏo z¾­µ £ÕúË}z5•ãñIhŠm_ÂLÇ%ü~£ãß)JõÔêBÜVЬXö>Èäî7·—ºZ9‘ò‘L6E¸VÑþ:dwĉܳ¿ÂØ-©ýþe©Ó€»šËd†y¾/èfËhi¶fS»…2ù®‡5 ´ýn6¼×e77¥¹ÁÜROË' £æ2É7ò…¢F–=l¸/ ­Í¦M£tãbïk¯)“ȹ V¾ÿäÀ. @ bðtNž¦Ïß×eˆDÓššvÁÃï©5| Èe²¿ÑÈëIh‰2ñ¼ÑëõFZh½ÃØ™†š Ãx„2Aor÷믗;M© ÁÉÓ6ÂÏAflE|sLŽŽ¯£Pb¥“eí¤:—{u¸«Q%;.@™˜=³¢LÇíd:R|Äá6wª 7Q ö”庶bhèIî‡@&ÓmônaS&wƒ…n¯ÕnÈrcÙÃö5åBU ±I|š-^^ZŒŠM¶>™t—þ šè×u~·C0¯6Œï{Ï43z˜=Ìs!žG•Ôóz¥PÐËŸCùÍÝ…æBÂzÓyÅÜ\€Íx›;ï- šz1Çer°­µ¥È’í› URÏ«¬H2˜\8–Éj.2ûeÆì¸¬×a0L”£ßjÞ…Ššÿc?¶òÖB·ƒ “¦¦”0Ê¡LÞ,--ôhYÑÏ8Ø…V[Íð0Êå¯îg³Ý……ŽÎ䱟mþ¾€ÀôV«;¸}î¾fƒXa;‹|))£eÆntûõ šYøh†9NH`!­.Å!íLÖÒõèèëeÌ…¼^È‚N©õÖ6`sT”ÉÝ…–:–‰Ò«À€ðÜÐsBohošÄ¶ ½œ—¥øX&–B†¥©•¯ä6¨‡.ôsYëõVßh— Õ$ô!.9اï¶ÕšdrSk5óû¢L~X¸‹þB‡–™C%vv¤aIÙŽ1lr;›íu»w&T7Ùá£S(“Nwp‡y~„Ëò{ÿ>ËÎ_“µÑ`‘ÝèŒÚàaàÒžb‹jC I‰`VÅl¨²Þä:¤ÌUÑõæ^ÆîçÍÍÅ0ß\=¾N&MC:³ÛÙ°.¡Õ–ÒÐÔçóeSÉtE/@ÊbÉäxïòÒò ¯AÜ¢@%F]Ǩ «9÷óÍ'ÎO&þÁæ¾Óð¡°×”‰¡¡Lì Iá.OeRЛ÷§XÉhÕÍ0Jp÷Â×^_‘jÙMtÜᣣp=N¯ÿŒ:=Bç—sÃýàŒN„íÇa[‰ÝP•Q¿YN„|§ÓðÁãß^Zî£LžŸa½nŒà^†´“oNmgs·—ÉnôÙ 8%‡Øér¹þl(™É„²1+„=ÞYº~w¹‹ ú†‚öªÞ¾ö2?I_“ E[ Nó…ŽB&o´yì½^&ÆÂò`n(pîƒLZ¼küLG3 .›§m‚ÿ„Ï¢Lz}Mòû2ýû4ó|\nZkž•úÜqxiA&7Á[´ ¯Á©º|Ÿ3váò— Ø~FjŽZCX4§o7s\_àÕþdŸaWaôâM­ª+àÃa³^kÉäëëKƒN…‚ƒHr^É †F¬ÍKjv§ø"H´[…xdLfz‹v8éq ÿ³H<ú£'Ä[Ax ÜÀÅ>ܰò9ˆû0ÄÜ‹°«p··ežÍ¢Lx*º£Ä®6Z¦AìhY€]»Xär§§aì|GƒôåµÝÒêzí &AÜÅÛ…7§ØÜ­Ñê…øbv«oÊ$!ÎßVU„¦x‰MK= ñ7lxË€ gu"ˤ7«Ó’:­†^+†Rø:æ2ýÌgGùI@`~÷x’É›=c@œ|X&Jß0k{™h¦äI&ÿ"¼ºv®2Q3!µÄ<ƒÎ,+µeÆóéà=»ƒO®¥à=ÇÂ"FÛ‡’ɪ,H&—É2Þ»ñ”ߟ¸‰S>t0V©†c<]@¿"Ú·rйïÌr>ŸÑ8çu»&ÄöØ5ŒJZÙJ@±Î™ÓÒ#bwl'Ÿ ádÌ 1^dŽ="Ÿû2±tû“ƒ÷a|’7·³áI±B&’É“B¦™c`p£Äâ­90à{ ƒî»3´—9”qM*ÝϘã]œŒî2³Ž!´þnaÀËkB {öÝq–8¾øçiæ˜~tyÍïÅíã§@k“ãT8+ÆœîeâÌB¤¼øCK|$?ça‘²Y®y¨¼F2ù2‰t^+ŸÈ\90&ûë×w—-¬}yÿæ´µ³&å̪S8ñX5êwú_‡Ï%H<ÞXºlÊÄ)¿Å‰²…Ä?Aœ:øèb½Ý)VqÂü½tÊpùwLÙð‰bѪŽl$1=ôœ;–ˆæœ®m/ÃQ®H0æ˜ÃÉäIo{(}>Âu00Âï ‡¼þõR·‰×ÝîºÌØE,œ`±Á›+žÄ¹ÐsWZÓ…®]Z}ôƒRJÝ?ÄcZÓDö¤WØoñ莔ãàÙ½ŸœÚÍSLßÒsRí2“¼{²«»ìÂç®è ©J0ç%™<1P&Ç?‡l…?¸q‰'æ†ßݽ¾Ô©Rsz/yØ—pmã)¸¶îX´zò<³u0s_ÿ3N$°d‚+x¥[‹ã9óÇ*ê9.“‡\)Z;qv89›{® –ój:8žHð°LƵùl¦ {N&£\Q!w7x å&™<)áWŒ5F}^w%¤Îßè,/-ôó|‡ '¸v›?BqúŠ•ú¹9S§¿’Tç-]_îC¦ƒ…+—J—µn@ƒÙÜSÕrc–}xûî`U&Šf…9N_° _º1žžö­¬æëí5Ó’ p†p}ØÚ®òÚ|.—/Ybœ;(« ¥e4esO.­Éã”߃,ê»–LÖ}G™(šY9|ÚFø/@°ûCø˜Ÿ¨»1þÈ”µN·§@téÅ÷¤âyEO扅kj]{÷ܹ•¿Ý“Êù†bt–—š”丄WiáÌEœVØn.²ÅëËÝ&ÖGp¸­®ÔÍTÖËf`°èýpnåÛƒ'óå<Înã4'@jª‚Ñ#dâÆµÈæ™Øóvl¶ Í\ˆÃ"踡´ù$G7|–ùgS&“ï6þþlüËÊ´†xKŒ¯—¥o.ThhÆ$ã„qFm4¤„YÊtúR ©®F«©´qÆÑët»¼ÌŠ2Á%¼º¬à“×J—ë wtÃßU6—¶[QÍßá€?¥¡Ò ¶\/¸ìr^¯á­ËÇ~=ß(Ç‹>¾è,VðõC1œa∡„Ôhjü 5-œ²j€[2äw{?ð°f‹ >l+®0Ï7 ¢:Œÿ\€6µ¬&B>>{ WžÃ€G²ñÃ5ë8Ç‘/Àpù‚iI.ã@ò@WÍèö¬âž|ÐlHéñúÔiã¿ËúlâÖ}‡ð(S)K…$½ßd+ 0ŠqÝz‹ 02ñ_uÅeâKÕ ðU4+jÞ˜Lè|ˆÀ›'Ðçóp­qYö;ž Öp_£Ýn×'çØâ ×ÁÂ]ŒXÉt! ›OcPqU½\WPh8§DVãŰŸ›båLA¯ÔRë^x5vpOèj'£¨¸Ì\/K¢ÏDѹÁˆŸS9sAèúï1X-à´ÊÇ|ÇÏ/TB´X˳h¾6!,âº\>iÄSÅd0œ³æ€N@7jÙÖhÈyI§‰D5Å*ÙG{™ç`¢–H*º*IÒ1ÈWÔúXùÂðl+&‹Qk ±à ø¢™4hJ†CÉeµP….8­w¡øRÉ®w¯ï¬¹§RÖm¸gvÄ5ŸÖrg. çHáâPüäŸÝ“mk¿»p^%_•þ´MðßZÞŽFE¿Ó| ç äDÑ XÏïœ11ÎZ/ÈølDPH¡R‰'2ÅP ÀͰéUóL—Ó‰jµšH§OL ÙÜEÅè7­y…®˜ µÞmÈeC™D¼¢ë•Bº† Ä­¥æÐT ¯e Õ[KaaÞkG_Ì;ْˆÃb̹úÙ?~_Áºïî€ßœVI¡ÉV€È3àÏåp~¡»¯3 XïˆÅ "à÷ÇÆ¯vàQ…_Œ†lÉd±˜ ‹>[Ÿõ;¹z‹'·'®e’¿}f/¾›à+¹9âsˆðf·»lþœ?àœ¼·Æî‚¯Êd’ÅPÔz§§Ä~é¸VÂà›¬±ëÖóbW Ý1§Éâßå8'“¬ïã¦^ÞÔIÎdk€0lk^ΧN^$Ìeã\ó.fþC,g³¢/‡sÛ>9òáf#«ªqEÂe;ü…yÜN6Þt|nîXÎ'f³¢ˆ2u¯¾EÉîú©÷–[&‡>øEèƒ8y©µÁ {º¬ƒ¸Í®u1þ.¬iêu“3Ù:ýsº,Í 8æà3Aì¸Ù|Þ’<1ï‹Äsõ„©5>74ËëÿiËÞ.|CñæxKûO¾ÜÚò(VÜkæðÿÛáÁÏ“M“ïë¾OŒu˜ËÄŒç?ßÏ_ù;ÿíÉ÷óõ¦Á ¤/øÇ]ÿ3 ~ K5‹°5ãzb| -Ñ%LÌघ–êMÍ*¶À—4ÔĆïý%~YðÜ!–Èí¦ùn›–¦È*AÑÓîñ³Á*YIn´Ei×ø‚sœiô´ûFü|àõ¿˜Ê$ ºM*K’^Ið¹‚TB¬Á,aù²¡b­šN§µbНÖ{Úý"~^X3ŸN…¬ÕzN7©„XU÷ŠÙü@ à¢q‘x4¼ZÆÿÉOÒAAAA[çÿÔð@+þºIEND®B`‚ IHDR&–ÝE³(ïPLTE¸·Çþþþýýýéóðn°œ4“wu´¡ÜÝÝøøøúúúúûûüüüôø÷…¾­1’uY¦ÁÌÉîõóËãÜØéäÂÝÕ|·¦.’tб¥âããððððòñõõõ•Å·h®™c­—aª”—ȹ«ÏÄö÷÷ÐÑÑíííº×ÎB™z­¡Ê¾sœS¢ŠÌÌÍçççóóóÆÔЪ³³áââääåêë뜽³ÛáßHš‚l”ˆLœ„ÀÄÄÒÒÒ×××ÔÕÕßààu©™éééñ÷õ9”yb£Ôà݇¨ž¼½½ÁÂÂÊÊÊ] ŒT‡r•Š¿¿¿ÇÈÈu¤–ØÙÙÚÚÚ~²£‘¹­ººº²²²´µµÏÏÏ<—{…¢šÄÅÅ···¬­¬ªªª•¦¡\›ˆh¢‘Õçár ’M ‡´¾»g¬—¥¥¥žžŸšš›¡¢¢“¡°°°âì音­•˜—O”€¡ª¨ÇÞ×€ –z”’’’§§§[•ƒöúùÐåßùûú—•D“{±ÇÁ<ŽuY†y‡»«Ç»º©¿ÒÍÀ±o†ˆ‘¨©©Ýìç®Ä½ãðì±Ôɉ­¢N|B†rKˆv‚‡†•½±ÈÍÌ®¼¸l‚|ŠŠ‹»ÊÅ–±©¨ºµ[‹|H~n†ˆ‡‚ƒ‚e”†]€v§¤‹•’rŠƒ±§^€j¦”„—’àèæÏÜØl©–1°ž;tRNS@æØf>IDATxÚíûUúÇÏBnk‹(‡\¬Hƒ4 4aKÌ…–$µ™&0“„™IQÐ\È@PQdÕfÝEÙ¢~ÁwÝïú‡~ŸçLRZ. »+/ý.χH2“™“9ïynsÎ)c$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$Ò$ñïiŸÎ`yêg!=mÚlÝbcv‡ó »P’,ÃW®'GK’~óÜÄäV»Ý>ö4èùmÛ^p¹\ÕhÛs6‹Ë".ÛúËõü‹øáÏuûoçŒíp{¼>»k쥗Ø{þ±;^Ùõ‚ßowŽÿ’ø¢ô ç|g èÓŒÛU’^ ñÝv?0EœŒ“sÍgwùzN,¯ì±¸œ.ËCøü{JØtØ Fã1™Z÷Í©½ž¨ßn÷-ü¢4Í8훉ţc¾0ÂÄëñøüÄÉ8ýf?ßü[¯7êw<Àƒsö€Ãï÷;\?& àdòõdÊôµ ë1aÐﱸ÷IúR’¦Àš$öÒ™¸Ï9fWÉÁl È}"Ÿi½ñÏmDâè†u@ìâ‡~çõxá6þY8ÙÅ™õp¾PLÅ¢cû0±&&ç¦{sÖ ïùì>[$èω$½ÈùÄ|¾$'Ýû˜]& ¶rÅ=)Û´…ó#ér&뱯Ç$Á'Ó‘XÖãsþ,˜ø^<ºOQ«ùZN4f_À¤~LÓ ÖhÆâqàä­<š¡ñ|IŽ·UªªR´ýÒÆ» LNеrÌ3Þ>ãÚ´™ó\©°e}®µœ¼ÊùÉw*#|þóó؃6Y7 ½˜ ŽÇä]V_¨6[¬Ýê0ÖœgÃø|WKE¢Žq_”Þ™p^íêOŠÉ¡’®ÇíKb©`b=«ÒYßš(ä\ˆóú{ù¼œŠø~L<3‚®h4Œµð–wYî|³·Ôk7Ì0ú`N.tô¢ ˆÝø‹€I4–Ö½4–Æ!&sz·ª¥²„ÉÕ€Îæ›ÕbÆ»&ˆÝ1ð0ºùšÛ»>×¹¸íܹ™QÍÄõ^wÀ‹ïŸ;÷¼CTÅÄæaáÅT²\«d׆°¼ÀØÛâÕZ‚˜ÌwzK­¦ª°R^ÿ0Ç/õ¥$D¿«ûH¼pîÜÛØŽ5‰“$¹|q[@–Ãåˆ×a²€r¾A‡Ã¹¦’†TçÔ†çΞu˜|Üë—ÊÁûIÍûèŠØåNG•3ž51ìŽS9ØÀŸüÎãó¿þòË/š´Ýùâî:lž˜¾òÛ¨/øÒË;ÊfvNð;·kÉt%ô¯öÕG/cÃrïîŠEý̹j*†˜´›j!̵âÙ¿´ÔT!,f/’´wwþçõ-Ÿ£˜´>·|¶só;édy&¡ÖÞ©ÍWœÇÛ;ê ~Îæ½ö›Å=¬ÀNMMMOð\âÌ™75ÛdéÏ´,» ɱ‰ÏÛj-v?©yÅÊ7&˽V :V1ùã$Ò#”û$<ËùÕhÔçwŒ8¹¶s´™ü(;³ŸÜõùìpXŸä;e›ÍŽœÁõ:_mÆÉ×âAØoŠÀ¤Ùît ÉŒ;æ¶í«&-£0t’ôÇQaLÞîrÐë> ¡/óÄ;¶ DÞ@ãõ ë¾àQ«¹'ì:y¿Ã"öÛ´zÎõtÌãwRíäñr]á|Ï—œÿi¹÷Ô('þãç[­ìÏ7–;¥T|5ÕŽ “Óu¤aª¼Èù•H6èñ9Ì^ K39‚ÿr_¥wóD!‡ÛÜL0ù:“‰ª°›vˆÞK ÛÁ7—#ÁQ…ÝĤÓÇx7õÆoBlÒnõóɈOÂ>>Âî MNæðÿDk®#+˜\ÍdˆÉaÛAdizr¼hîX9D¤ÀÄ(‚+Wݦå|Žóóç'ØŸ>o)ÉÕ x˜’gùÇYi)i¸…‡€¿ m¿U+j¥Áñ >1wŒó¯ÊxçÚ…9¹tÔÜJµü7°}²À7Ëh@&&r¥271¹¶ÅÊøô·5xYúö vû\Ò=ª° LúˆF">§Ëß[[­¦öMÁûÓ!ï~ÎS:=½Úš‰€5`ë­‰‰É‘Vú*®Éß‚=S< Þ _|Ž·´²Ü‚蜕د¶&½ 6ñ?=µ8ʉ7Á‡ï”üO—o·õ@dˆÉ¶“œOßJKzUívß³ò:$I_hrÀ–B”ËÞŸälvkºXPªªj,äøDˆ‡ÎÊE,xX&¯’嘨®]¼¶ä+6K¢gO0ëžd&kr2ļ X2&½È¸u© ˜„Ý€‰„¦®~5U,ÁyºÆy`÷¸ V‹*&&7“,Æ §“°ò¹wd­€;ŸàØ@†ï¿ÒîœÎñË+wn/5!ΎͶŸe]œä¡^û;ð:·…²¨‘@‡‡ Kõãü㸅&Ïïæ|2ÐÕh ­èaT½9.Do€]š.'ÍíŒï=a—zª"—#NBlrèM®‰¬VÚ–c¹«åp©f3úóœÙW³e}hkV­ $é®7^ƒtîlshM¤‹/%Ÿ&e<Ï€5óVnÝSLAta11™Ý'kaqΫø„gQ­V(£s†×OiŒW±; ˜ÜþüÎrKÕR¯ý?»’ÿÕòä¡[w&ÀÁt”š;ŠAìÅÏ8ÿFS¿ç]iéðáÈ¥Ô? tc0hÝ.p€˜Ì·úÕbƒLr{“n7Œ®Êºpó²úJÇÈ'ÝQÉœª˜uö›ÍÌúØ%uµÆ…/u,ªØML¬öÌï9¸ãèg›ë˜Ð,u;­¾@b_˜æ¹«i,åɺÐû8ÿò´Œý,™˜ òXž‰š˜\:ßé4qÇn·1qXUKǼ´&·ïÜX‚|®L˜l¤(çoÞm­\æür[•+At0›B|úf/ÿ_—[XOA—rm "i“‚ª’/1¥;|~¯Ý+d—Þ¶Ž J°|‰¢C&“û¡×ª†1§FLŒjµŒE-ìÎv¾Îß§„é f¨ù°-îs L֊窃V ‹_úàHm¿–E;»|^7êÜzK©˜¨Y^æ¡»ºZçDL.÷zKí69Ÿïåø÷}Ëtëb“v£ÈPl²‘® LîýædE°‰×8?(+ƒÛpáF+ÚDáäíi Cïô]E+Öj¬X:½ðÝí{Í|:k—®Mò“…"Rbn¯ œAÜ3dÛ“³¢\˜lçõÅ@Am¬6¢QUóq`o­Ç„ÏþM7:­R 8ûŠŠÑïz¡Èja¹t˜ó¿JµŒZ-;“®¡‡˜äæ—VVzµ$‡Ãá³!~²ì4>¤–\~Ï·uþ÷öR¯YÆ„2Çk/„ug;½ȉ¿ÇJ,I@4{—ø…vÜ6brl=°3èÃZŽÅƒA–)þÖÄÄÄeºE­ºº³3Z"žÛK}­²Š ö‘×>çÀ×y)IÛˤk,œÆâé0„m/¯Ük7 ÁglI¿ Ùpð*ãïÉ:k6t9å†v³™äNž;o(`N#Lª²-è°&w–o£ç¬Ä`×ðN>ÛÀ/¥ ‹ãjßè4‘)ª®m(èý { /*N“Ä>}Ðìbü"Šó»g‘óËKÄÄþŸ½»º]L‚°Ïìæ—n,õaòϽ‡gÀ*ë°N4˜eXK_Åäöp-Öi6!S»c&²/ñÐ)¥Ñ4𙤨§ºüÁýð#šã,`2q¡Ù[‚ Úm’lS|ŽMô™˜„†þ"ô„xc½ŒöºÓì*‹!ÎO5òØÁ ë„¢ U==2º¨€Éì Û ï]þ»œÏ÷zÍ!&¡Eµ?Ðe±mÉná—VÚmãQ˜ÜSÀàü¡­—,v?¤çf„0´&·W–ZÍdߪ^*¦!Á®Þ߆@‹R8ßÀ¤ß¯ãu>€‰õk·øÀ B¿Lú@gÍ-ÊÍ„Ékš×ÿî¹Pø¢ˆùoÍòúUHB ¥p[{ 4É&&¡»ÜÄŽrßuœåüD«ÝÌ&~p:§ºM†µ—Ñöøfº×êtå0q^¤Ú€83ãY_út°ûÅúÖ½å^ÇÐó¥RA† 9” ñØÏë÷Ôæ@G|G’ìà9 U<œëAL˜"Ùà<€Ef3O "Œ&Lþ%qt,R ,ÖùÄ)£´ã'б@xç€ Ü¤pQ/îGcÓ4 ÷ñ° x¬…Nk€˜8 ‹^6šæ%^óäнfS}“W9û{wÐ@¤Ù(s ëuº¥b-L—mîìèÑîuÆtM\GO…]`É>ˆó<„É<ÞaL‡˜4° ˜m&O. 0YìwùZùV‚O|?@({Sƒk§+àSâžwJo5G­yQq´õ{M|B—õ» ³>ÛÅÃþá5‡„æÑ˜ü/gg¢«Ù*ÈTóµJÆ‹dƒ£Y`’ôOÆßm®éZÀä$°Þ@?ôL Ú5‘bb€ ‹Š!aòÄ‚ä÷ÌYÑә̂•ÿ¹s>ǧ50&Šº÷ÕùèD}­‚,a=&/„îcbIŸä‰V1±0¹ò8LìàØÎ÷c‚qж¬Çõùí×ÈtÄ'sén!ÁòÛ¯Ôyhò1å5•§ËÆúºhƯՙu!Âpø³´1&.ÏMhæH¹">'¼ÿýÔO¼žgMÓ&OC[xnÞÀ”1µûãG“ËX"7 n ÂÏH’Ó;sl8YÔlqŸ=W˜¿ùç?¬˜ÅzÉ®sf;Z‹x~÷Ú$gõý?=¦XÏ|‘}³8ås_:œø¶MYOìel8 zCL¢™c€ç%³žë¸Á~­:Û$&OC—xýX£Ù’Þ ±¹sg¥…sÇaαp‚“,¾lê:¥ÐÁO>›Â°$´õCÎÿrÃ|ô'YüñÊé¿?X>t«xB<ú[û„xˆ‰=h»‚}¬‰ÝGÙö“ðŠŸü:Ée1rL08‰§¬8bú'hG^ä¾Åq EL;%Lž‚$Àd±Ñà¸0‹Å;¿¼}ãÆ2¸ D‹Vþ>ûÏx!jµ3áÃÖÕ lg­¸¼:½’ÇÐç¬ÃíÖ©[µü¿ôù£0‘œÑXòô™ûH±Ü‘š\`ŽrtŽÁÎS;l½çüäÍb¾+B(FB˜<½â—¾i`kvtiv¾½²"¢ ˆZ]߆ø‚!†øÀUuF#)íìq“ëÜW²œŸGµÜÃ’p¾]¥¨/™oîþV– Æ,bÒkÈCLæÎfM—YüA[Qùñ̰õŸnÊ%ék†%åÎ7†Ešõ-6Ï#ï›Ëá;°); šÒm˜ý氤Ů1ob¯¦7ZÅÄ0”QBŒ“Ca{!M˜l(‹/’,u˜×ø±bI¥ ©‹^s‹‰¢ð¾ ªù°ÀDÂYÀ%õî±?ܱO+”tuÐZZ^î fÉÍd½Û`ݪ®ä½Úù:bôšË;SË«j) ç`NÖÖ{ЈÝûK †ƒ‹ÃAŽpbhVU W{ Éxw²Pí;qba÷éR!¯#%ºœŠà˜4üj¡*Úì”ì”®êb„bb‰ºáˆ6LìÁJQQušCqÁh6ñÉ > µGãnÛp¦(ÈœÄ*QKJZ8'2ŸƒsÛÊâÄh4rŸ@2hGAÆDÚg5Y@#³Ùfp´$`ïíÍD;äMw—Öl§ÉËå÷Äq}>Ÿ¹´‰ÅîóÅ¢ª ÞÆ³q1•\ô­Ë}kKjáp8Ƈü1ƲØE nç¼~4™L§X:Lžž…4d †c ÐÍxƒÙl0:Z"Ââð{€ÑaC’@[|4Ý9f#Yï‘+æ 'ÐŽL*YcÅp-‰+ùÌñ’ùÕ¬Xøçâ˜í·ç¡»p(e6è]Å·gi%Çq’þ¨×KO .§Ýï³;F«°¹ìþhT, "­ö­7›ÉØl`t²A×ËXTPÅì{§9›H츚¬T¶~5iå,wTéö£|ErÚ}¸ÊÅýEp:3_»#q¯ouîëÝ`1XÉ‚cg#î «Ø2nìgçèq±8wø‹,Ð~|=|Hý>oÔ'ö–îo§):ãdqÚÍ¥»‡ H.ך…„%‹ ·®Y.IrX`qâA\n»˜Pé£íž½ÓkаŒÕ÷ªþpbžÊåÀ}×ôüš—ˆêýwàï®(.a;|Þ ‹£ñ[3Ǻޅ?Ée®b"^ƒ\àq‡mÑ 3ß/Ý ¿zÁ¥³<¼2Öšímdù™` ß¡rxcµ#õUPrS¯‹™¤8‹Û7ê§ÇÿiÇÑ…Æ´ºœù¡××ôöO˜¯×.º%­}/ÖZÿYV–#=RX¡Ü”åêṺ›CGnj% „uóO²tã¿Ý F}üÿL¢êUªB†ŠEX¦è¢§Ëåìøe¥IÏŒp]™r9i`ÖÀ*\W‘Ó1\Ké—néW#H®cåpAÇgÄZÝj^N?ÉŸ2 =C‚lÓ«ä’¢WU•Uõ¼ƺ—ƒâÒ!'ÙL9–5­ iÅZÚXã—néW%Ée#3¶T:™L¦Êó¯à%¤„ÕQO<s³Õ¹zD éaY°Ü²(óÛTº"=V’K<#!FH$‰D"‘H$‰D"ý ú?¾ô]h`êIEND®B`‚ IHDR&–ÝE³(òPLTE¸·Çþþþýýýôø÷…¾­.’tS¢Š»ÊÅøøøüüüúûûÂÝÕ9”yÀ±óóóúúúéóðËãÜàèæÚÚÚÕçáØéä•Å·Y¦ÁÌÉíííðððö÷÷Ýì纩h®™c­—aª”—ȹ«ÏÄðòñõõõ±ÔÉ1’u4“w~²£öúùÇ»¡Ê¾ãðì|·¦Ÿ³­Lœ„B™±§áââääåééé¿Òͺ×Îâããçççz­îõóØÙÙ<—{¡ª¨ÐÑÑÔÕÕÜÝÝ‘¹­êëël©–ÒÒÒu©™Š±¥±ÇÁ\›ˆ´¾»¿¿¿ÄÅÅßààÐåßM ‡] ŒT‡Hš‚u´¡ª³³ÁÂÂÊÊÊu¤–ÏÏÏÔàÝ–±©¼½½···ÇÈÈÆÔдµµ¬­¬ªªª•¦¡[•ƒ®¼¸çêꇻ«²²²r ’ÌÌÍ××ל½³g¬—°°°¥¥¥žžŸšš›¡¢¢sœz”ºººj¦”’’’•˜—O”€§¤ÈÍÌ“¡§§§„—’N|r•ŠÇÞר©©l”ˆ<Žu‚‡†âìén°œ®Ä½l‚|^€ˆ‘¨ºµñ÷õ•½±ùûúB†rŠŠ‹Y†y‹•’ÀÄĉ­¢D“{Kˆvo†…¢š‡¨ž[‹|H~n†ˆ‡h¢‘‚ƒ‚e”†—•]€v€ –rŠƒb£ÛáßÏÜØâ8pätRNS@æØfÈIDATxÚíWÖÇï°ÞAk|I «µ`` d1ÕMi™‰ÙŽà/J_èF\kÛØîªmÚÚÇm»­ûüŸÏ9w ‰IÜäÙõyž}ÖóíÇOÂpnæþæÜsΜ{ËAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAüÛ 1ËÿÎ÷HðMðøǯ¶ð¡W¬VÆl›>IˆÊÆ6?ä’dß:䨿´Z]ö E z’¶ïØñk›Íf!U=Ÿ­[ܛł—kÕeÚù*ÃC/ìžÜÅÞíñ:}öM|äž½ûö±ýðÙûÚ>ŸÕµIyIÒÎÎùkï¨ßjÛ°±$ ²ú¬ÖEõÒòúa~ļïVëä£oZlv›e­~þA‚ð/tl<ñú61à;‡V¾â#¿ñ8aÐ7ÓIz‹L†Ç£1ß%mÔdÂÇG½ ß¿¼¼½…Â%Z­‡­‰Vó~A:k:‘L¥#NëÆ÷í³2aœ)ëU99îµnÔXÈär²P«G½VšuÖgÏ>¸ñf IwÌùŒ9yý ç¿ßç"£Ö4ëX½ãÅ’Áô|*¶±L¤Èä„Ñh¶šÍ6c«Œ®!ÊlèmÀÈÛü‘ºRUN-çÙ„LŽðÀÕŠ¬ÓÉd}À¶sþQ'_K›ædp|;LïÃg ¸}/hÖqy£Å’ΪJ}“2™šn´fçæP&íæu0''òÙñïx°&þH\©zió2‘˰räœ<‡ÝS “À ]Άöf㞺Q*ÁôîQ2 §”“ éŒã™ã&ÈäVsnv®ÙИªv?füs:H̹Q8 2ñeÒ5x%õº6j,d2_6ª X9’Éúœ9p6ßÖ+iÏÊÙ%‡³ª!'£NÛ32±¼qûö/„Ð6S>ðoÕ¸m¿}ûU? Í̃Þ·ù3¹d¡R¨G=+Ñ×ßGÈüuÅç™Ì5Á–ôtV©Ütpǵž˜F–šIÒë;໬¢3˧J’Õ®*•$UvS ‚=·o»\ü¯h+YŽð±;º¦–ŠÑQòa×ÅrPÈäsN¦‚%˜‡ï6ÛÕBλ҇ݳ ÍcÃG~çô[Oîß¿Ãe fÐà“]A|ßqï ×ïsoÙ¿7ìbv‘á´lÙ7“buôCÍß~mÃ9’ïeùÖȤխ*µl²X0¦¸ãn[Í×#ý[^’¶¿3's:z‚Ù¥ìôv÷{#'³Ù”;ì…óà¾{ŸÚ]®["r ™4ük·îÛ·æÝDðúõ`ÕñQŠm=~õçA¸|ŸÍ©•œwÙœyh˜³ÏZšâö¸–dòöÄjáS÷#žyÎ:~"³ÅÛ|ðÙ#3χêN? Úœý<4“vcP5˜7v%–»ü2ƒÝ7)}™´Úº’ͱp4Ý ñÄÝf·ƒÖM4øÓ[ƒÌ ÌšÇS™¥”+ôv&ÈÆÝiqáOú”'Žù=ÛfS·ÞxœÐ#3µ¶ôœßHF½¾#©—/  ¹z}ŒÿùA»T,ÅÄoq~}"ÀÞ}Ôãë@&JCÃÁüLL¸ïp~ ñ˜Ihð꾨$04<‰j Ýÿj„Õ"™Ÿßϧfr¹ñˆ·ï)î’š„–âõÈŰ9~¬/“V»Ý+Ç=Nç¨çƯÜlTk`Ýð}ûk 78<ä?oF3£}ùIÒ™ ŸHçraÌ‚둘HŸ‚A¿àŸÌb„'öŒLnUâ1咽$¼l¼=Áùµk6öYK¯ÁÔÜ—Éw|}c‘ó-¨'ñõ¾º®åÈ®b­¢t¾†HÈñÈäpìÚvhÏRØðáz±¢œyœ€Ùàó|27ïj”ÉÀš™ì˜ä0Ù. ŒUOÁ‘©‹¹Á8™2i˜³ŒÝfw~‘N«‰>z¥’tµñáÍdA)}pÔz%=ÈÍ ™€5Á„™)“£‡Ï8ÊäÉ·?,4Õ|6º™ /nðUjÞã¿6õB?&†Ù€ïÎO£L4ËŨSÈäÕ |™¬t ­§©ªa¨'~D\mwËa‡¶OòÀD¶ÐѱaèF÷,¼¿ø¨­–’b>™| ³|2N1Û:)TRÒû=óóãâãª\Kƒ±1eâ8;?õøÄ¶m÷ÐýpÌë ðMÌÈkK¼‘¢\‘àw©ê1î8¡¤ðYŸ)“S¥N©"’>‡A%‹×ÚívZÓœÿQ+Õ„„P&Q!“î>jJ*ì%™¬%Ëù¹Í9ÿæ‘*§Ì˜x[€¯uÐÆ|û¨]®âAÌÞßS î^½\’åRùÆ%ÐÉÙ–þƒð‘¯D°Rç8²‹wç@€¨ Ë~¾8QÖ;B¿ÚÂØÞ8jJSM¥”Ê*cF§RZ…Lžé(w\-kÍfUk“ÞDÉæu­ÛS«R Î]Q†“…™\(ëÕ<ØGS&ß·æf[m úmÜñ³†ÃË„oAßäø&˜•!ßd¤(“ö,š“o»p•p.GGt·Rmƒv~™[Jœ¼½Ÿ'¦k%£×U«r¥VG¶4®ã·O5L7÷MeTÉ ædñÛl£2,#|qZgåŠb§Ã,X¨¡-1ÌY§È„ŸÑ‹€ùøU2áSÇ:*¸&BÊéHm¥ª5zF'_`ðUò×`2n€3>&dò[]Õ17(d’˜Ÿ}ð`¶m””B­V9ǫ‚9±û<_‚ÂZ³s¦kB‘ÎZl`ΞhÏÍ^çü·tŸjHG|_±¤6@&wZ`åÍ©hçOÏäõ^C-ç‹uˆ6Óõ"x¹ü³`bB7÷ PÜ È(_ âÅY”ɓٞâ6e’˜VYUÁû`€-äu¦%‰]É1ð}e&WVË„'‚C§N‚½h4›²Ù›{œ_)€nºF©’u‹¾( ¾øH—³Qp|P&˜W7e²8»ðäÁ\£SH¹¡íq˜Àzâ $Î:Vç>v©Ýjb ³©J…—û!“VëD%óZÓÕ¿†€æÓJYkÜqð;à TÜB&¿öªJbZ –+krd’™ÜæüÇ 4Hb z!Ž2éæWÈîÙˆutcç+0ͨJ*'úÍëIV€XuÔ” Ÿúil@«瀧Ún¶0¶aˆq÷€½»™×»]µSˆG3ЗH.{~ÑÐTÒQ&jOía´€L¾i/ÄÛlªÙh¬•‰ó cé6DdÝ<ÅR!x/îñhX<‡î/¸’¶C¤óµÖÓÍç=â$ Á¬¨vAxëɰö\ÈèÎŽ~’Éfx ÆþŒ3'ã7B<ÐjOñÐ-¹ªiU%½™ "‚ñ O\[%“‰2±óÅM™ „¶ï}žLØù¾³‘LÚM‘õŽ:ý>ŸkP¡&Ù¿ ð¿€L*+dòÆÏ• Ìo¥dØi!™ü#ôe¢æSÑÈE˜cæ?füÒùª¸Â¹Ì±¿€fM%D@—šbÒÈo0‰9éX¯@L}£j˜¿32YwÒaŸ2vÕœtž/QHBrÙÙʾ’ýSô ˜t VéßiìóÒóeÒàüF2ùØ#«ÂX(õ˜'ò8ÁׯŠÝÖ&{ÏùSŒâ˜8ñ½’'¶[^va-ñ1¸°}™ÔCpù»ýt~ú÷8cë»°6Ï×0U·TzàÊÛøÃœXž-$xÉö»s Š®‘9KÒÎOÅ@Çt­Lt3b[!“þ’É&™|o40Œ§wwP”ÅþÔlŠôƒÇÿÊ$?§š$YÓ‡8OüdˆbTQ*½C½^hµÌ€Ø;ɹãcÃŒ˜ûŸÎXèÑz±Íwsˆ±Å6šªA@¼¼ç÷3‹Zÿ®L,þw<0/’ñ¢”Mzc˜®@ %&" Éä…2"¼»–Õûü, {8;~#>[µþ'x…ú qb÷bj~qZ<´™å8áÚl?½fsfqiØuDþmû{|,8ùœôšÅêù :¹…5¢+öƒAƃ¿fè©Z6‰ä‹•˜uA·ô“}c<ñŽltE å’H&/É5ÕŒ­VÏLdòË“³íªHµ¾ Îá¢0Éâ¿9ÅyàÂL ‹?W%pêéŠd½Å){ÃBÇgÆ=±­ÛœO~y¶Ÿ¬_#—wüq€1Çå™z :âÛñ¼Jü‚lQ~¸L¬žôeìô›|.à98vðËJYÈÚd=É䟃óÐc­Ñ-£‡`÷Ç.‰úœ'³R6ê´[¬—8?a>góáó¸§!²a¡£'÷Á(=ÝýËŠG0v¹3§Çøò§ŸÛ=sޝyB,d"Ùü±ú)lëÚÆŽŠÇÁÁw+ŠuÂÉÄ>UΉJéã'·ý>¿8¾ÄJÌêFÖ>ú#™üSH “i­m¦`˜¯Æ®=»_5Ëb­wÆø±¥Ä‰k4šý`‘`°ÀñZåó~!‰Í«Ë?' Öjê¥çÉEU;¶bý üV.(,_ÀrTéïÊ„á²>wééØà5Ø­û•’ÑÃl®%™¼Pnc®¡Ÿô†[Ôž:Ýž}ð¨].Šª ××~JU;bº—˜/“.T/;L¡8NÍ”ÎCÉÝ…¶YVmñyrIY½p ”’x:ñU¡"Ï-ò‡?qwÁÀVÊê­._8~LVäRÙh´fæz²8F>⮕DÙb¹S*uÊú‚ƒw¡…Õk.p^b)¥ªw ˜‡a«7šÍWµ[.COÎË ëè*3ÊJ=,êM\Þ\­£ŠäÞ:2±ù)¬‰¨.N)eQ¥¬W«º¡jÝv³Õjë1G1›ÏÅ"h·$QáóÕyÎ>4ÛÄrx»Ø' P*c͈ t`÷ƒñÉWÕžÙ—*ƒ34½T{€õ&0Ç%åª^*æÖY-.4 &ª³u]ô °ÒÅ&Öƒ]+c]-ÈÝêq×ärI5š2YqÀ|.âkÚ‘`}ÄÀÉ%±púá¶’;2Ž”¸~0Íðúë¼p`³¸éap4TÕ0èAÇ:$«ôE‚'#9±tFUqýÄiî¸ :ê×Óú2¹¤Â )ü6‚3“N*`–ú£ê¥J=jF:0Ö+r©’Zoý7ÖœyÃq\ "Özh"sû4|£pr^ìXb‘\žñl%_ÉŠEêâÝÄko4­q'ªƒ]ðs©B!鎘›VXGcîlWA‰‹ ûãÉVyˆ Éå÷Œã:¸yUC‡™E–eÆ”Z<Œ:ÚŇþ–‹' ŠÜ)W+—ø¥[ífC¸’Dzbñ~»Õiªj©? ÐÁ’,Ñ·,ô-·îÖJhÛ¼awQé€%aj¿%gîê†ûàÀÉÅd<ŠB/þª¤;6ê2——¯<`¾Ž¤±ux£].^R@‘œ;Þ_Ü).}$š‹F¼ýoÀ|„si\Íi"Y@'a7ê Ô)ÉùJ-™M¥X= ö„xèd=žÊk…Š¢(•7q•Úhhf2ƒáÙ9&¾Íü~«Ó'+yü½Ãd¥ÅíÕÌrTËŠ¾­×uìl,—ªÅéˆÎããýÕb-_$—N›‹CÁµŽ‰¿ÂoflŸ9 ™+ÿðµY]I¬ÅîófbKûóáj§Çƒû˜ËA-V¿'É,­$àõ§’µZ­˜¬Ã¥Öàu·¨dSõ:Ke³Ù ŠN¿‰å³fLÁl ‹g~½ >?’ë÷¥˜dns ¸x)­èÛz]G83Ñt=Yd…Z1‹ÛÇõËâqñ{Y7žŠß‹Å@CÏ0g|­É5Yvç¨wy·O‹Ýêóû¬öþþH’Íês:>ëÒF8’ê(Ü©éÜx,ãñŽŽz™Óܘž{÷)8uw<}g"/‚ovT¬x± Œ¼Õï{C¾ ÊRgÆQAË[¿.÷mý¾£ÃÏ¥Ýé\4æYÞ–Þrùü£f¿p…ùµæ†â[: ÌIÿ5“õ‘@V«uyï`ÉöÌŽÁæûö•[ÃZp¬½¸ÃëÄ{<&öŽ…xØ}ÈÁWdayð¾¬k],Jðšþ†ÍííÏì®dg~ñ3üÌg]±¥=|·ËÜ×øy—, c¿×Ã2ØÔúÒ;ðž,"‚,úÅàÍgˆ×L¼&cò<à‚ZÌKõÜ÷Ex°òŽ€µ¿35Œ½¥ÿ¾ÍI<·œ­ORòeÕ,JðÆèïþ¯ Vm"-žCoÔ{.õ°®Þ©\Zñ¿60íäŠ?A¸ãˤU¯‰‡´v/{/Ò5ùÆGAÌ×OL|¥”0+b`zÎ÷?7Ò:]!þuyU¥l¨L$aY§jh½žÑ{=Ó@&’̉ØrDc" "ÑôNEl-C2!úHVg$„©FW1 b1ª"aæ³Ó´@,aÔXª¦”:媮³jYVŠq‘V%•Ë`V%ìN1 ›W*…bÝÜsTB¬Ä†¯pÎ]Ç4lwmtZI%Äj0å9ê‰ÄÂQŽeÌÍŸI%Ä0ûæó;ÌÙOûÿ_wˆøE²ˆÇ'$‚ ‚ ‚ ‚ þ[ühå˜CxÖ̘IEND®B`‚ IHDR&–ÝE³(òPLTE¸·ÇþþþýýýöúùÇ»<—{¡Ê¾øøøúúúúûûüüüôø÷…¾­.’tLœ„±ÇÁéóðËãÜØé䜽³ççç±ÔÉ«ÏÄB™4“w®Ä½íííðððóóóõõõz­h®™c­—aª”‡»«—ȹÕçáö÷÷•Å·Hš‚»ÊÅ1’uu©™ñ÷õ|·¦¿ÒÍÂÝÕM ‡ðòñn°œj¦”áâââããb£…¢šéééãðìu´¡º©ÐÑÑÒÒÒØÙÙŠ±¥‡¨žÚÚÚääåu¤–êëë9”yÆÔÐÇÞ×´¾»¿¿¿ÁÂÂÊÊÊY¦] ŒS¢ŠT‡O”€ÄÅÅÌÌÍÜÝÝßààÔÕÕ±§¼½½···²²²¬­¬ªªª•¦¡D“{ª³³ÛáßÀ±r ’ÏÏϰ°°ººº¡¢¢žžŸšš›¥¥¥sœ^€h¢‘ÇÈÈ×××´µµ•˜—’’’‘¹­¡ª¨¨©©„—’r•ŠÐåßîõó‰­¢o†\›ˆùûú<ŽuÝì稺µÔàÝg¬—®¼¸àèæÏÜØ“¡l‚|z”ÁÌɺ×Î~²£•½±–±©âìéN|B†rŠŠ‹[•ƒrŠƒÀÄÄY†y‚ƒ‚ˆ‘€ –§¤[‹|§§§—•H~nÈÍÌ‚‡†2rKˆv†ˆ‡]€v‹•’e”†Ÿ³­:‡pl”ˆÞ«'ÞtRNS@æØfXIDATxÚíÿRGÖÇ碔/í`5(È­­$‹Uƒ%J[@AP$zù"Ü{«p hD©µuÝ>ëSmkmtk´Ù§îúØ>ý?Ÿsæ!1Õt_>Û¾Öóù¡50äwÞ÷Ì9gÎL#‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘þ]$1“ÿù×\ ®c’þE#½,mØh6¿f±X¬6Ó?1vö_ó!I’^ƒ;6áÕì¦õ4—Þܼy‹Ýþ«®òÊhÓˆÓd7™ð6­¾=[mâq|‰wm›‹1÷v×ç·Ø×ñk¥­;vîdì­·Ûõö;Ûvûërã³’4êæ|ìpµ€õ…¯¿ÕÜc ,¶u^âÒ»{ù>¿ñx¯eÿxÈnÇKzifûg,ø^xÂéñ[׃ɨyøG~pŸ'ä·ØÖÕèô8ãÜ|(<YÇÕðKnLB^ ÊBœ¬Òû;ùáPoÍj>p{ðÙ²Ú_'º“ÑX|ÂXÇh¯Â„q÷as‹}—‚>ïâ€É‘h,‘ô^ô‘&G#Igʰ½Ì[üï -oñô1'ÜxàVâp|œïóy…Å~i˜lgÌ|"“Ížu˜À„›'§¦O2vr c<}$N…Öà ôy?L:§Ndä|"â['&ïâ‰b$d!÷d¥6Or¾·/:=UVãC7ßI&áÙ²¿4LláÑÓåŠRÉDÃÞu …tØÌ'seEešªªg¦‚ŒÏœœÞup}¶þñœ¸š\J†¬/nŽ˜œæò¥b*@³ÎJíŸæ<]ÎUNx„†q@~Þ†g+œòY_Ú¬c %cE­éù¢g˜L—Õúlcv¶ÎXóãÁ‹™<öu=>©Å;…«)åz0yÍü¨•ÉæÁÔ­gZ{•´u &ð£z6Ÿ€Gh‡‘4ç;ª¹|܈—†‰Í—Œe;5¥\]?&úÜü\1©×`NΔó…”ÿ…ãˆÖ$„˜Ô“‰õbr0SÑÁøøÈ9Y©K.ÀÄ}oehØjìFÿo:S†g7âiΉÍ‰çÊb$Ö;éœTóós³M©jw0ù¸ÖÁóBs‚˜øœíV¹Rnµ¡{“)]PõÂæ¯š œ]©×äø sòšÃ°ØYx¶V9'¯o>~|7ÑvƒŸg͆OŽ¿jµ2Ñ‚aêÅh` xÂ¥\«-D|ÑΆOÌg;'} ˜h  ¤«è,SÖU3wÖTZñÈ9‘¤w?¾¥×¡åW%»?UŒåZ¹XQXÃEÇ44·ZW·–L€É5ESõ\a=¦îUÒŸÞ˜\Ÿ«W¢`jþçø2«Ï6+ùpÈ6ÄÁ›Û&Ýø–yトÑ{ÞÚ¹Û¸ãƒW·¾•†Üõö~Ÿ?plï[oø-ÌÓç;w´c%¢ö?°åÜ4F1Ì=9ú>?cˉ7I·”Tä|,ZÍ•Ü}qVÓÑôõšH[F¦ñjܵwŸ:Ô§ÇýÜ®¿Ü(ÅÚèóš¤m;¼f³Zÿó~eóÛ_„ü‹HÖ‰ÔÚÎ;ÇÁMsœ:å¸Ù†8Œ¼“!½ÿç'Ý,ø_sZ Ÿ¡>[Íü ‹ñ[ó³µVÑk`òúö1ÁÊý—Û)ï wï÷ ˜]¯nør¼ßPú³iœO¦|~¿óóÒWnöu1Q˜Hùú³Æû{ÝËÝq.yBAcX“ÙÙfG.Yr¢XCLš|ÞEéÍQW¯1Ìò)¯¯Ÿß…>ïäæ‘b¢˜ôøá›mäæOýžŽ^cîºöxŵð[Ÿüί ó³®4ñ«¢ov€{—óoêzÌéïÇÄHÏé{œß_˜ÓäÄ2>0¦HÉøä”KüÿDñ:wïsF ~÷ä³ ­œÇ—ëÁùýès»ÙxäÁÿiÔZ½Z£-0¹þx±©Ç’>ø^K‘ÏgÆD­Õjê™Ääi½ V:ãÆ&yp*ZÍt …¦Öà ‹ÃØÝFS-Gƒ€ÉᬞÉAD ˜ÀuN+µªA‡n¹.¨z«m¤UóyvåüŽÃçÎ0ãÚß•%˜tÀð`Ê™ãᢉËÕT99,†^m€É錞ɋ΢;r«^¯75•Aï/ƒïuKÉÆ0#0™0¬ÉƒÅXÂdXÀò^ž]øŽóë‹Z¹—bû³‹ÿ$+ó×ypa¾©W'DâÄô¸Û«”ZG/g2zå Kðñ|CŒ›$í‡Çu“h¡©=“aåÊ}ðOfçê"8‘L;ÜìS]¬²øììÍ43%µ~o2¬FHíÀ(yÐ5LVô ¬¨¤‹IHÚš<‘/+Ý¥.\®\.WÔ»A~·ƒC¼›“O+ P‡ö1ùnnn~nvI©@ký–›ÿø¨Ò2Ì\Ï795¿°0×ÄÉ7YÖŸÞLÍ>}ìæîï!ÎædÜÐZeµñw\l4õ|ыϦíw_‰fmISôl._¿±ARðþ“ùf¹΂´—»–äPRÓå\µÊròe0'3ªYÄä«®²zlÔͧâ@‰¦Õ*†s’o¡SSÉ`Dj{î:\®5gg»zMÓÕX&QX³«ÀåX>}|¥3¹DWI`¢¨M÷0I_™[X˜ŸU¡u>Ÿ;dæ÷fkƺ|=¿çë`ðbc~ÞpM|é „>àÑîìÜÓ‹œÏÌ©™f\ßãŽÓ­ŠVÿ_ÀdÜþ¢mÌUˆ$oÀË0(å\,^,¥3ÁÏ,b4^‡)b$WQ—˜RnÅF‹‹€Éƒ'ó]¹ÉEƒ±™€GæŒQ´=¬¦÷úSˆG[YV–£«1áfÇôž;zEm20&rc÷÷Ÿ¾PB‡2¹\?}—aÖÊМ &Gjš_ËÀdf~ñÉÂ|½#Gã…bâ,øe ­ÓŠ Ýnñƒ÷š:_€ò&½¿—óóÝz£±Ú}p1`f°ï?ðv¦Öm^ /Ô%1£œ³Ô­•󉉔ÇãI%#à„Þ¼0«Gáý$ÍÓ?djØ"Ç Z<4ó™Ç€IãjI­«–«áíϬÂ0ƒéiµEw¼,ŽGó¬ŠeKöž Ûœg`–T±Ll ø9`&ÓVÆléjSt(‰Š„K;`âX+ ¶&Ýbb2&ÿ¨/>Ï\äô~Ó4wÍÁ»½Õ“e4¼¦Õ›5ü4e׆„9ùyœíëàÏ}W‡äôvqó¡VEíj÷“f7ô¥à?¶:ݦªÃà X,–€/u 0ùy¬ b²ÍÍOåÀÜ@ œÛ-E~rñ˜ï×ÀdŸ‹åË*S+à²ö:ä÷F–˜±ŠÀÄÑ\|òxa¾…Mt@ÅõÛL‚²":a-vÈïM~ä×áQ¨ð,&ÍùEð<ªíBïoO‚ûÞUõª±!™6âšNWcBk:+´eçC„©ÕI¾¥¡r &—í0¨Ê¡ ÿQÓ:²pO“ôùL °A“/*ÚL6ÜÜ[Oç&¦íîàAYYꊇÙ"­¾~j~¾¡ÉÏ`²ÉŶÀ‘hcÂ+rïLb0Ô)ñ„ÖeL?0ËêÍfs üš\<‰91ÀÄü0£.A!n²b2ÕdñþÁÍÿ.ÐŽ€½Y…‰û^s<˜þ„ƒ{ 0™*òƤj¬w4U8c¿õÈü®´yœ»hguõ$çë Üñ]<}4§«0 òkª¦d…ˆé© :šŠê`‘G²zgxðáø¹ˆÉkà’–Õ¦&žecõU²lrð±FcV]“l ŒI.a¬ÐÙ˜ßïcFºÞÀdþɓŹÙ&ûR–«Fi«Àä¼Îšâ—‰œ. }``Ò]ª /k5&韗 0&Fä&!&uM“*#Lž£ÌÚÝz³“•?s1qõÔn‡xF­ÈŸ»ùõšfÜeÄÄýcF©é ˜ü€Éˆ=0gLîéš#%ÐÖÄQŸ… Ïbâ(«0Šö ‹XNÖ7çŸ6šµ DàY9mã€MLÎAäÒé.)hízk@’m«›«":!›ýL´~¢_`²‹;ibR%Lž«³œŸ|´nj+zcšóÏêÖAî>ÆýÂÛpË!,Ñ+ÜUà¨Ö5îê`Åø  0i Lާù·˜DŒYÊh`ºã⎥:Öˆ¬Æä˜‹œs€»µ»×/$h4aª©Fc¥v!ìôøD±€„.ìwJú>0F=ÿ‚ ƒæ}“+j½—ø`¢j„É ˜L=jÖ»z¾ßÁùÝyõŽ››od;è’”Šnî~¤a`‰“Ý€ÉÍÞ¨ 0ÙŠ˜4ë¸Èâ·{!Ò9Óíû¼Fƒ pæÐškaò `r¤GÕÚÝë%Ùh"<‘LFRƒ½Y’tœñSgÐã,xÅ'ÒA<¯,Á‹kb®¾cÆ{ Lž#ÌÊtG9Z Ÿƒ ¥y/ȧdFRÏœv¬æ˜øÆÁj#&…!L>paby»/ ìÑà“]¿ˆ‰åç÷º/Æ„±ªSÞÏ ¶•JRÑÁg>îjçôGUœûÎs0Y2ì aòkÔÇDÍ–&"±=0jO¯³à]Ñ4E.%=0쇴^€(ùGÀÜÜË“Îñqn`"&ëkœ_?ÓE?80T,É~aÒ±Œº™û¡pvž‡‰XúkC,c[±‰X’"‡Áë~$ò:k²ÑÌÍÙ> Ïb¢ˆø×g'L~°úè–Úÿ²íô¤º0¸‚Ì¡ªÝ%†¡¡·Á:“7 »ü÷E°ÿ† ˆŸßðA0¹Ùwa­^Ñ¢ïäb‹Í“X£´¶ kuš1㥖Á÷ti?ûĨKÿYYH°B’¸ææ+½9Îxi 8X‡Ëê’‘ YœBWbÒUZb‘0ùE˜ÔÅB½Ï[Ý%êb?ž­‹žƒ`K]; &Lþ)ížææyÀ&OÀŸ:‚Õô3¸ÝÁ¨ °|Ƀwkýĉݗ?œÜªµâÆ:ýÕQÇâÅù9“?y9¹ ÆÉ‡ °ý“Ü=íú¥ôó;w'÷’LP`ß?͘ëv¯$òE˜ØBÆ Ä )Ò7;ÀÿÞ.+†¿ã7&/G€‰ëoZŸg¯ÅâÅ»Î?{²€±dÈjƒøÛAâÄäœ8 T\ëæŠ)¿Å÷å$@ƒk:WžÉz)Š‚ƒÃÌ]Š:½[¶fv^û¥d= ¤ÚÁÚ¸ˆ;¡7–ݦKÝfE,T|!&vÿÄ%Û}¡ðø-©­ÓŒóÓ-]]2Rfaòr”áÜq¦‹ñp ðG.¸ù̬òSD…’)Æå2`"Ös%‹§x7/°±—ÎÀšéô¥®-ýIVïDë¨{PXc¾ãðxÄÒßò ñ«7,ÍNîel¯(žv]ªFAbÆìy˜ s≟va•óôW—ÞØå‚¤OË0&VÎ&/G™^vͨ<²x¶;øÏ ƒq¨N`B>`æ3˜81*N˜ÏÙþë’û8Fòòu°?ú˜€ÁI´9‚½Áñ‘|ß}ðd^{0‘xæhz¨Cî©Ïs2Ë`d¯ày˜XCÉ\­ÿ0ÿ5Pž‰S¦ßN˜¼½¾‘ó©n·©³ŠÝï¼âhÌÁœ£e!¤µƒýØÅӇįp„Æð«ú¡SAÇár.[ù–?{²X/c½ nîN–dåæ”+aðžKrK._Ióï÷÷qõ&ý²$Ü Ë>º2Óë{ò'YÖ+á²$~²ÆºÃNî@¢0±˜¯ž„¸tÜÙÛPl‡¯ÛÒ+™^•£p¾ªÙ ^N$pÑneÊrlÂÀg•¬^nÅ&Œ]&xZór6×NŠRjV>ÙÎe:8` ª5xøUœDðV¿îà®}©p;Ÿ£ b‹šrsŒ§çÑ@åjO¸ÔÊb£XÔµ[BVCRtYÔµ L¼Åø*еN°'âœøYcXU›í"¡[Œµ²àéx×ö›z;Ñ#‰ªœmµ{ß=ðv.+W‘Ÿ‹ñ*Éæ‹b¹œq>€8é!R,U«mÃf n&ÚÕ*n2%°'ñª¬ãFÜ`«ûÆäj\€´ ‚Ž?N$JùØÿN‡utåç Ÿª×g—t±~WtbÕ(1ŠÄ©=r¢­L¿G5¥‚lÄ87KÂæU&ŽX«€z œÄKyõ(Q “lÆÉÞd"Zų×,èð—NŠÒ´åoWó‹ Àçõx¼¸_`aø<‘Hÿ}&8Á{ÛŽVóyVÅ á$ˆáñŠX7¸™óàô @§ÍX)Æö^­Öì¯ó01F"ž¡’d Œ%c±ÞO¥î ïo~Àæ&ÎV\sà°Ð2Š€‹‚ÑÉWcmÁ¸Á˜Ø|ãIER½Îõ/02ûâÛö¿qø‰µß‚\“²[ü¾Pÿ°F<Än ø‡Îø4Ù,<–Â28¸—É0¢„4 ³eÅv4ß’å,“[ùhÜØ¦G”†d²|g¸/Åb¬/L8EZ”(!­$@IE’ƒmzD éYI˜ã÷ûPâ¼o‚„ô ’L¢dƒ!‘H$‰D"‘H$‰ôëô‘D¯ö¥¢½IEND®B`‚ IHDR&–ÝE³(òPLTE¸·Çþþþýýýùûú±ÔÉS¢Š9”yº©âããüüüúûûÂÝÕaª”4“wu´¡ÔÕÕøøøúúúéóðËãÜØéä•Å·êëëôø÷.’t‡»«ßààðððóóóÀ±c­—…¾­—ȹ«ÏÄÔàÝö÷÷Ðåßíííu©™îõó¡Ê¾[•ƒÊÊÊääåðòñöúùY¦õõõM ‡®¼¸áââ±ÇÁ|·¦ñ÷õHš‚N|<—{b£¿¿¿éééÆÔÐB™²²²ÐÑÑÜÝÝççç®Ä½1’ul©–Lœ„ÇÞ×h®™±§¼½½ÇÈÈÒÒÒ] ŒT‡ØÙÙãð슱¥€ –ÄÅÅj¦”ÚÚÚ¨ºµ···´µµºººr ’¬­¬ªªª•¦¡‘¹­ÏÏϪ³³h¢‘ÌÌÍ´¾»œ½³×××sœ¡¢¢žžŸšš›¥¥¥D“{°°°ÁÂÂÇ»u¤–r•Š•˜—’’’…¢š‡¨ž§¤l”ˆ¨©©“¡e”†[‹|ÝìçÕçá^€àèæ\›ˆn°œ¿ÒÍB†rÛáßz­ÈÍÌÀÄĺ×ÎO”€<ŽuŠŠ‹Ÿ³­§§§ÁÌÉg¬—‰­¢†ˆ‡rŠƒ~²£•½±»ÊÅY†y‚‡†:‡p‚ƒ‚‹•’z”o†âìéKˆvH~nˆ‘2r¡ª¨„—’–±©—•ÏÜØçêê÷(rßtRNS@æØf¸IDATxÚí{WÖÇïPCƒÀªôÐÖR¬MlŠP(Åt†HãaœQ\*…P“¨Øv}µ]kcÄÕZõÕ¶ûºý±û¾çÜ ILÒ5»µÛîý>OÕLîÌÜ™û™sÏ9sæ–!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!¡G’$bÁ?„~+zaÓõEþ˲ñq“$ËàŸöm¼%ɱyعÅåv»=vËFÚKÒ¶nÝf·Ûÿ…þýþµ}»×‚·D’ÖÜþ—6ám#Ïö1Üèà¯s×sÚ”§Ôúa¸ZŒøW™“]”¦NÃCeó<ÏÐ;q²E­lŠVÏn)˜|¤›æt³Ù ¤õQŽÒ%\GNž~:I²Ç’%µÜ6*Wdc˜œ¡¹Cj"§ˆz~µÿÛÒ«8sŸ-'ÂÅdìIïø‰OU [(ø 1Q+¨‘²ZÜ5a˜œk7gçf§›¸¡±&‘y´ Q÷v—,Ao)¬·ÛeàrØL&ÊåNaÔ¿3üWè|0q^h+UÜ“8l‚íÖs ¥SÍÀ”þ,1ñfª $jpÜ D “‹Ýé¹¹ÙfË$†Ñ½>gêá 현|éŽOB)xêLô¶¬Ô|! ×Ç@%çF§þ¤9Ÿ…æ>[“Ã*çÄñéáÃ[Cn·Çaç­µ6–÷þS l¶çÃ0ÿÂôGŠ5•ÔpÖXé!¾´uyç›çÇ­é¹Ù†YQHBÑå8Í]n‰‚-º"‘,€NýO¿SË›%ÉíÏ–ªª®ÛØ ¥Þxýðá€gMsɘ\©˜fY-y…Ë´ï*ÃÄ:רÔF¹9á¿øÌ‰Û?o4ºzÚX‰É¾Í[p¢"dèôkþX0°sçÁmüf/5±¼þJ [8Göü9 nººs‡g0|ÒØµá—Õ)úÐçì±õ•|ÿΜ~ {yr`2Û4ËZ­®†µ#Ào³Us2EI:<5N0?øËnÇ`è¡ã_l>xÝU¨c.훸öŽÃãɾ3‚WH'¾ŒbnkŽW¿cbbݵüÂBþxÁæw‹èÓaJ!v —红7¸lNF(½JÉÅÙ¦öùK˜8¶Ž0F˜¬/ú¼YJó›ƒÇ>hóþÎ¥dÿ_茕C >ÒÍqzí‹ ÁpsàšlÝé\îRüÚgăæ?rLz¤Ù-«.‰Ø|õÿjqÖP3!÷“}gЗ!©¡‘¼Yv“ϲɟ%^°Í¦8þÆ:4²ßŠß­~ ˜$“^–“`²¥ê#¶d´o Þx5Åþ"„ÿcüd& ‡ãÏ1ǤÛhµ;[(ˆ†þŒ¾I³ÙUÀ̡Ց¤/ãðuÂ8À©clÿ'c€É=ŸÏ–ôÃc°o`â{-ÉøÈšEz¤0Š™4ËLî'Ò`òD*–½a¡Ís9’»?g¨%˜»û<ìÌÑk×᩽ÿ`®«•¼ƒÙȱî^êÚ;Õšª)SyMóÜï±bÉÇÛìpRâœxÇUU5ý=hB®MYéH±˜ÈH"Ìš”ÈRòêýalSw參ðCùöø3>ï²y£ÜØpLÌF«‚®‚Ãîp¿Šé²F³§×F1`•¤Í)Õá=üŒW Sñ›¸¿»ojÆ–¬I“»'4¾{¬P¨©ÇÁÁ&Ó¥X–°£É—inavqqN þŒHÅ‚ÕOuzîìÿ.¶”Bd`N6ÃcvKGL>êuêÞAD¼ ÜÚ¡±zMÓ˲ÜnŸ…‡ò„ÎSÃ…Lwæ¶$u¯XÓhBŒ³qJÆstHUk®QM&Wµ4©ÃOÈÁ›g€’ Ž©°GÁ4¤æ ™¬Ÿ½ó`Ò+‡3!¤âS8ÁŒÙh¶Ê5Ÿßƒ”`è¾§Xeglß`N¥}Ùh9a˜ +…t9C€‰5o¥ã'®«ZG)Wä£àˆL…9 G0d›¢¹·>Xœ6•Zšç=JÏ]{R4ߘþFÿÛ&ø„ƒ ÉU'½Z­\¤¹Ï>j%Àà›·Á£÷Aº *Ã4Mbš'¬8ÍœËZa§&ò]ž’¡¢KM”ÛÐF}~ý”¼\QÂE†áÍÝ­@¤Ã~"öMVâœ*À1I›wÉœ_ äÊj‰¿‚Y¤‚ÖÎþæ.€"w¾ Ö¤ŒÖD’Þ‡y3~ËV*m³Û…N!'G*¸ÐÒ÷MPµZR)°ç“Ô#Y®T*•aîOGQ]acG,äLîßùö«;³­r¸¸‘A¿{ÝŽ#&s4÷×Yô ,cÏç-Õ@L̵…H?q2‚~HZ+Ãx˜†ÑnãÏq]e”j¸Z%áNÜ“¿}µ8ž bö<ÙØ¤ÂšTÃÚm0'3‹‹Óú  “ã`hàAL¾› ñóˆÕrŸjjG¯Š¢Ö#hnVcBSSŠ ñ1wi-ÒXŠî׺Ñk™²¢… x׉ 3`NäNæAÂ1ù¾m”Õb“øEpPMwá"jµZçµ~dV´zß]Y<±ÐIÀdzn®i*Uð¸D¤C>€ûÙmÎÎí›0gêùà é„‹«1¡ñ#C»ÔË`KÀ˜@<ŒЧ ³@I%vá‹iÌɹnY­³I0¹rÁ@’“™¹GwîÌ5ä^D¦°›:/v ¥ÊM©Ýøšæö¶¦§1Ð?z£P¿cmÛIéÑnczú'pN/·d _þÌøµl¶¦ÇéÌ |{ÂnàV'u~Ñ‘»- ¤áe(D’¶â+1Ùñõu š˜ý&$M&tÆe&ß÷1‰Áœsî‹„l˜꣬O°G©P%5V·$õ]ØÆ#˜š]ƒ€×Ùm‘fÃ,óB„Oá Žiån«+'ª¥ˆz•­ŸÓ…y ÇÄä˜X“¿²£uÁVàE€+âÜÛeýaN¬Å½æ®Ì™²ùEv „)ÕKF£Ùh]ËÑ„ Oè{):”HÈÝn1iñwX"ê¤ãa §[aS¶Ûí&Aòú&‹8&_§ºcÖ)øBháŽù³SVúÖãÅÙu0ñBxúLcÄ@ÒÏúä&~¯ÍV%»äÂ:?n>&çX!xŸ $Õ…ÆFÚÛ]Ì8„g×.™FW>þÿE¼3Þ¿ãÄqæÃ81Ðd“Ch)>¥Aæ­X< z¿f[ˆ‰ýÞ~:¤TÀÞàDÅr®ÄâöŸ¶Ò…Ù¹is-&ÿx‘¦Ž‚‚1tE¢ýNY` CIâÅDì&‹Þy4Ý$È”uÁ:&ûå2ž<Ô˜#`8ã­qJ­6ÄhQÇLœ{[Ø›D=É<Ü lùØ0¡1wÅÞ³WÌ{zÞCôŸ ]ã4u¢ §^™„§¬‰v‰Þ‘MS®¼ è&ól9&“ °ü)ãù6‹;‚^Íìô2&à:ôd»xKp»•æ›Ó ­Á‚ŠÔY `µÔ+‰¸ƒ„Ä‚îåôX“;g=Q¬\Ñ1 Âóaˆ‰!÷Z`¾"ž¶NÞ†ˆhb¡›e5&Ö‹=t<Â<9'¹“‹ín[©ŽF“õHä“JG»ÉÌI9||Ò÷˜1Ñ;S4÷ `‚e_†I^7™¥ð/½ä±x“yö†1ÉÓqÙ€yŠ»3ü$ޝˆ`Ûk0 &Öse´ø…ìŠZ¶£‡Ø—“õ ˜&¦[²®$M­ºØ{<48é|ßnuW¼õ—$Çg€I—otÛ×bb6!Š)ð0_rŸLdða1©+0YO?Pˆ{ ¸Ÿéë€Çýf;1fE«àÐÕŽÁ¦¶)'x)¸°9Ù'€çQú‡ø"‡†É0y &1ÃhüÉì·°ïvÒ#fäÕ˜„¶Sr¹ÍÜüÕzêÌÎ6{•N¸š.¸ €Â¯7<ìî6˜"›3þ~E"˜“±qzÄ@£ÓåZLÎÚfqZÃÄdô LÖ“tœÂµ]=\wýˆÙI³ ¾ìÝ3&á¢Bé“U¶Á üÎJ绽6úzËÅ%¯"&-¬L¢“`³!°„É›yJ`ÐÖÃ#…Kfüìˆô1ÁD‰–ÎŒÚ"‘,Ö ðO­$é¡ôlÁ´EûE*0Ðg­ôP»‡sߺ˜À´ˆY÷&ç8&<¹(0Y¥ï®RúA·ÕÀ<’íú~L±}§ùï̘FÕ]8±ôœ¹'inïLò+1ñ\³ÒÉ´?ýo§~;œ!~®×}*&]̺¦}^”•¶,W9æãô ^£ýY Øî¶üO0éñi‘L6"Ääl—±-™s2óÑ¡Çå ÌK¤aâŸ7û S‰ì¡Ôy©‡ñC` ,™ELø¤ã¸H\ê±A[²&W€Éú“Ž=³ÌÉôÓ'VHž³ÇU“+~ëNj™hñ–¬É®µVþ &2ÚJ{ß,0yº¶ÂÄ>o´` "¡P"Os3V2óÈèöº2ãÏ\¥ñ >¢p?ÿ'Eso5–&q<ÂKXØsãÒÀ…uD¯ähªaöo9;É;@ùÖøÐJr—±ä(»œ¢ØvúKˆtÇau!Á“’ìÞC9:Þì;Íl“„%y×ôvÓ·&ŠU˜ô³ˆ“ÕBL~2Øsž JS¬.öòl³‰±Jɳ„)aæ–Q0'¹…*/ ³7Ä?MO÷X@lÜŠS’º€{ĸ›ûö~VH°n@´»‹w ί ˆß?Hâ¯DHÿSï§aƒèŠ^éñ36ål¬¬ _‹#o˜üBmÊÓÔ¥AaX0Ta¦áÛ¹Ùéz~wèU꼌‰æXbÙ ÌéÏ~‡Áäw9'ôÆã¹~zÍôž¶â,Ä3pé3ãÔ:ìü¹ôšÅãW†q^ìb¢…õɲm˜øYŠÆž¨7Y)è½§to—gæñcP Äz³Sæž4Ø=É/Ô¦q:~ Ó&x‡<ônÀä¯ï°ò>ÌiúÏðˆ¸Ãs A¯ ¬Gnü¼Røƒžl‡ñ‰ódýOÖKîo*GI.ûÃÑPöðö!J¬Sïýl²ÞâDNå¡'ùóR2Jˆ{ÛŽ8`³»@«]}:&îP}2AÚ¼â‚N¹ÿ±kˆ`¬¦Àœ#óoG&¿Pó”N^èbMxö ·§ÖûÞÁ“Q¿Çâ¸ñ÷f›{¤’ÇoÓ&q–‰š:ù"~À@â÷T,$¸Óõ'9ÙúÖåÂzBR§«·Ù«¿õ0aŸäu‘?2EXÙ4üs÷i’®zž§cg¬ÏaÅôäÝ“/ƒq£Ö»×r·ÇßX&¿T€É!–6aÙ0Gô‹wé[‹w,N{ifW­˜81XÁ¿Æíœu.€A†oÕt|Cüp€ ~bW­rš8'Æj꼓^L̵Éz‰¸£‘±++¾¿ ¹ý7kj‡h¬ÊQz &„±6o]Ú@iþäõDÅèñ÷DI`ò õ>%lÇžì ãç¦à RæÁŒ¥0D.íAÛí·:®X9(ÖáÓªš0“;°à0!ž@¶Ö¿ÿ(â“w¨jGß›Lg—]Øá®7bbÇQV.]Œ³sèGMSʤ¼²,Éz‘ù£¾õ0‘àŒuõÔq~€dJÁZÝ.øX}+–%]0 þ“aR1xÊaâ@L*ì"Yÿ8´lô¹yÞƒôüóz&¬/¹¨HAZïMcLRO²òWö•¶Ìn¸›—ûª‰Joþøñ³×Þ+k„.›ÙGƒÊŠñá¶±ÂTë E/Wä·rô«ÅÇX½†·NZSd¢°"Gèr¥´»ó@®ÝTHG©´ ,r,fY½‰=)tds0°«¯AÐF ZżtôøÙÝ·O%:‰²ltͶ†ðÁ–e|…Œ.o²¨êr¥ƒ³*ÿ‚ ¶ÀEV°T—½ ”Ü+¯úyÒó×ʈ•|±_–ö3Mnö•6V3kbq’àžUbÈ• /j6§É ä‹½¾‚¦Ë†‰Ë‘àiÌ”|37Û”&옚N4V@MÀœø#õ0p³R¦Qîàª5vò‚µÐ±vß¶Þ:`NàŒéNÙ0 YÆryø–9K‹¬ƒK*wª™‹ŒJµDYWaBrpL[¶ß¿êj§¬kbE~‡Á|¸TEé[$‚/÷ù–?¥(‰Ÿ,\õ:q¹ …›Gr”Ü®-‚ŦøÚ|‰(«a z–^óijÈb„ƒ%#Lèe2ý¹E´˜G¤•\é* ת…:RÐ_N”yÞÑþE0hb~o’-BÐÿõ` ûh™Ý‡¥ âŒ@,ÀVûì/»&Ù=î`Œ-Ò/bt@‹@Œ/Êw²0tlðüe|¾H2äF£~ˆ¹±¨Ñ|ÇJ ¿{àV1ãºwrÈ ¡ó]¥bö+¯±Àâ Æ„¡8èþ±\äa#´ô KØÿ?[ –¡ð'#øÁGÆgËz£Ëkº"Dx™l™Wö…E0€kšð’yiõ–•Ä·\ˆȱ¼®‰ÅnçK  °;žl€>#·PÈÂÁs»ÙV øgã+“°„X§z»Û„O¸¿=CÇÊž%²ì,/î•®#Õó´µÄah0¶þñ2kè^nŒö‚ÀaçÆ¢EK+èô· Ž¿rƒ0&}Á=´¬·(Ö-úÿw€ÛØ}7‡ƒX–¬„ _\‹/ƒb> )²‰9QVE½±^­BÚÀ ÷|pIpíøJ+ÿ×Oü°´EZ±EZ½Aè—h=¶,îÖÕòy–…%©Cwh˜‚ëš<'úk?žÏ|…}¡_E–$3µD¢e¹ QÑ1%ʲ]%–}Þú[¨1œ¨´YnÀ&.N`_‹åî„úÂdY±¦éÙ0øj†\îÔ€’ C¡¾0©šÍÂ{ë'“JYï„ –” œø½¶’«ŠYØŽ¦©µBi”-¸'(Z¦ÃüI›Sö…B½˜±%C¸|§ Dh¥XþÍJf#6Á%cq ^‰ÐYXÖ? Ä”¨0%BëK²ØÙkˆÐ¿¨ÿ7šäCå2{IEND®B`‚ IHDR&–ÝE³(õPLTE¸·ÇþþþýýýüüüÐåßh®™4“waª”ÁÌÉøøøúúúéóðŠ±¥.’tLœ„¡Ê¾úûûùûúÝìçËãÜàèæ«ÏÄÀ±ØÙÙº×ÎØéäíííðððóóóö÷÷|·¦c­——ȹÕçáB™±ÇÁðòñõõõº©±§ñ÷õÇ»îõó•Å·l”ˆÂÝÕáâââããééé±ÔÉY¦öúù9”yu¤–çççâìéz­ÌÌÍ^€ÐÑÑÒÒÒÚÚÚääå~²£ÜÝÝêë뉭¢œ½³S¢ŠÏÜØ] Œ´¾»¿¿¿ÄÅÅM ‡T‡1’ul©–ÔÕÕßààO”€ÁÂÂÊÊÊ××ׇ¨žÀÄÄÆÔпÒÍ‘¹­Ÿ³­¼½½···²²²¨ºµ§¤°°°ªªª¬­¬•¦¡\›ˆÏÏÏ–±©´µµãð쀠–ÇÈȺººHš‚“¡§§§žžŸšš›¡¢¢¥¥¥sœ<—{¡ª¨…¢š¨©©•˜—’’’[•ƒr ’z”ôø÷„—’r•Š—•ÇÞ×D“{çêêo†B†rn°œˆ‘…¾­g¬—Y†y†ˆ‡<ŽuŠŠ‹•½±®¼¸u´¡ª³³rŠƒj¦”ÈÍ̮ĽÛáßÔàÝ»ÊÅKˆv‚‡†b£u©™2r]€v‚ƒ‚e”†H~n‡»«l‚|h¢‘[‹|N|‹•’#*VÄtRNS@æØfFIDATxÚíGúÇ0D0ƒT«\ùa{þj0"ù!Ô4.†‚€µ kv7At7 ?DIªÕškM«¦jmûíYïÛÞ]ïü;¿Ï3»ä‡ÆJ{ÞÝ·f>¯¾j ³³³;ï}æ™gžÂÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅõ’ÈDÌ&øßòŒ&<çô”\ÿ‚,¬ƒm6›Ýòk@1™ÌK5˜a@Ȧ!êØLàœNs?‡Â¯lÙºõU‹ÅÒWù—]Û¶»Ì¼í¦§´M`à‹~_ „ nt{¼>›¥¯ºM[w ×Éë¯ÃÛߨöG8Òæ4÷s¨~¼É9D(õït{A›³s"X»¨·ÍçCš×»ö ѽÞ óS ì{ó-³ÅiAKýBAy(!þ¡áPØ´õÕצýŽUŸéȶ0@fï“éD#‡CQ··Ÿs˜ < æyù¿G½sˆÄ/>cOÒðšÿ°ž&b·¼XN¶úÇîx"™rûúy´ŸÂúüH:Ü×§ELˆÉ¡xÂ5œ ÚŸN“wéhÆÓÏ/·`ˆMEÃpË-Op²ïM:úž×ÞÚÊɦí”XÇŽ Ù˜+è«j=>26:Nȸ?‡_Ñ÷ó…¨;ØŸA·f¥ôÄ1¡X*‡<¶¾19™v% a¯ÿñíåÔÖAJ>p¥C¯í L¶øéø)|š>ç ÅÄìþðô™JU¬Ãî>º :í¬ƒ:&²UI&²¢(“SV° »k®PŸœ@ó}[·ŸƒsÖ…Z!ã{þ Gœ¢þ ñR,_È/ú¾ÿÎôöØâI•Ý‹ÕædÏ›”:ÎÂÓ´AÿšÌ¾Lº¤IŠX©ܾ~1™þ¨>Óh6­!í‹VJ;5?ìîk@€ÖÛÜÃqAT$­”„+íçˆÐíTÁþ¸Rû¿ãÞÿŽ´ÍÆxì’ æÑ¯„ái˜쮕ð™õ½ÐQÇìs§cQ…ø¯Áär·1;7Ûlà­s”^¨f¡Õý ˆ‰'˜H¢VJÿ L®U-›èk˜z©uΘX¯*UÕµÚœ|òü"rQ¨cÉpð…:±€Ép"«UÁ¤úëÄÄ­=;7×l´e¢(Ý“ë]huÔÛŸCjó¤Êj:Ñ|>Y&«3ؼõŽÉ€’ßvµÚjsr~ù9,)õl>å}Ò9ùdë0Ve1ìÌ£Ò 7nœ·¹¶èÁOý?,k DÓñ’ZJ«;yÏVBþ¸F+uLZ³sÍ–R¯¡¢‰óà‘¶d¶VÌo1&vãÆÖ?-[ñ½ÉÌ%U­%£ MSOû ™»ý©LÃ;hçº(+8L­söÀ.†‰õ³¦’…›±lNìe¿ø¼Õ€†=öUÃÑæp à‡Áͯzƒ¾á×_ßñš~›—ËlÚ6Á"›û3PfÛëGíK}—Õ ø\‰‡<ºiÚ³´w<†HbÏr\Ådò ÒÎÑB2 Í×îQÇý {¯£WžŽB+z ®õåš(ýº”„ƒúŽå½„zí& ñ[IîÖ¬¢¢m589°™Òé£VzçëÅY´3˘ÜÉ!%Ž‘?³CËY íÃhØí Ú {²aÀŠ”@™iü!r:½æ„IÆwÛD¾L¾-XÜC¯öü½ûw¤×°È†ÏŒ¾10i¡õH¹‰7àþ.ž7i´«1uX‘ó»öªNŠ?Lß-`”W·&S1.04M&¸nÇ™ÿ9F‘NÕÀ%QÇ÷i#Bû$&Ÿ« Gõ|9…a“ë×îú燭JB÷AðnìsÐλ÷§é[çºEWxiª³uØ9½Ì~ñØ»@Jnê.Üê®$vº“:“lrüt \âÝ“h{Î ÑÜ.ŒÎl&`MÒÐe:&[GÀ”øwmLà‡cCcðëX¼öa“™V· –ÍG,NÛ^èá -uÔ$ó/Mç¿@FŽ|ˆ©ÅcCèøÎ™|(ìÑü&„Y“Ó@IçÐÎq÷P7^t cû˜câ ºkhäðÜâÂl»®–ûмœÂ°ÉÃÆÍÝjâàbàðÊ·”ÎoTô/ÿûãB[ȇƒ&[1ÌrºW­.Š’tÜÜ1BçϪ¥x:Ê|`²áu(3K”ŠX†(WÀ¢LÓܘʢ3@"Ãäl‚äÓº7IÎ%Cñr,«·JùÆÁÈõx2etNY‹<àŠ˜¶ eÓ& Ä:ø}žT’”ëÐïþ3Ø&ƉŽÉWy}À‚˜øýVê˜ø@Í+pÈe(¨ˆ>µYT›7SzŸZo-þøp¡¡Tbép ¿å§—RûtúÓÖgw(½µ ù¨aNö8häHIž¢¹Ï43úŒxÓçoó±bUTdY&2¹Œv›ÌOŠÕ"Xf¤lxÅÓ_åkYMT;ýBFú±X¯¨eœ›À7?£fa¦Ã¦îYIdo>žÕêF³äÉ)BæÏ”à!Ö{¹gM´Îlö°hÏ!q Óm@ɃoâxR¹Û%²Œœ8îÇ’)æ%ë¾É¹RV§ÃÄizï&'Ó—E±^¬ ¡?Y©_‚Ù2®ø0LÂêÀäög?.ÎÎTK®èzŽØŸöÓé¹Öí¿æè‡ú8Ï’s“쥓Ûsmp LÞìÐÈÑZ©"*ЊO­Œ3jrg®Åb_Ùï§Ö¡xI¨CŠˆDºœÀôµ­°ù«ŽÉ9AXDC|$òF¾V¬JË k8NLV¡@4`30‰L]¼~ñà‘¿mÿbýê¨Ê ðMп&¦×FÀ–|U(D?«ÂìÉAÖ¿à—2L"»áœ@j1fû¯¶Z­6”&’$M£2YÍ&†u‹Š˜ 5¹ýãÃÅfWƒ†¬gL.ƒ#8ÑZø; 凛8»dæä“˜Öþ‰Ò¿.ζ—fÄèÉQx`±Z„ЦüŒ˜<œk*3:[îQzóƒ˜edEÔ*!Zu:e~n¶%²bâ˜¨Ššš‡#ȾBî©1àj¹]š(EÒ²ù‹…&O4œŽÖE6óamÛ÷&¡ÇÏÆ‹€æŒ,VµJE«*'rt¾…(zm&ïjhôð€ûq¡Q­&¯¼AéƒcØaX&e”Q“‡·çf„ò&’, qÀÄ´ËJŽd³U¥Kà£aÉD)+AM<… õ>:§U¥™V£ÅšncrW­*@I5[+'¡aå¸z8G§&0ˆŒsÄä¤(ƒ7ÚÃäÄã…Û·çZb1VNÃ…œŒÐ©–\Ç¡01;}å{4òS«ÙœAãYÏq“-7“v³9 ˜üs}Íü6Ì"À˜ÈíÇótþZK®âP˜lv"[•Û]©Rr…ÂnPx8>„Öäá"`2pžö ª)3Ê”‡¡ 2e˜FÏCŸ´W`¢t%!G¼cÎé’&u«’ËhX&”΃гy‰áÂ^m.Àì´ÕUøœÝ6RRÏ–‘O¾ùAb”$`fÎV†¹øtSÁµ>8'ÃDê*Z ˜7#&o,Ü^lÊ•LÌ¡üWê€+ÀÂá¨cv¦ïÑÎ[ÝV[£çé7ê¥ÔV˜»^•ÚÖ :| 0»ÂAçµþ ƤÛLÚø„±ñÚ™€Îhã2GÔ´‚žÐ] þï₎ÉhçBQìÎ@+ClAwêP¸S˜[?‰É©Òé”È•+j4Ìçͤ „¤Y0l “Ň·g˜HÐfÎgV`DÙôµþ¤×r=›a˜Þ†'= Îô§]פ,kaÒš[˜kÕ"< ø&ÃDa#ìòšÐ[ÅË_×iŽÐñôºÔnÍH .¥5Áœ {À˜X¿U«rWº4F#×e¸÷ù¨‰ã’¦`g€¯kc @›F”;Wϵ&‰:ýQE™éêÆž…eÍ6Ïi¨}ü€5¬ÉÆr\©(]¥ªB­½–Ù}^w†`Rs&ä!8 Òj(2x¸ }þ ˜t®¿]æyà¬a§)ýTŸ^ٟƤs—•". Á…Ø÷vè8Ì’Àtº}:&C½¥¿ô:_!Þï Ç ÜòjåA¾v]M†i ÉJýþÏ4ò–"‹E=p‚˜LˆÝ¶16éaY‹¯˜ÌÍ6Û=Lü—a\bO¥Ï(cö¥ôãF³ò4&£äø¥*k]jš…ýÔóç{˜Ü^\h¶fÌaź>E- a:bç"ò»üàèá;å t¶­™æ§0ñ_…Á&Ô}aܼ0Q˜í`#,ÇdYgüÔÿ© ÃoE­ÌcO*B|›nL +ÂIš»¥ô\MÄÄÿ>³h]–2Pœ ð;.73b‡AçŒ9 -go!Èþ7¨Æ6)û&vÀÄ?)vÑD…ƒO6ÐI–ƒõW0H4º8ÉŠYµ–O§ôÌ|Ä$òVUžÑù5²LΓ&6·õYžÆäb·Ñb³x'éa"Éݺ Íà˜¬LTÇ'ÁKo?áêkàÕÃ8Æ„õ[쥷$g‰8Ùò%”€ñ¤÷Àéuø0÷‘žpp†`6ôµØí¢?ã[ZU¶ R:…8®É{ƒ„\Vtko{F;õD‚Æìl£[-–jñD¾ŒëËÆ²­iÏ^BoÕ»]Ý쇘ÌßNƒõëÂÅåSÁ50¹&ãR"6“1:&:­fŽÉJ]†Þ›œiÍÔÕDr§͉t.Gsw³Ì˜Ä’÷Á¥˜'@œlº‰Á¸Y[•YðÉvÀd²)B€I¼©‰novdœgLˆ§`p×À$ó%!?÷j}F;´¤&P¢&ÒáT*Ê ŒåßWözb²ËìFp)uÀt0BǺݘ©¬‰ÒîêÍ\‰‰^Çd…ÎïÀÖÅ'1Ùvñ˜Ϥw)“_”ŽI›-¼†Ã߃9yëBŽÒsšÓ¸ŸáFÁ!•1QGð6abÔ/oE f¦ÄDt,§À(MÈÕUƒÎqúìAǾó8!×Ýç:F"AÆ Y‘øÝ=Bç'˜Óä]Âä[?Èõ_°&’>ýµ“eLŽÉÓÂ%ÿëJ[O)u§Ðœœ Ô¡àÊNh=0o™¿¦° 0Ü:KæP„F®‚MÐ3 XoœÇ|’ù “àdfÑ3¬ÇzÙlÛqé]Ø5f:vg投X¯2K³ìÂî#›÷°ô³<‘H°Z&“w'4ìk°˹l¸HÕÑ›f÷Ú˜TžÀDÖýsŽÉJ!&oIí6úû¯{gW{ɵF£Õf·3˜¼w Ÿ0pÍ&sÍIçš",gÇne+ÄŸ6 ±Ù—xŸK½Å`<Í6+K$X{Blw¿'æå&m-Ûs”X¿üüãâ_ÀÄ–ÞAð¤¬GÙ¦óVê+R[÷¸Í“߬c§·ÛlÍçMMYÙJ.AD‹~E­‡qFœ`3b_f7 L "†'Ø£€’¡wæfõðšÉæÞ9ß]WÀ0·i—•v¾|vxø2C˜…tE‚ZõðšéüMB¬ƒ¯’ŒGß?ày˜Ø=ŒŒ™ê1=‚ V9SìEpl&ŽÉoÖ‡=lÂì½Ý—9ÁaŒaÍàÝô9ÿtTŸ lõÝdó0gÑ:v¦”ÃDãÌËŸÆ`ýõÅÇz°Þd¤ÎŽƒé\9]‹z^ýÃøùè¬_›j…ÖL ©é0ükßò|ÌŸ"'m}`âô†Žú Í}<‘uEašüêæã„Ò#®8à,ÚÅ1ùÍba¹Ý®£Y¶Ø!LÑ`‰8JK»Ùy ¬À%YÒ—UM$-_fyõÓþ¶}¦QÿÆ:K$0–þL–`&}v*GWœÆÿ}â.ý‘U+ÄK˜8½Ñ2ã„tFw²ƒåÇ[ø&Aâù´þš÷/cBLfŸ;yÆÁ2¦ mß1ÁÜú¡b±.Ï€ÿDOŠcò›u’Å8Z3l’÷ÍÉÕŇu}YÕR‰`àĸSØ…ø¹éÜÒ $7P+É,‘ ‡ ¾…™.O/Ù±±¦>¢¹ܾ=×]#XÏj­uO¬xÿ‚Pÿ¹šZ$ž$ly>&hÃÊ÷Ç–« ôøWY¡S^±ÈÞíä˜üf±ùpWn³›oÇ{:1Þ˜]\œ©€¡†oÌê(>©¿ŸqW»7œ,Õ/ø P:îÆÔJ1¹½ÐÒj,ÌI!.(—Ç ™Tµ¨9hîðíÅYy&¢"êiIX««¤]˜²íÊïV³ÂiIÔ?'·ÙÒäZ˜XàʤQÅJµ‚i–`Ó\ÛciI¢"UziIþÇ"KRò¬ÀDT”ºÊb/½—Cë Ö°®1w³Óô5ÄÄ 'U±Õl¶ÄÞ;;¾L²TE¼×ˆ‰™½‰«I®\9xòt6+Tª¢Üš}¼°~‡‘YmóF“˜²( ó ‰V­K~šû\%‹“ð8C‰b]¬²%~\=ô„ V¥{ùÁhÖ™ !P-Q¤*¦°|liE’ °ž¾p¬"^‚*>:[,B JW–4–¥éhÞh^­Šõb ‹7•Ïâ§D¨‡‰Í® ¢¨•0k‚­òÀ«jl«‹uI\€îÂ|ËÒ[û†×Çf¼X"«iÅ8´Æë+¡=ìf p© ¸Ô%ûÅ2Њõ¼Ž_´taÞ†þx ™T-Ñë¯ù™mL(6^üÄ.EN€%€@¨hD(fKµDT†Z­Wöv¨ÿtÙUÆ}T5›Íªwa¹/·‰Rañ¨•å0ج%P«' ,5­¨Æ0ŸÄ«¿ .j <œ4öþZóZОxÂÐÑàýV4­"°¢Æ^‘h- Ý…tÁØûÉîu§àSïewf<=c¼Ÿ×ãv“ ¯÷21|á‡3nýIvÝȤÒåD-#µx>Y¥R$EzµDaþd}¿’HäË„ä‰FnÉî*.ÙV)F­$Ó£`©ÖÂRÓeèžåtvþ:¬ï$øŒ‹AN°ï]‰xŒ”b5¨qwöö¢°Ø¼žLXO›dŸÜÆ'ã÷x ¼TOÏü@™ ;b=¿{Á7ÂÐwñ5l…Åî [|P@¯±¨~~û¢!xÐHa8v{â!½=Cm§‹È§w&’éS›‡rNÀ„檞{ µ:ñÄÞÕ;ùB7-ý\á>›Ë›Š˜£ ±/é³.Æ„…?lX2ÍjXÞžƒÍGàœú¾”¦¥ô0b§ðà÷–Þ7£Ì:~÷B¿y;¦Ç;W즅³û¸ü™m¾r;$ÂÀ×ÜÌüÐìØÄèçEèªÓt¾Êj˜ø¡ïmd2j£òì½e »V8í¬¿ÐcرØÕ7*}ë•)Á9‰QcÀÉ®|9‹ è¿7õ¾0×¾Î)awÃl^sK¬UEô¿ °Rf0¶<ë÷ÞÎ(0cˆæO[—A‰ú «I,7¡¬9¬Ö_û§ ˜«ô¼°¯¡aÄ·Üß+~·âOèž×Ê‹ÒGÝ'6ÖÂ/Ö÷€ó´Övölú&.Lù•ñC•¬P•º]Y4ÞÓü÷7ëÅo³Ïõ¢eÁ}Uܵ‚a1 ‹à;}€àÈ…Â=Òq}wƒUpÇRMyþÆ„ëw!‹-.$XœKÑ7Â!Ѝc®To×-..œ02îš*hÕ:n«U¯jÅRƒx|ÈáZ‹]E åx ƒ°Ål¶K$Cú_Høo·ëÿ0|pG‡Ó®2†aË®B(Ì‚eœ®•BP06žJ…HJß3¶¿¿±Çµ¾d2;m¾`Ðë%^âóÙx”ŠëYÂð7Š3ÂÅÅÅÅÅÅÅÅÅÅÅÅÅÅõkõÚNnÀà ›IEND®B`‚ IHDR&–ÝE³(ÔPLTE¸·Çþþþýýýñ÷õ…¾­.’t<—{Ç»øøøüüüúúúãðìËãÜÇÞ×Õçáh®™¡Ê¾íííðððóóóö÷÷œ½³c­—aª”—ȹ±ÔÉØéäúûûÝìçáââääåêëëðòñõõõÀ±Lœ„u©™ÐÑÑÔÕÕßààééé|·¦çççº×ÎÆÔÐ9”y®¼¸¿¿¿ÇÈÈÒÒÒY¦] ŒS¢ŠT‡B™××רÙÙÜÝÝ‘¹­¿ÒÍÔàݱ§¼½½···²²²ºººÊÊÊ´µµ¬­¬¨©©ªªª‡¨ž\›ˆ–±©ÌÌÍâããÏÏÏÚÚÚÀÄÄÄÅÅ¡¢¢žžŸšš›¥¥¥sœ~²£ÁÂÂ’’’•˜—[•ƒ€ –°°°4“w¡ª¨‹•’§§§“¡r•ŠÐåßîõóO”€àèæ«ÏÄu´¡‡»«º©•Å·n°œb£[‹|z­z”çêê<Žu†ˆ‡ÁÌÉrŠƒM ‡j¦”•½±ÏÜØÛáßÂÝÕl”ˆY†yˆ‘‚ƒ‚ŠŠ‹´¾»‰­¢ÈÍ̮Ľ¨ºµŠ±¥»ÊÅ1’uo†h¢‘Hš‚§¤N|•¦¡u¤–‚‡†„—’r ’D“{±ÇÁl©–éóð…¢šg¬—âìé^€ª³³Ÿ³­~3ÐtRNS@æØfúIDATxÚí]‹›Ç‘ïY’MØ‘›EÑk…à‘v—] i$£GFÒIf ¶çðÝÃ]XcCâà`Œ“srÉ?{UÝ3Ò>mÅñ}αõû>vW£ž®žîßTWUW7Œ@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ /$æù„J Ö?ÿpè%Ùû²Ï÷ÏTá÷°p°%‰‹e>Ÿ/àŸ‰¢@*é•WÿÈðhj™ó@0öÈ®/çxGý¼{/ÉX»Â‚¡p`F"eGð÷1ø7Ï~¼pœ…}¾ˆö¶Ás¼ÄdYžS”YÅâ³ÏÉò1_eýÊï_¯ÈòO°àõÚM‡¯Ç‰°½¾ú',aóQ‹ÑÙê–Žì¨b~‡Û73QøCMæ£ÑYź4IƒÁäÌ„~qX–CÁ`(é‹ìV)9 Ã{ô}ó$…<9‘f™l.1ã@ï¤ ùkѼ’ü³É„gH!MN¤ÓBìL· Mæs±X^ …gôâ¤,{£ùXN Áhíà‚,Ÿ •„ Ð÷*vhrúu•ŠÙxrFšc²wiyeþ>³Ê/É'Ö²y%9Ë€3>æðD2ˆU…Ø™ná4É–JåX<8°æ t‚|Öí„dHÉòð!…¾gu"ù~ºx®RÕX­^ÊÏØûH“¥z¥¡³¦¡ëúù7áš|¡UjÇC³ñÁ« ±3Ý"½,ËKÅz½Ó}vÖYšxVוּ•ðu‚¯Þb¹T‚6ìÿ¾ilUMg s-6#M<@“åŠÞë³A¿×cÌz hâ­¡bÍ4~H!Vbgº…Ó¤®ª&È Xš“q¶®©u>\ÛÈÊD¾Ø©×‹Ùÿê{”ÊÇkŠ¡ZX›U› MV½}¼Ð{xr©j£ÊLVƒCk ±3Ý‚4YV•V77Ë<õBBZAš\þ¹]«—wè T&lY­U ™vÐ÷}Ó$‘/Õ+U¦¶Ê¹ÐL®ŽäGšèýѕѠ·n0f44¹Ú„!Ÿm:@š±U!v¦[&+5[Gf\š K»Ú×Õâu‚Ê„­jº]ie•]49tøðáw0Nñ‹˜&üØ5ÚXèZÀÇ˰-"Éx6S/°–˜ì¶ßÃÞa *fÛ®Kþy&Ÿ1@™ ,½Za*Ø^&_ïµV9¾UHos·õ GlAˆuZÍñ ÜÂ]wHþMFSÛÁƒjÃ^49=êk…íê„+ÐìýžV(ÅÃÛhrühJ|;?÷n"ö;ÆÞ6¸ŒÙR~{_; þvø½clQ0‹øçç®Yi»a±ð¾—GT䕇!ŒæLê4iÆË®:Åt§nžšô{ö0354$éÕ›)^…<ë]¬#2ws!¶(ÄJ GŽ,F¾À;7½<¢òo©ODh‘ šj&ŸÜâê¼rDp„û˜áãÉPˆÁ°Nx‚…&RæOå”[2›Áß"æ9&³Ål—¡?;yEç¼Ó[0zWBî˜M´IÐõVвv´œI!MúÍZÕ/$ŸFWÀ6ÇÆ…ÂnøT’@¬ b»B,œ%CÿþÁäyé§9%!š¸ÍP÷I#(y0c±'áñÏfòl ´zV OØ€ÊäÎiYþÕÆ•^ 棩žYðr–|´´´Êÿ¸›‰Â¯…|G5âÞîå,…€L÷²‹@“\>§“8Ðä^4ËÚ¹ ;ç_$YZZ‚äþ3O¸aVAõ׫…n>ÈBAå¿ Ìr¿o5ê]%,&¾~£ r½â HHºUH V±Y!–‡D”_{‘üü …xwÒ¤Z(ÅfÒ¼XûLnüzá·÷×Ai„&q4T&-øñÛ›ýj§ˆlå›?Ú?üø!’ õ üøTÄ^|B¼„ܘy =º lcgËl©ÄºÑ“KSmâÐä$ª’ÔâÅVÁd?^ƱIÊÆÄ˜MiÒ3*hf¯€ïz:8+š%î«r–ÀÈs¹*È…«¿ë¶kÁ"iªM\š¼„^½×ɤë…GËðl+Rnðs‹%æoÊòõñææ•¾^é”s3¯-¼PÀ°‰vå÷2¨“~µ5U'\™˜oM>Û4ZÙ ;áÞ¹R§ VšmÛw‘4ðïžYh•ÚJÒÅ û™÷=§fë€ÏOd¶b2ô®>A“³™4[‹:±ÍãÈ’{åLݬTðÙþü š(-, æ—&ÜØ†WZú8­Mls-4A–ˆÆ™B³mãMøüäg™l^ ®  ˆM ±èÄ|,¹«LS­Á=—àéŠbH*ÑDzüÇûlŒ­†™io™# ÛVìño¡w>ëæÚD 2éÔÞú MêWç8¾oéL]­ÚºÑ4˜a<½Ì§—‡FøýXˆ­”œBàº2ý ^&¥i53E.¢mr®n²V œY¨ø°Ä{ ¸Ö€{°eÆÏ—1Ê:‰žm¡Itϵ94;okmv ²ä Û° Öl‚ËŒ›üRÓ´F£¡éÐØ·W53-,\p Cñ,Òdó³Ïž]éÛ*ÿâàÑÃ&+úøª“‘ÅMA®N¸2)hH˜t4°ñš,ñ(Ô4£‰!sÛÖõóœ_ö-{XŒbçóB§Šn!Û}ò WÞk7îÐäñ°ÆÌ¢°>or–Às^é¼qÆÛÞóFm¸ïÊi²úüêÕ·N\¼qô%L'€Y©f mRèrWìˆÓ8ÛXo6¡q0îÈ“§*ð76…  ˆ­ ±@xÎ7­^¯gA;<ÍS¸ðy¿æÓ΄& MF@Çbô`Òzå¶>ØDurßJGpe¢ê_Âe˜”§1ÒçDs½©kÕŠªVj œwØo®Œ­š°€YÌæ2…ªŽ$iÔ**ƒBhÒ~5÷a‚ÈÃÌäš\¬i^ƒªÙ+PÃb©^Ñô&6 n4@YéUµop@Ðdäå5 <ª#}‘˵xã*•ZUGËCžäBHt+ƒXMˆ4ùÅx4ô›ZµwT¡üs]Dì„m;¶Éhsã~ß@uy m“k‚&÷ŸÁÌñÚhBeRmŽ‘&c Ï÷ˆ{tr©Pƒ`ZmXhu:­Â°Óί µz‡ ÍóBëL2õV‡A!Ô9_mlŽÑ»·É?4ièz­ŽŠ•ÉJ·¥‚úáÍ‚[Æ´*ª|ƒwÑD^}\ÑÖû}n¬$\îJ©^Ó™Õ´EãÀÐ9êDƒÙ‚«+OÅ¢m"/îonŽú:ÞÑjÎÈò[M:"Æ8 ¨“³²œêà-h b›q™ñņMÎýñædùËõF¡”C#T(ÛêÃÕ@“ŒðˆÁç{­Š,©Ô‹¥r6[.¥ h¡~6ž^èM¡AË š:-„4y¶qŪpïir[kàd¢õ –É­ô°á°„•³ø3Ó¦TвØIù [¹}¶RÕA—€2Á¸šÎ²|äK`ªâr»™– êá-£ O–3§ÉD¬ É¥ñƳͱU5ÓpGyí6Ç2¸æUz"áXù)k0ËõZø ÆM0lrÁè¨7®[:÷5=‡…21,ë:ôqŽ6§ ~ñ‰©Rµ]jç@.Z:‹ÚdB(ÄZn!ðF…)ùlfµ sƒ0Ûiræœ4Î ˆÍR‚ظX9ÃX½ã8C„µFlóþ¸gØ `k¿·$F“V: 4i™ ”[qÏg‹'øƒ‰€þvšxÁbè psx¸æ  ÿTÕêÁ ¨ÎsuR-tsð×R”‰¡U`¦NéM½&lSžz¡Âûj‹Ð…¸ù} ÐäÒx Ò„²-KS‹¼äO•Yª?4÷¢ÉË@“¡†S°tGùZÜ$¼fÀ’¸2è5Á ²µFmXÏdyöš4‘+& gõΟÄrÇݳ›&+:4ÊÀFñ\`Gw a3Mx7bؤ4i¨…O]uòžP&ÈŽÂ#Y>m»ï‰Ì9M×ÔµøC0çû`ê"M°[SÝb|(ÜUÉwh§¡î¦‰h·pe’Kîld€m Ö[cSŽn¶:4 L9æ®À8r›¼gÁ®ÇÌ-8ñ­ »¸‹&©m4ñÁPüÒ¡I`Rè½o¢‰/³Ns&š°¾…1R%˜¡Õ2Ùä)7‘ëÞ$½ä9‡4Q÷¡Iƒ;1íD„h²ó°Iã˜Ñ\­“«— [/àjŒI^n=¡7¹U&ž5Î×;ç“ Ö?µÜIÇ7ÇYc8¡{§RißIÇö-»äÔ»O[·&d•0‹à.â©K;ŠWGîäêMYöšß¤MÍuñÑd?ðlð‡1MPQÚ¨N®3ðmtK·•ôò`þq&ß»«Ðëhʈ%Y^É!žt¾ßwLXŸ…V?‡¡à‹|BÒM,³¯ ë{×+3ÐdÜ¿˜´N:zôþvrw&l6΋ñRǧq.¾ Ôy þϺ06ö IÕU–lRM"ºÖ³À È…BñOEbì—ý~Ÿ÷v.$BM'Ú$‚¸ûë«úº 'åÐ_!þzà:Ä N0«Ÿcç'œYgN$ìãû±^ƾêqGÛmœ4Œ}•%ŒØo¥ TœxÓ¤ñkÇ9ÕkÂÿÙÛ!Þ¢ÉÞpÃ&ðÇ“á`û#äÉWWFãÅC>ßI\`xÄþPþ,ñ9_FቯÇ1kHðåhä„× Fï½çè6ØïC™¿|CxÍŠ}€©_cØÆöCïc¢À»Œ'Äz¾•&Œ7xòv“æ1CNzZæýu1M¾ Ž9a“*&“’¹{H“_mlÜã¥\29¹Í#ö„ã]ô›/ß}Ä—ÁÅÉÄ‹Áú«›n° •£öxrûQ9<¾ÀËÜzìë÷¢ ¯´|¡U†_¾È_yÒ‘÷ VÎb>¬š„ã˜C-_þúã4æ6~t³Žîqeâ¨6¢ÉwÀ$lRøßŒ‚UñÇ6džeú“PäçSwÍÍË‚7_ãÛ0¼w:¸ô÷Ì]úƒB±Ì¹Ó[ë¡ôâE\úÛo…D9OØêòÅ£ ·“3ù£;ŒuŠ˜§™&ظOx ­¼òþÙ{¤xný£zdP³%ýD“ï6AšpßÕÏÕɇ›žm¢™Ýê ƒÚ>çön‡Êuë/oÙ€Áþrª¥nK$€zâåVõ—'…¼7Zó„ÌþçÛ‡&¼Þs[÷_€*¹Ù)0U-¤Ë97‘à›hÂDãN\ÞR…¼ô'` ÃõA±p@4ùàaÍâq:ª“3Öhs“Y5®L$)Ì=b·¼á¢‡5EáoϽQ¼'^oT iòls LX,”/ÕkÆÝ·ÑhIýù‚Y/¨ÕÐdccdM=‹ ¼nLü`¼^³z÷m—(òGïTÆÛÒ’ä›Y®ûº¢q&4ΩBžT7y¦¥VsW‘EZ’+–ïû¬ê¨+EÒÎK’´»Ðƒ?™Ï˜ 1¥]‘/™6¸#¸Ñ/ÚH>%ÛQ5»jfÄŒHXÉͪþô‹çwOœ?kš¸GÓ诀ÙÑs’ ™?¬´y¾¬ÁìFµVaµjÃ^…‰ —ìU>}èµBÕf•–X‰$E½ë_ß}þʼnÛ¯ˆzCí”|¼¥ÁxÊÐ^›y%^IzØÐŸ^‚ÆÝ>[1ÕZÃfMÃÆs*8뱚+IÔªhöd{°´ó’$í.tào=žöÁ#ð:*QLûh2w¼Lðj­°&–P=˜Dœ61ϵièZ£¡Ùeé÷ƒ¾“‘4ÁB˜2ùϺÈnb²Áˆõõ!ßB\·¥V™™)ÓÓzס°æ4°ihµiÊ4Î)5¦ 3cÇÁÆåÊa•Ÿ€bk ÐÄ…îºØ2,¹b«B,¾ VÎ¥ÉöK’´»Ða­R(FùJž A/bâ9¼Á\™0?\é˜*Ï4äÉÔ@œCCg˜_\Ðù;‹»Õ¼ Äºi˜iø¦øÖÖ¾s²?`¸+|&%›)   Èõq¨UÁzA‹`ó v­frÓ‡Çëð´÷=sÈ0÷%WN›œŸ¯Á0쪊,Áí5’+v(ĢѻV §Fiç%IÚ]èÀ'‡R«PO—ó<ïœ[åb«ÃÊBGóù#VJ·p'œàÏL}XÃ-:Ã¤Š V„ÊS?’b/÷§±ìZºŽ{¤@á°jíïàù<_Ÿl–ÀNPž½æo‚õF×Z&ÔkãgžN¢Ö‹î^,¼%Öí0qlÑžYd -‰œÓ8¨éY­˜¾§Óã°€? +€ò™N«ˆël Ü~I’v:p@Mßî–JlrR$̵³Ùv<è\|!%–í–áŠs6f›ƒ®(*µPĬwŠÅL¦ÈJÑ/t-…[¾ºk™b§U/˜€ÂëÀ’Ó3,~ÊÏ $•|¶Ë¢“=Ä¢Þr¦Uâö‹Zk.Š"Z·Ä²¬”í»óN¤Â··4nXè¬e1ãÑQBlYˆVsÑrw²ß]Úui÷•ƒ0HJ>–gØœž@8¤( ÃcSE,Þâ¸C<<9­ÀïK™ºki`A«•Δ²ÑXŒáY‡¼ó¿ƒÑ”³E Ïþ‹Ñå9Wå ÄNF)Œg0žgqgE½á`qÁ£Ëç¾aòíf°qX²j’Ïibyâ$7Æ’ÁxO-5Jâ›^’v:x@V$‚âpU‡_8™dÓ#>=p!”™†îr/\ƒÎŽE³ån9›‡‚ ÿD=,’äK8«·ý®Ô-Ÿúñk|mð‚Ú0¬é‚‹ÄëexË´98Æñ|·_@Íím§Nð[’!&Î&Ý÷‘pÏ„Û8^‡’˜‹æŠM¸O Ìdü“S£¸š^’v]9€€>ÅäxqY‚ï,¼å4?2)²õ> E‰Ç• žƒƒ ÷ð/Â#Éø«Û‚°xr…‰›ÀÄ>*>jXï®yü¼^ø+΂ÞvŠ4è)ó-‰Ã°N'ÎölùÄâaäç÷“gR@âÏ;¹$íºrýæñl?ÊcÏ2lg Ñwá0ãçSÃ,#2ÁìÍ~rq+Q¼ï›fÍnZâdªIâ^ÿµŒ#ž©„ö>iüÛÏŽwFì¨ "„o‡äñûq£ &@ @ „ÿ XÝþVÄ÷×IEND®B`‚ IHDR&–ÏðÆtRNSðË.?$ƒIDATxÚíÒ1 0 À°òG;ƒÐ|Ó$AŽÌÕ¼à6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlBpÖ41sòwIEND®B`‚ IHDR&–ÏðÆtRNSðË.?$ƒIDATxÚíÒ1 0 À°òG;ƒÐ|Ó$AŽÌÕ¼à6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlBpÖ41sòwIEND®B`‚ IHDR&–ÏðÆtRNSðË.?$ƒIDATxÚíÒ1 0 À°òG;ƒÐ|Ó$AŽÌÕ¼à6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlBpÖ41sòwIEND®B`‚ IHDR&–ÏðÆtRNSðË.?$ƒIDATxÚíÒ1 0 À°òG;ƒÐ|Ó$AŽÌÕ¼à6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlBpÖ41sòwIEND®B`‚ IHDR&–ÏðÆtRNSðË.?$ƒIDATxÚíÒ1 0 À°òG;ƒÐ|Ó$AŽÌÕ¼à6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlBpÖ41sòwIEND®B`‚ IHDR&–ÏðÆtRNSðË.?$ƒIDATxÚíÒ1 0 À°òG;ƒÐ|Ó$AŽÌÕ¼à6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlB`›Ø„À&6!° MlBpÖ41sòwIEND®B`‚ IHDR&–ÝE³(ŠPLTE¸·Çþþþýýýüüüùùüúúûìë÷æäôïïôõõûøøøâáïññúö÷÷ÝÜñÛÚèúûûÇÅæÎÌéÃÀã×ÔðúúúÐÍï¶²ßõõõÔÒê²­àËÈ뿽Ûóóóíííðððààæ¹´çêëëðòñ¼¸ÞççççêêÍÌÚ××ÞÒÒÝääåéééßààÜÝÝr‘|ÊtRNS@æØf=IDATxÚíÙas›¸àRäJB`Xa"‰ 8uÈîÿÿ{÷HàÆ™IÛ/w³3»ïó!€tžž×ŠÞÝÀ-Vìgs¿˜z«y^V±²üÉRl»¡|w_ñÁ“?^þN÷_®g營tà+ç•ø]Pª›YÜ}«>Z¬ §TêÃ¥¾ò0ÿv3[Rù7ö¾ü¾ú}dáÿ¬ÖÍÞcZ-š†âÀöì|ù²7„wmweß—Ôè{úqWä©ò>E¡(¾Ð Š1Vö%-WüaYÅé¬IwÐq¿G¦àfÔÝQ•eÞTè4Q²/÷tQi!hP Vˆ|Eg8M²/±½’ü¼ªm‚ò¹î‡×lû¼94Bx.UQÕu(;Ⱥj¶wø,Ü£³\JÁk)XÁkzO[^󞱪’\0e¤j×ü‹ÃI šÒJM3LVu:¤…ÚØôJ:áZ%= *™¤£/X5RuST¶h–:Ý—_àƒBɺ>Pè¾ÉziXÕŠŸþâ‚¿Guf%š”ÃC°cÇEèêãäkŽõïSG¸òÁÛÓxÃ$ÛZ¨ÇºÍ0H#Ei&ÞIqèŽNè–F‹êTÛ³Vv¸©EyøD ´ãô¥P!8¥¥p¦–ݤÊS+ë)4üéXwNyÿüPKóܤ'³§¬|¬k ±ë47¾©ZÕ÷Èɧ4uȪ´itÓ÷‹f+ÚQÊI[ÙJ^·.eHšáe áqQ˵¤fFC;B줬‚0AÈÖŠïÔPã…´§`׋›i4vtåÅùhi¡rP½ò—í.G%ô,ÄarâąЃ哳·ãYŒ í ©ž¥˜ØÐÒªzV­ý¹¥:»>É×'cžÎÁ ú(`øR¯ÚqluÔfG¨]Œk¼OÞÊ'lƒ{žÇÆã8,® –›`¿ç:o­ÖÑž¼›/ñR[åž‚M¡bêûÈ­u~Ý¥vö¸Zš^¬“&È1D3ÇQÚÑ+k) iËH1‚R³¦Å•ZLàSÜçàs°#}†¸´KHÛ‰Y\H1qz<ŸÇ³__ίzöÑö…¼ÆÄ-Ýü:kïWyòaZÓ9½Ù©ËÞQL¤—gs ñä㟗°Në2OÁ¥ÐP´T_ÌüºœÇ™bÝ<>/³ññDÏku¨_|0: ³õë2{›· ŠI|™—eœã…êõ(QÎ"&Ÿè¾U½ÒvBQ¸k½QŸó­éÚ³÷c×uóBÛIÉgKrí³1e¡ëZt—Îý‹+Eå%¸¸c׿B¤b³†˜®FŠ }ô¬ÚtOp—™B5v¦|8M¦{Y‚¼øð]¦ ú©3Ó²ÅÄXe=Œ>ú‘¾Œ-am“ÏVмOXAßBû´Õ'n}ö4–³ÏseÑë¬R©À¯K]b¤‚u¡ OF7ºøL÷…÷¿úH…ÛŤ(ÅÂÓdŒyz¡EÂiYWŸoÚosnyŽn‹ =š»¤e¢[dÈG‡_:Ÿ‹¾xäöô85$}ý¤¶Pvr«éàÒ•ÑLŸ&Ó¾B;‹ÍíŒT@ç6Ehc·Ð@çÊ^” ÒgÒ2eq»VŸ’ö²=©t‘cÂè t~êžÃí(šòŸþ—ûO¡7kN½9YÙô é) 6g'7'íïŒÊú¦,Ë4™Fs,¶v¦·ö­múÇUþ0š/iô÷·­ Wô[uŠ#…ÒÞ¬“n£X¥oÄ=3=Ôþxf ,6“OÅ ê}³ý¹Š›”†Ô«f?°mŠzœªËfëyÿ£§9@W4®®C;PßäËü¿3´Ÿ¤± ¥æ½"5+£”Õüàë«¢ÑÛÔ7øóÚ§cÙ~~(ò_Ó÷ÃÛÔÛdNS™”»U¤FoWoû ¹`Kç׿¿[çæÉw7ë\—û§ÿÑ`³wõ­»ïçÒhžù àýÐo n2Á~±Ê¯_üG õð¯ñ?ú’”.’[AkIEND®B`‚ IHDR&–ÝE³(PLTE•¦¡ýýýìë÷õõûþþþõõõúúûññúùùüæäôÝÜñâáïÐÍ֪¥ÝÎÌéúúúÃÀ㙒ܤ ËÛÚèúûûüüü¡œÓ×Ôð²­àÒÒÝïïô‹ƒÖ­ªÑ¿½Û¨¤Óøøø–ÑÍÌÚ××ÞääåóóóçêêààæÔÒ굳в°Å›—Éðððö÷÷êëëÇÅæwÇçççÅÄÐðòñ¼¸Þ½½Ê„»éééßà๴篪Üíí튃ËÐÐÖ‡ÐtjÐÜÝÝŽ‡Ò¶²ßŒº¸·Ç¦¢ÏâããÀÄÄŸœ¿ÊÉÔ{tÆwoÈ××וʬªÃ{rÕ“»ÔÕÕÚÚÚÌÌÍáââ¼½½ØÙÙ‘‹ÑÐÑÑmdÄÏÏÏíC ÒtRNS@æØfbIDATxÚíÙ _ÚXp‚Éx+4”›Ðr19‘’hÙ„ÓM-Fi±;"Óéî÷ÿ û&XE‹Vg:2»>ÿþZÒœ[š÷ái&°ÂÕA6›][ÞG\Ëf¥MôËúõñÆfæ—lvérÙ­íå«ëék[ ód6¾¿(q}éÄðWZ±uy´™Ëå_Ê‚°¤ÓZáU®X*W„ûfÊ®·«i§$ˆßuÚx™«åsuyÉTk;õ x]دÆý²“{Ó¸µðÆN3óýÄðW7_µÚó2lï**Óö:j[Þ~YªÐÛûõÛµ´ ëM½ÞíIF©´—1wÞZB¦½½µ‘µ¬˜‘³›ôR.U;¦,•ꛚ$ïìIÌ–ËšZ§æææ‹lZé-¥£6C²ö:eZ`K{MÍÙ%SìïÔz¿¢• ¡½§¼}¬,®»ÿP=Ië(%YL/H¥ý®P© (O‰Þ®ÕŽdÊTÄíÜžføùÜ[M-ƒ¦,wZÃZÕ(Óž°^PøàÐ ß l>l Ö~»;T¬a0Ìs™Uê-í¸Uh Z5Õ¨ýó¥†käy&«o†ƒÀJÂh ;’Ô÷|κ»u3Y W£÷µAm óá›Z>0퓔ݣ e'+gÔ·›ïÁ‘)wrÃa õ÷m³]þü?*;8—è½Z:<î:aÕµ:–r”«[Nu¿Ùjj”¡×Ã\ÐÅ'ªå¼kî7†ó®IõÝB¡ul¨»u5ßÔê§>W•Ž“ÎÇ8v»YUK£@R>ÕKG…$Œš,ñÉÈ­GÇ­=¯©wT=OÍãŽÒRöŽzªsÖ‰j*«5;Qè™íŠ(ª ¯Þr:J#búQG «ðYÓ¤veÕ·î9Ùù×îû_cÆM!ãŸÃó0_çá›j¯:QþU-ÈUÒ9°|׃+¿òñÅš:7L9xߊ}5 <Òëk|`ó™^Œ]ª 5ª1ƒsÞ§\QL¸­4<#vóS[óšU68NÚÊø±ódÖð·žãÛ}Yô_uìYؽzNnøEo„ŠëÄ^ßäÇó£ˆbâÞŒ×õýúçÌ9Swä‡-æí°h³qOõœËNØtäFzÃfnÏs<ß l‹&4f gÚØ÷¦]׋Ý";ù¤°úq7:Òã1E5ªùÐbãZ[Hwå8²Ôîø¼8¶|½Aky^ºÿÁӶж}>œÆ¼-$1‰)&¶ïžõÎŽÏ¿8½³³ÓqsÉ¢˜Ì|ß9´Y˜;ëõÜÉÉï¿÷â°šOÇÇ~¤Ÿ²¯EÆ&ŸÏŠtjæ~Œ)&±Rì{Mvò‘E£ó Óì¹Þiï(š4 Ìwè8Wœ¹ÿîõΊuUïΊIKñG4o#¢˜T2ÑÚ~tÓFnî´W #½ÈlÄä)­w$u)&fEЏeÇjì±È鎜ÉtâèúÉ9µIÒžÍóüÐòâp¤»_'áoƒ0Ž.ô®ûõËä?ñl2ÿܶã‰;r.Îý‰ÃâÉ”6§Áˆröšۢ_&ëƒñ”ùá”1_¹¡ï~:éê~T?§‘úlêŒF!Kc"M%îùÎQó<Žé§•úþyˆ˜<1Á4¼Øé^èÓ¥E ¸eÙQMý8ö§ôB\dÙ4,Ëè÷ NA¡¶ÈgŒÅ³h:MŽmÏó¬9FÃf³˜%gè7Í͈mS;×’‰xÛvzŽN±˜&q£óI”t´“‰¶ïÛ^“Œlöé’Øœ¥/žEŸsV}ëž¡­Q,¬äc€P6¥>}‡Ð( ´­P¥­ôÅê·…J›š$Ó4©‘jF•¦ATM©çÆ%*©g'uäãI¬’À$Hû}u¡,–—Æ&9•³hû¾Ÿ¬—ÎÃÓ¨&ƒè¢2™r[Ò´¤£&‘^’ÉñMçI T…m&Éq*Imœ2CeN¿TPNÌv¹R‘©Q¢ p#)]ZÓ¤ÜI€.Iéƒ2E¿m@Üè'+˜m¹"ˆ”“d|ÚcÞ;ݾÒB“Òs -‰\ú8‡®ÊL¥i’EçCÛx¾ö¤hI¤Ïa¡"J¥,'ÅjËó—ä«'EE1i¤¨P9çqJ«Jõ—Ëߤ­é©¹öu‡Júð^ Iµ44å˹hÿâIñç݇¥;†8¿ órÍtº²€§k«'ŠT˜2åBH_n5 •¤äIbè7uHtE¨P•¯O ×¾O:PéDÚü-òâ<É +'éïd>ݪo¬@Š ¶x”…o£ËÚ~<þæñ#î^åòüÍæeÝñE÷é‰ Oî© øã ,vHŸvˆwÎ$./.¼ÜÝý!‘…Ÿìº W­2 g27›Äo'oý).ö¯;ÜœèjÌÕ%Ü{»ÿÕ=$²ðsݬÁ2w7Ý5â.w¯q÷Ê™{á‰<¤„¬î=uô€Ì}mðdV‘Ÿ“Ÿ¬Uß¹çäaoÜÕÁvòwðÀ7.bò¼!&ð «Îbò?aÕ9øã1Yõ{Vnûª#˜ü}-Þõ?R¬ÇVý‘3eî}êOgñ®/äzÝôçòòøî±ê›sâõSúemâ·ÿ^Òáæ©t¸³ö·OÜwAðL ôðã¿ó“vgÏoÑyIEND®B`‚ IHDR&–ÝE³(€PLTE•¦¡ýýýññúÝÜñ×Ôðïïôùùüæäôðòñþþþìë÷ÔÒêâáXÞÐÍïõõûËÈëóóó­ªÑ××Þ²­à^RÏcXÌ{tÆ¿½Ûö÷÷úúúüüü‡Ð\QÃwoÈÍÌÚøøøÇÅæµ³Ð¤ ËŠƒËŽ‡Òh^ÅÅÄÐõõõÊÉÔ¶²ßää媥ÝM?ÆE7Åúûûúúû¹´ç•Ê‘‹ÑààæíííÒÒÝÃÀãÐÐÖ¯ªÜ‰¹„»ÜÝÝçêêÛÚ謪ø·Ççççðððrj¸âããéé鞘ֽ½ÊêëëÎÌ馢ϲ°ÅŸ§«¡œÓ‚zÎmdÄwÇŸœ¿{rÕ¨¤ÓtjÐáââREÊ–Ñ‹ƒÖoeÏÌÌÍÔÕÕ“»jc´›—Évp²kaÑ™’Ünh®ŒºÀÄÄ×××ßà਩©ª³³ŠŠ‹XKÍÚÚÚØÙÙ¼½½ÐÑш‘‚‡†žžŸÇÈÈÒÒÒÏÏÏÊÊʪªªÁ´µµaY°kf¥TJ´ÄÅŲ²²···E9²îéÀîtRNS@æØf–IDATxÚíÙÿÒøpr­WðËi]Ûm#`L=v)©Y!)i²F+¨œ'Á¸“&§KäTZgW·ýë{‡~Õ«:wÁ9_Ï Éçóy'æý26ø¿Ã0‡ï¾;Ü:éë‰ñ±x"ñáJgÏ¿Ÿ‹=wþÔRã¾9ÜVêÛ‰AóOÔaÎŽ±où뉉Q_´/ÏøäTb¿ —þ0=3Ë%S§´p,=77¿Àñ©%år&Áö?›KœŸJ¥~•º‰+Ó¹ÅEA<¥ÔÄ¥3hÈØ¼T®(êìl‘)^½ZL1º~‘‹V/]˜`˜3ã—¿/2l57ÅrÅZfUÓ•ôZQ©¯N^ÕRŒvîúÕb!*4±.Kºdš†V\(ñü¹—Ï[Œ¶úç¥<Ë—6ìY…·Šñ¤žß¸  Ž\¸YV]š­.p ÃOÎ*ŒvËNòÉr2Dg/mÊ+:Ë¥(&rÑÒj·ç¬æõF•cïίßÛ´ø$ÅDÝl´r?LjùFîþòª"/æ²¼–sWŠœ=Ûl¬J÷oh¥s÷äÚS÷æÇô̽å+éU®óÃúòýbF!#²Š!I†ððÁ‚’¿ugÚæÜkWnmf¹ÕÍéå;².ÜUëééõ;•ŽœHdË–VzDÛnœ½õ—õ´¬׫,K·£Q_º/ÉÅŸ&ïoÔ5cbÕ¹Ç3vµ+XµÍ¬)W„Y2ËU…å S¹ÛóÝ-/7¯ª•Û³™´ÛêlN)†Û0kœQ•¥’<©Ø75í®ì[vZ°º3Rûg³]ÎZ¾ÛÔ»kþJ¶¦°^±ÌrmeÙõÝÜÊ…[Sæ­Kk,—d˜lYS7\ÕÚj–L9¯—d{ÊÍZŠ.p;šÔúw½Öp-ÄìòJèÙn»Þœ¾“Þ,›Ïóéô߈óSwk^¯×û幟Ÿ™NWf²~»;c–*Óét£V³õRÇ­W›-õE§® n­õô‘ÿ²Y«¹‚¡ÉO¥òŒVjV%+ΙEÃï?smÓ43Û×|»Z:/I e9ï>Q›ÁvKµj]Ó$ÍbùT“ Z•´íì…›²aNInJe1šo~2ëvºÚ÷ž±¯LNÕÝñínÍÉlìl¹ÕðåÓó-qjÉTûÛ½_j)WÙnÛµ~??¿¸]§]}ÒϺA¾,«¯^¨¡›kÍy;¬< ÿöâµPvÕí®¬Rhvä URÄâr®ï¶¼U“MßìØ>- +»5ïUÅäª÷¢bVå¼Ýü~>0t®°7‘K~Fì\ÆßêTó]×oQv“aùvɵ¤ö£¿·‹KQLTº›ì¨Ž¼»·Û}³“ÝÝÛ›y¶ìÊ’é;ŽW®øê³ùݽµl¥÷æ\ïŸk{{k¯wš®#”åàçAø¦1·»X±ÊZ¸õâuX›ßÝmae-ä¬Z·Xqjynw÷¶¼î< œ‡{‹\çù¿wwÝžÙyå b"ô;st= ‰We«^êÎí=Üpœ,ÍëlGÇò“aJŠºäí¼ì©†˜ät«îû~«å¤ùrg»/ÔjôBO$.nI¾_¯×¥–Ú¯eÞ¼l·Áóú;™ÌV41½P _U=ÁÜîõ¾¡ªª¥Ú³žöûaè>=)8Q)eOUC' hØhêóÇfµ¶-ò'i]˜¯ ¡?ˆ W´º¿`¶=ª‘·MÇóOõ ƒ’ЪÓšA))(—4!š-¢©QÜèNî2(†D¹£˜¤bÌଔ¨%ŠS9 ìà+< KŠçD–eEú°˜ ÷ÏÓNÔ­¨eQ{ +ú ™JÒPšLc,u҈ƔAS£¬x„‚dh4í¢Âq…²B[´U`˜&XJœJ³-Ú 8RnŽ]‰¾ôò a2:¡¨Ž¢S„÷ˉ<¾S‚I"ѯÕéý@¡ŒÂ#Rf¢—AGhˆ‰ ŨçÄèW]|òÈAìøCQ…ƒ ƒßÃRE6ŠŸg?F”›ƒiûëËY`NH<<¡hiŠùÍÿt8vô.‘H¼çow‰Ø;C´Å]¥QGû;£…(NƒLE-Kœ0Xš:Ú<1á¸6?N„29X;¨r|äýEÑ6sPîc„„OtÜÿö>)ñþMzëýéóï/5HÀ;i=ŽÝ«o̓!:Ñ´ÄÛwÄÞŠÿŒÜó§zwø”wæÇÞ…aùU*>©‘Ÿê“ }ð¬`hþY–Q_º/ÉgädhFÝiÄäs0êFÿQ@L~FÄäó0ê|4&± Á°Œ:ˆÉgáäeu$“߯“Wý¿iÖ§výÓ*ÅÞ¿`ÔbìÈoÉÈÛë?^ê}Çõ‚@ëFëßðC¿Ù IEND®B`‚ IHDR&–ÝE³(€PLTE•¦¡þþþùùüâáï×ÔðÔÒêüüüññúæäôýýýÃÀãËÈëìë÷¹´çÝÜñõõûÐÍ廉ϲ­àREÊXKÍcXÌ‘‹ÑóóóøøøúúúE7Ū¥Ýö÷÷{rÕ+Á¶²ßúûû‚z΋ƒÖ9*Ä–Ñ›—Éž˜ÖÐÐÖ¿ÎÌétjÐoeÏM?Æðòñ^RÏÛÚèððð××ÞÍÌÚ¤ Ëííí­ªÑõõõ¯ªÜ¬ªÃßàà5'¶ÅÄи·ÇÊÉÔ¼¸Þ¨¤ÓÇÅæ\Qÿ½Ûïïôääå'´çççààæÒÒÝŸœ¿²°Åêëë•ÊE9²rj¸ŠƒËkaÑ¡œÓâã㎇Òh^ŇÐwoÈwÇ“»çêꙒܵ³ÐaY°kf¥‰¹×××{tÆééé½½ÊmdÄvp²ÔÕÕnh®šš›ÌÌÍ„»jc´áââTJ´ÒÒÒØÙÙÚÚÚÏÏÏÜÝݪªªÊÊʪ³³ÀÄÄÐÑÑ···¼½½Ÿ§«ŒºÄÅÅ¿¿¿žžŸÇÈȨ©©]áçtRNS@æØfdIDATxÚíÚWÓXp²b4 8òQ“BÄVåC¡%H¸Ó‚!|ÄŠD ÌP ©vL›E»»Î.û¯ï{‹õ uœ=*çèó;Gî½¹ }Ÿ&·-mmßAx¿ÅµԺâíã[OuÚ*|8Ïï‡ÿá‰Àç÷¾ ‚в„ÂGúΙé#s §tuž7ú“2 ŸUS„VZuµÞãONôÿípÑOÝ÷ä“*ò§óðU\ôS÷=i™…¿œm]j¿|I<¿RWÚ/_•¤?(g{ÓvýøÃ¹£:»º®ŠçNÕy-~èºÖÔöc{ûåN:ró¯råúE?™ß¬æç‡ÅéîNÐÛ—¸!+Éó’ÒÓŸèPÕäG“rS’Îê?(ˆ·R©ßÏÕÑŸ¾}箬žs˜Ž!I¤ †GDñ¬óZb4AV¤¦ßåÞ}Æ]ô3úMjYÛ+cã™Óúg'Ú4mòÁ”.M ç *XçôÀU1®|ÏŒÊ~Òõ|!/ óIQº7Ð)ÆÜÔuÐÞ>ÿP¯.,>RÙ¡‡WMqbél-ªRZI‰ÒÉá‡J<ÑÃ,Ses•e&—×dáQnÀž n}`ÞŹDžÕeE™°“Ê¥©Õ•“#KECÓµ•©ùG”+ÓÃË¢øÃ“¤¢¤“Ïï#wŠõ›]““IÝ2Óý‹šÙ;°þÔPíÞ»ƒª’¢˜tk‹w˜3º>¡>Ëv=_T/ vgU¥´ÙÓ{OU³Ù[ýÆõñÛËú@âÖØÓnãÖè†UXÕµ±±®ÞEUMweïñ0J[)U³MÓ²·{äŸ{™ïß4Ô¥±» Cíºsûn¯žy–7 þ²1ž§#K‚XÔ-ggtþqŸ­>ê¿‘ë5ÕŽ'²F—#¬Y>¿–1¹=ß³É[¦,ô–_ìº{kž¾¹»Xy¹j¯mæó¯<ÝP¤\ßæ“BÕýiÒ~0¸XÉõÙ“ý4my¼’Ÿîwô¬£Moêú¯¶å$&)S¶¾ä™kµæŸkÚJV×FW´Â3]3’ê–šñö¶¦ÌÝu][Êh+Oip^ÓwKzÏkÓ¯å­RE+QƒåPxE)Uôüêͺ½£oåŒÌÚM}ñ¥m벂ËÉç×*%?öõÞ©»L§ËIvÅ ÜtÁqÆï§Ó{«ìY¢t~:º‘êYeÕ¶Ãz‘93ýéôfÄæ†ÌþR)½7Âî3sçµï¼ðYXóMkxˆùK,úÛvÛzγ̢c.YæNÚ1)p{º½)™»¦yû­eiÖ¶dš~aÁ(± œ‹Òï òLºäèFR‹¶ßØr,ëÍ]³æÙÞlŸsëµéXš*^ôsú j“ÛÚÝ,Z‹ô°j5]`Qi5¬o¿­Ï¬³àï3õÀÌ(ÓSNõbEùñý 2Õ¨äG£Ér5¬l7ªcn”+‡Ñ‹(tþÁª‰í X ܾ g.+$¢ˆB“Û ™—Qó½yÆFJÝþú<‹†Ö#6³@ƒ‡‚ú«wáÔAP/ϸ[;þ^7‹Þ6L›.RÑvÜ'?:X‹žEl¨­•#FÙEL¾€óSÒÙ§ÛQeô·ª“IJÙæº…(Ü_¨ÕžÿëèèU±6þæ¨îëêô”éÖ«A‘EáÐx¹øïãB±6æºÛÅòøêÑþËz+a9 Ý™ñòÂæ»ju)þó.t×ʵš`f/Œè`Ì%jåñÇAt°õÍZmì> ~^®=9¬n¸rŽn{QžN`aÖá1hmÂò}åâA=8¼Oç5ëR$CÄäËhzCÜѰ£ÆÑ¾ëhЍj&cÌw½ö GÇû wqçè8Ž ­(XD÷‹:÷sÇÇG‡õJàVëù™ßŽöëA„Q1²É·^¯ºaDôãlnÄ%AP·§©ªaÏBEn†Ë/UŠI}mæ°Q¥a¼•ïUhÐIL”Œí˜Î\>à“TrŸ-ŒL 1ùBNCòAƒhèÕ˜YETd›‚àѲÀanã°N•覣ºiÚº®S§UjD¥¦ºÑ€F5àárh5aRAYðB2‡9ŽïøQÈQüøZCnSTÝôo¤PÑ.ñèbµ±ß¨»¼‰æ¡ý­r"ßtÚY·h…Ã'¢þx:ºçx²Š%ì×#ªÛ2-¯“jF×´L†§Áç/jÓò£ ôm#•¢bi²¡Ôi[ŒR`Z¦ãórÒKÛñl!bë¶G¥§]©‰óøõÇw, w±©$Žà#¨‰ºé2ºüúã›o£uªG»ù|ÉKïz“*šJÙ¡SÆ(]ž­ Þ=” C&†" RRQBwY÷(:ZF§Šñ÷žRŠZ“©TR¥NêhkÕŽ#aœ‘3TRª¶lP#ýG£(C:‚¡*IQ’èÂÐx ÅŽdQ)7¶ÆGŧï¦gÔa*>!-ž†§”ïÊ?Žè§î»"‰©˜(´ ´-úIáá¡Ìœ<Ðå] .‰Pg’·* ÿG¥¥É3Š*gâ¦ÍâOØ)˜²–‰›è8 åJÎh<8Úé°ÓýâݤÿáÉ1ϦKŠ".&_—дf9û{1®*…#™<ýXüý˜H¼1ÅãÄ3EÛ|=#ñ]Sg_þHMNg) ÉÓoxw’‡EŽ?smšåý‘ON(ŸP<„o¿Gñe +R¸0ÿ9]r3Eƒ¤IEND®B`‚ IHDR&–ÝE³(kPLTE•¦¡þþþýýýìë÷ÝÜñÛÚèæäôõõõùùüâáïö÷÷ññú×ÔðïïôõõûÔÒêÇÅæúúûËÈë¹´çççç™’Üh^ÅoeÏŽ‡Ò××ÞøøøúúúüüüÐÍï{rÕkaÑcXÌ–Ñààæ²­àÒÒÝ‚zν½Ê¿½Ûääå„»ŠƒË¯ªÜßààÃÀãíííREÊž˜Ö¡œÓ¤ ËáââÜÝÝêëëúûûÎÌéÊÉÔÐÐÖnh®²°ÅðððÅÄÐðòñ¸·Ççêê•Êéé馢ϭªÑÍÌÚóóóµ³Ðvp²âã㑋ѬªÃmdĉ¹aY°Ÿ§«¼¸ÞwÇ‹ƒÖ{tƇж²ß›—ÉtjÐÏÏÏ××ר¤Órj¸ª¥Ýwoȼ½½jc´ŒºÀÄÄ“»ÄÅÅØÙÙÔÕÕªªªÒÒÒkf¥ÚÚÚM?ÆŸœ¿ÌÌÍÊÊÊžžŸÇÈÈ···ÐÑÑšš›´µµÁª³³¿¿¿TJ´ˆ‘8?TátRNS@æØf¥IDATxÚíÚÿ_Òúp™_È2oNÓÁõ$É6—ŽÐ‹ï9#¹Èò¨¨[œ]1¥óåÞ?ÿ¾šÖU«{;’_Ï_˜Ÿo[{¿ØÔ×=à;ÛêºpÐ}¬ÔÙ¾düåK´}ÒuÑè/üÎÊpE|_““ó#.›àó]¾ÔIó'½þŠÄÂwv® ¾Ë\Ñõm¾y¡«&ôúÌÝ*_W‘ï“ï«×§î6ùÁ£€˜üz]jÄäFèu©“› ×•FLn†^—1¹z]ê/g1ùô:ˆÉÐë|1%W}é׿+ß·ß­ê߸Òz}æn™ó'ý“ßv>-Èç?Öüo!ùÆ.Ñë“ו¿¹æt«`pÈqï ³_ªpÿOgÛý}ýwï]4jäþèË\´ÔÈЈ÷r÷îÈYÛ߆è >ÛóÈÀO}pÍŒq'oññ‰‡“S| xÁ ¿Oÿüh&Ę«Vz<ëcNë|ƒsbð¿ã0™žœ˜Ÿb/ØÍà‰¡Ð.,È—éëúhñ³-z;êõy»]î,=Ønf”©¨šT^›{Š1>öÁØ]¶S²gJ|yEOL%ã²oplA2à ¾Àý±÷¦`aTfR“JÈÏ ÃÏÙçi-£Ê,?«Ò€Á¹Q¹“™áɬ*Îæò²Їbüƒ±Áá}<Å3÷•bq¶…ü{I=ŸðöÌÈ/”’– ÅOôìñ¬Ÿ|™ð1ää: -Mg¥D§³>“ã4®üj<¤­¾œ‰äÙTz~i"—àc¾¾g¹©Ys­´òpN~]Y|“ãäõj5Îÿc~©òDck‹KÏCÓÓ Z¼:>9]“òO×g뺕PÖ—Âo9vóá/Õ'…Ñ÷$)§dN*i†99(§ß(výÕøb8Î>ûykfK( Nz^ÚP2”SÑ5.o†Ç×çü…7ále»05™,ØrrÆ™ÄLŠ÷õÍïl5vk{yím¤lTÓV~^™Ë®&e?ÏŒVÖÃé}ÛÜS§vªFn]^¤g3™ÈË×¹‡º¼š•ŒÉ¸¶W,‰{YUÚk8œY+í¯Õ“ᢘŸßM˜«ª°¸œðó|6ï—íwµf9<''kqêä_«³Qåår¼¢[EÊæ¢¹ìrijJ+°1&XÑE7­ÌF³eU¯å¹í—ùeš"§Øàÿÿ‡¯tgúé£X’ægúµV½YS1òªú¦²Ïm…'ç'“%Í]â‡õæ¯kÑ݉7Õ-CÚ®P]nMίëjÚ“CÜ3¢jX3zí°d¾—¶ß•kËñE™3׸dz—£À)sÏ3ꡞN–—¹rÙͨ5¡dˆbrýxnOPçÓËYWy-f8ÑÏÐÕD´Òda)?¯g´ÙJ1Nû¢¾X¯ÏÝ-²0#´÷V«” 0¬k;5¥)ÕÛ‡J¹e4Œºñvß.Éìh¶å¶ëí•55¾™N ŠàÔóÀЬµ„Ú¶³WT…Š®6ŽU;RsÜÕê®k¾·?ì‘¢_×% Ð0$.ÁæÃYWr”Zë]-/é{I)YÑ]s+iÕ"‚Ñœê^’Žà Ö–êmIKñA¦s5ÉÚ’rЪ5’’1/áßè®UàÑúºŒ¤‹™Ò®ÙhK2O1Q]ë@iªñÈŽ¹³vtÔ0M³ñ{[Õü Ùºê8ÖÊšä*¯vÌÈöî–9¡[ÊŠiV·[«Xºî®þæÚÅÍ•ÍÍꟖùÁ‹‰£lnî4móƒ+¬ª(ûSÉêΊYܵZÒm§wÌÍ Ý1ÿµb®¼kWf„brPOVLsç­›¡;‹¯¢g(K;æÖ±Õj¼ÚYQÚ^$%Ää1rBŽ6·÷›’ÆÆ2'I–-Ij;§ïÖ¬þû¡“D†‹ªRÉQK’•,—ÿÆûéáÂï÷dYã$×V£”‰¨äÕ“R‚NÈZF”TºðpZ§Í+°—‡Œ—1zÔ‰XÙ«¹7¢;o»åØMJ‰×D“2JcIÔ¼çô _è‘· %X¢q¹ó×ÄG(¤R?óÑ6Ûá¥î@Ý‘¼—d‚ÔÅbž:]r¨OîæÀQ8E‹ÉÝ‡¢=øý,c˜@w>µyM)oÞå‹rÓ™Dû.RÞ4á§‹/èí“(A^„µîTïÛ¸6¾`,@bA¦³$±å…ªEeí¾PE|LŒJÌ0ÔIQ¡JvãäïTÕÏó|àõvbÇw±çļïa}tÑJ$:1žBšH%ºÁKu‡ÌëL vðã±§ËÅ‚HÉõºð?©\ÊèVäìÇ~&è•<æU/Ø@å?C½TìàisnÀÉ ÞoñÓnÞ ‹—› sn/½AßÇ#ôþ¦9å‚ 2r y¡Àåþ2ÿ)Þ×ÖOnzIEND®B`‚ IHDR&–ÝE³(}PLTE•¦¡þþþýýýõõûññúùùüúúúúúûìë÷âáﶲ߲­à¹´çÔÒêÐÍﭪѿ½ÛêëëüüüËÈëæäô¯ªÜóóóÎÌ骥ݼ¸Þääåúûû×Ôð¦¢ÏÇÅæ–Ñ^RÏ„»“»½½Êðòñíííéééïïôž˜ÖmdÄvp²õõõøøøŽ‡ÒÃÀãTJ´ðððÍÌÚÐÐÖö÷÷çççÝÜñwǤ Ë•ʬªÃààæE9²âããoeÏwoÈ{tÆáâ⵳СœÓ××Þ¨¤ÓaY°ÔÕÕçêêÜÝÝ×××ÅÄÐÊÉÔ‡и·ÇÌÌÍnh®›—ÉŒº‘‹ÑÇÈÈÐÑÑÒÒÝŸœ¿ÀÄÄE7ÅtjЋƒÖXKÍ{rÕh^ÅŠƒËÚÚÚ²°Å9*ÄÛÚèÊÊÊØÙÙÒÒÒ™’Ü\QÃrj¸‰¹kf¥cXÌ‚zÎßààM?ƪªªšš›ÏÏϼ½½jc´ÄÅŬ­¬ŠŠ‹ª³³Ÿ§«¨©©···¿¿¿´µµÁžžŸ"|ftRNS@æØfûIDATxÚíÛ{šfpµÖؤ3Ì@]NÖ Y4°ˆ)SL,)6Fo»kð.ºé6.—]ïÚe½ûÛï…dMÚÅuݳ‹í“ïçyl÷Ç ¿¯ðX#xE£çK)EÓÇ.™)\žR?}ª³µÑWçùyù~çmˆþbß”‹S7ˆNŸêlõ+£—UÿšÈÂïëB¢ÓLš¾Å[N4}ƒ_œ ®Ì¯já[çáJÌúÔ]'ïz“wÁų>ë¶#&ï¬Y·9y̺шÉ{aÖFLÞ³îô›£€”¼fÄä½0ë &gý75ë-»þ–3E¦o0ë3wÍ\<é¯<Ûyµ#¯?¬ùMyë¦m1ë“W­ø ^>^‰ÝˆÇoN©¹'Þ4QìÆùò\<‹Ç/êF297e'áÞç’b.Ͻ^w#Wìæ­äÙRr~áöDì²§r7?H-,RtìŸØ%ÿp¾œ^Š0Þ¹ä ßÜ­Û™¥e–»dª›wï†Ó,§Ï×Ñ·–²·oqt앺f}Ò®ŸôJ†ãè iwÿ˜Ëóiúãt2|ðÓgŸìä½û¹â=‰E&’H¦™h„K&éHDN¦É'›ŽÇÓäêqgU9™JÇe™þd­P*¯'Šš–Hqüãt<ÌýéÊFE+¦JR¡ Ä‚È –ÒI.òñ|UešZÞ¤%6-õ7?(>ÐÊCéPZ&uZìÕàÀÿÛ܇ŸÕXI‘ÉY¿[ß,F#»X`3[©mŽ£–›™E)ÈPrª)S[ÚfÊ•æ² on-}@353Ëîó……ÌRIZ¼¿(ëÙìÒ'ViëA™²m†jU²Ë·yo¹y»NÔ¬ˆŒ°Í³,ŸZ”¨ÛÍÔüNb³²ØÌ”Tf7[i)âGªdU+•v¸AÄyTÔ²[É”å5ßl¶a!/+2‡œ\¡äBçq›9¹óY{¯Ûªmì³ÍZfu×–?Ë®Ü/3J"Fez}­nUÿ”ÚÜùâËÌnChü¹Y‘Öÿ²R©7 å'Zê‹EaþIƒ5WµÛõ¶ê>hyƒÊ×¶¹†Äÿ5;°#) úo®ÌPÖÞáp´ñ¤LµëæýÇ ÿ`eùÞ®Å~õuV³û_•ÙÞ¸‘lK$ QçŠ]ŸÜŸws›ÔR­‘Ê­«K“R‰Q¸YŸºëäníñ—9Ë $:²þín~ÀôÅ/:)·>Øv¿TW4UäÏïÕònˬ>´|÷ï©êê†Î×–:ø6•Z­ëW:”3QY¾î ë»±½ÆÚGUSÓ±]Úk¾_Ý¢ÈDÛnI0úÿÈW;a»Ç *?!Åۂ׬­ŽÎwmg}e[ X•„—Ž9߈þ÷Ÿö–\¹`T&~æ@Ã`ù1ÿõwã>µ’ݯmû6ßyjðOvÝü¤½³Zï¹ùª§ ŠšXf·û¯‡¾©}íºÍ3SµŽWy,›ý‰oWr~ÿß¾Õ.zº³zä?[³ŽŸÿàhUÝ<Ò$4YÍ óÝEÃöÝÊq~^?ÖxÖotHñÈ?Örë[®×.¶[«-ç±É–!–.Œ Ÿ·X³—ê×÷U«’#ûÒu± ã®sU¢Ÿ®¶(ç wìQ ½_Û·L¾Ó÷-ÿ¬—ß;ÌNGîÉÈS63ðÍîèÙCk˜UÝêq¿²ûÐãëÕª[é¶wí®û÷cÎòøÞ‰;~>´½ÿþzo\¬½Ø«>*öìCm<®¿8üÞ5GU×Ûû¯åšÅzN˜'ÅáèʼnwÜ+ÖZÃàÝ K.EàsãÚFÃs*¼7Ü›Œë“žùüAn\tGNµjÿØéïõZÃv}\ÔL6ˆ‰•T«]/Öª¦Ý?(Ö´n—ì 1¹Z#Z£îÈR™SÖÐuV7|“ê8]ÓlõÃc!Y)©¾ÁŠ¢¨–Ã;‡ÎhäxC{Ôâ®mY–Oäµß2mÓ´=ËVYNËyo°£(ŒÞÚ!cÞÐ#ÛXåòÐ6Öœ6ßÙaY8•åEaLbJbYkgÝ#Ãv«Îfù"ƒ›Îâ$% ÕIGh™DŠEÖš#›ô+øãSRB–ÈP*”(QÕ}{dzA&,Ï#æÐ×YV%DòbuŸ4”ô˜¬"/ÝOÒ§ŠTI’Š þ´Ž¬RuþÀ&I5‡§e,™L'QõurÓá¢QrTT¸Wr8†qº)Þf}î®Z º@ …Ž%¦À0S(‘ï¤'jŸ\ßeš“É¢ÈJ0(’W6Œé§(BéŒ@‘Ž’ pŠ «HÄHC¾áÒ )ȉ¡¤Zd pC{Hn$§«B¢JBTRèH”#û vJâCB¤(¨#_‚f}ꮓ'+Š$)2 –åD"!˲"‘v $3AÓH‚¢Qš Ñ4‰ d‚T0$0a,FR^’˜`S …¬$ÿï‚ 2C4K„s‡Š,‘¹‚ë—N®-Tét)ì™\|‚ÿ ¦Ã*÷aátS™ÆÅä*Ect |Æ…Â8måNÿ!CáÏ°È — kåŸMpý2*…±;s±àô÷Ÿ )Hp§û 2Q“uVn–x¹çÓ#<=’Dâlº7<^‚«¶&HEŒþyG‚ÁØK¯„›ž¯Š^V€éþìyÚ[Íáï)IEND®B`‚ IHDR&–ÝE³(¡PLTE•¦¡þþþùùüýýýìë÷âáïøøøõõûúúûÐÍï²­àññúÝÜñËÈë×Ôð¿½Û–чÐŽ‡Ò‹ƒÖ‘‹ÑúúúúûûüüüwoÈ‚zΛ—ÉçççcXÌ^RÏæäô¡œÓwÇŠƒËÊÉÔ•Êž˜ÖÛÚèoeÏXKÍŒº¤ Ëààæõõõö÷÷E7ÅŸœ¿ääå'´êëë{rÕkaѵ³Ð¼¸ÞmdÄÍÌÚ¶²ßÅÄп9*ÄM?ÆíííÃÀãðòñðððÒÒݬªÃÇÅæ¯ªÜ¹´ç­ªÑ5'¶²°Å¨¤Óóóó××Þ‰¹½½Ê¸·Ç¦¢ÏâããïïôÔÒêtjÐéééh^Å„»××ת¥ÝÜÝÝ\QÃREÊáââÚÚÚ+Á“»rj¸ÇÈÈ{tÆÐÐÖÐÑÑßààÔÕÕ™’ÜÁÂÂÒÒÒÊÊÊÌÌÍØÙÙTJ´¿¿¿ÄÅÅçêênh®kf¥ÏÏÏvp²E9²ÀÄÄjc´aY°ŠŠ‹Ÿ§«¼½½îõóº©.’t9”y—ȹãðì|·¦2r¡Ê¾aª”œ½³«ÏÄÔàÝb£±ÔÉE1Ú/tRNS@æØfÞIDATxÚí›_ÓØšÇ©ÁxaF¡`_S´- ”Ó0H-z$PÈŽikÚD 6¹‚î,ŽÎîÝ;û:÷ÞÝ¿zŸç¤"Åqgï0®Ï÷Ǧç<ç9'çùåÉÉKûú‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ø4Bï66½«N½·Ý£EoWÝò÷«Ï1ÿC!þ¯9™ôP—óB•ʇ29Ç>ÔÛÕy29Ïšdr œ„!ô>§äÓÅ'ÿûúNÛ…zÒw鋪?(?c¦£Ëž¸/гA¸(οœOvtᨈ_¿~-.{ê¾$>c™N~5.;Ò$“ÏË4Éä³à²M2ùL¸ìP“L> .;Ô$“Ï‚ËõG¥@*ù-ðó"r‰2é» ŠøÕ8=ëÿ›`}jÔ?ÑSï—=qÄÙÐ\XyÖàLQOƒÐ…-8þNù‚¡ØAAA ®œþÂõ_ø^‚^C³O½RýÝÀ9¡þÁ¯.nÆ}}ýú žã.ì,ÔãØéõjÙp{ìÖIK¢7W†¾>õíÚpxdôæÕH$»H±øÈh")ð±{ŸþÔ™7ß± :0v•C ôhÄݺΌ$F³ì¯9~ ‰COÒ‰ôíÏßHgžF"`Ÿì•ôzf4¿Ë‹ß&†ïêÚô8¸É…%q 4«¡•JJùI-1‹„±¹‘D:\žBLšEЭªÓ¦¢qháká›7W%0~œI̦ïK¼¾Ò ÏNäJºº½*I¥âl:1Ç¡3ýsv¾¤š‚¼5‘H¤Gd(V†gkÌ@_iH¢¨cZ¼ì`üfáf w2„@—ð´­4¿©¥kY'ùlgYQ+“ÉB19QÐu3>1´<ÕuÐS,ÄÎä’›©–cí.ìe§µ±LñùzuE×-ŠeQ<±7š©í塱;ziz}¡2­wRååâÎX ¶îO+í¼©[B!™ZÑEk¡6´¼Ú|¨‹"D8òû¥ˆTRÙ0 Ùt–ÅiÑLƒï¡Ä̰®[ ‰ÕåâTª «ëÏâCÅÍ™iÕÖKÕxe¹² &"¦‰PÌÍ«‚áfñ¡ÂãÔ¨.ªë©õb[>m`žACJ'=¸6ÞØx°¸åÚ²¢ó1”IªÕjU¼á5ËTÜx£R©&­,¦ãñtÑó^,ÜùöâƒJe.Ñ0Í¡™UYSÕì³\%°·š‰’&ÿ¡ª¨j=¯rg)§¨š1ÑPÕËþŸ7d+×4M¸Ó£…G%ÍžVU ' 6x]¬èmKöšÃpÞÈ.à´¸±t,<€Î¬TXrkÁ8˜’­ðMÍÜnÜ… 幊ÃrÈD‘]/Ù€PæfîªVsEÔKöDXÖª¢(š.EH&=¸5“ Ï.¶ê¾%«"MÊä}Åpêä¡+ ^s,®%žì¹Öú³0nAO%)"6 Ùl§Ýî¼Ìo²“žÚÚlÃ5œôD¦('öæªbº·†,´ó²íî>ÛMÓ¸òAÞpÝWy×ö&WÅ yAèäeÅ´Â#² €N¤ìÌßk¦ìg¾û‡™aÉ*4}ºd‚±5;"ËGy„f 7d÷ö¡á:»Í§n½6¢¸á0˜0 Mò1Žc2i§²`šÞÒ}¡óLÙwŒMdUÉýò ýÉ•G3ÉñÍ×ßWÚu×Ôaš@&¦[÷ŽÆ-×íŒÅËåõ\òq½^^[]…Í{¨'ªá´ŽÚ/ó`è…åryû^®î;˹ùªí®®•Ëý~sÕ°;èo?ïZΫµ7®aX#‡–åîæ-Ç™w¬vê6œWܹ5×>È˲ÝId\WFÍœ*Ø®í'ïæŠa¸«ß[pòªtµ]Ë W]ìÁ©¿YÚöÛéQÙgç)8S¡H'6ʤn8ìÌ{ÉG)lÙ°m×0I&=靿tÅÝ=Ìì·}Y•¢(Áõ: Dz¼‘jÁ÷*é¹v§²´m9í\í¨SwMÒŠáA6±,«^nn9õÝd»s”õ·×§xlß~Õ| ž’‡>¬cPûÕVÁr¶&}ß‘÷ýú˼ï@OY×*Nàb´d¤ÃŽå ´ÜdnÃu­Jºj¹íæ*­83î¸Nn1ìûoöžûòÒ¸=Ô;/—rÞA:ãZå™2XnålÃTQ&!Ö&n½¼4g»Ë;‡žÕ®¦7\g«‘têIP¬åBÚ!™œOìúÌÕ’`l~ÿê n+b$ÄdR÷ÚL&~±Ñ ×ÞþPÞ?:˜j¤7_7âûNO¥” œsê/òC§ÝªÖ2o«ãûûç7«ºß™jìö/á÷ÁŸï;»yÇ 6Z;™xãÐóP!Lœ7ó­Í©VuË÷_¡ÑÁ^Øw˜L$9üMüwjó[®µß܆JXaìíÔ&–jž÷r¡ÚÚL7Þf½ÎøaÝ d²v­N¼‘˜JÏoºLB(Ó°¼½jx'>ŸƒnË©øN¸ÚÊúì«Ã:#™œOl )i‚ÓÞúdâÂ"–Ós˦¡ØÚq!üþãVµÚú§Ý݃£bæmë‡Ú‹Ýý¶c¨¢ø<§Êœb`âá4`9oÒóó?Œïîîε&Zp’òÀ~žÙ¿ÊT|ß›Û-Å-H'õrëIk³¼Ùéx»¯A<¯A‘õb|¾… ý(óÛ¹2Ë&%IåÇñj¼U«@’io‚/Žÿù'¯ïå¶Q&ëßÍW÷*Ngn zÝ/W†nÂo'æÃÙc™ô©5M‘m{93oå ßÛnM̧‹Ðhn ÆFÙä"¢¢&X,2:¾×:1IWe×µmÛ0lPŠóÇ­£ýý}8×Ô³[¯`+È&¡(Þ»ÂY…Ãá‹Eà¨S0ø*ÞLP SøxÔ[OH^Ý2 ëD"¼®) ’’®ëZ 2«öƒ@á¡ç°÷-[ð2Ô4…à.a1Êì–ñZT`ÿ-XLh·2Dè „ùŠ%$TáµsìöбÝñP‹Ývª\fÊÅðãn2«Ý¦V Û`œ`í4‘î›ô"cwÂM NŽ‹â ¾®—4  Ø8“Î?›_¼rŒ œÄ„QÂÇ1z`T£XÒYàºÖ Tw Þö2±Ò5NªVÈ à+¸,áÑh,8],#±Ø[Pb³Ó¢ËÚa¥Ê2œÂüÉÁÝ—X_쌳„Õæq7fpÑ 6Ðo¯\v8~³p˜=½T*á]x>Æ…`:yØB$Qu|œ' `þMØbÓÎq±>/„0F£ÌUóØP +0!3éþ§*sd£.L>XÆT –ø<2†O1Á™8Š .èy€BHr˜„wuÄKÌzÓƒ§U\wœ nEy§6ì5‚y+Fçœ^„bìé(#‚OSA'Q>‚ÑF­èÁ‹IÌ/Á³‹²Çÿ@”¹ªKA» } ÃÝÕ?1̪Ʋ«Ã 'Œ3‡vQ|J 2×±ý±„™¶220g¨Af;éF:y÷™^¨;Nu]u{d^éM‚‹±w3bÁ ì×–)8+ŒbüðM” lbẠ٠e¡P`Ù­~'ˆà? èbÿü§ÿå_%1øÎLÅãº.‘÷ìOÔ5˜>PpXÇ: †…‚,áIæ¸.Ê꺠¿û÷ÿ€nÙžÆNljtGxåèŤ ùð×—ÜéŸfr5"”K §^W;óÏnõq¤ØG$xáøÓÀv×\à´[u wÚþ½÷É~úé§?ÿù/Åœ†o°1i2–W0œuÖõǺí;oœx‚åº[½¼ö‹9 ÙG~ÆÝëgàØþŒÂŒöÿõßcÌyöªeèÜNÞSÉ;D?:þRÀÄBç ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ >?þö?,¹$© IEND®B`‚ IHDR&–ÝE³(’PLTE•¦¡õõûæäô×ÔðÔÒêññúýýýþþþ¹´çìë÷Ž‡Ò¶²ßÃÀãüüü{rÕ‡Є»ÝÜñøøøúúúúûûkaÑààæREÊ™’ÜtjÐŒºwÇ¿½ÛÐÍïwoÈ•ÊâáïcXÌÛÚèùùü^RÏ‹ƒÖö÷÷9*Äõõõ¾{tÆ­ªÑµ³Ð\QÃoeÏÍÌÚ¼¸Þ“»E7ÅóóóðòñêëëÜÝÝçççÊÉÔ+Áððð××ÞÐÐÖßààääåúúûh^ÅíííÒÒÝ–ÑÎÌ銃˪¥Ýéé鞘֦¢Ï¯ªÜ‘‹Ñ‚zÎXKÍÇÅæ²­àáâ⡜ÓM?Æ¿ËÈëâã㨤Ó5'¶ÅÄÐÚÚÚ¤ ËTJ´Ÿœ¿××רÙÙÏÏϬªÃªªªŸ§«ÒÒÒÔÕÕrj¸E9²›—ÉÐÑÑmdÄŠŠ‹½½Ê¸·Ç‰¹ÊÊÊÌÌÍ···ÀÄIJ°ÅÇÈȬ­¬´µµ¼½½²²²'´¿¿¿ÁÂÂÄÅÅñ÷õ…¾­.’t<—{Ç»¡Ê¾aª”—ȹ±ÔÉØéä ¡LtRNS@æØfíIDATxÚíš[ÛH’‡=ØÄ`LlxÈ} IJ¤Ø - ‚„I„<‚ˆ‰dö¬ ž…Á™än.»s;{7»÷_U·!d ¹Ýgawê}ò¥»ººÕõSuë#‘ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ˆJ¾xï}ýý×®]O¦R©7B³Tò“vï3pVÁôOx麞É$?jucèÄéÝàpÙiéâ]Kâ|û©wqJg³#7sùB!ù± ôf³Ã#·r`˜¼¸Pèé½HaÁMáf5p^£¾±ñìDqøö'úšœJ¤¸ J%8H¾gúe6;=2rçlïZçò/噄)Ó›%a|bbâŽ(ær…äGZ I#BZ–Å\!sá VR™BìS§ ú&úòù¹:¹ž.ß+Uæ ¯üù} Üy2µ¸˜ÌüBx}÷î)pZl¸É3Z& …ÌgÈýWÈM©ªær¨ 6MÂbNTÕš¦÷5ˆgßää-~e^ïŸì¿~r‘ Qž­7µ¥Æ² Á»Ñ?©çðš¼1ÙÿEâ´}ß7úûoÀ‘|K1k91'› Ë7dë¤`IUæo-/Üú :èKôñ–||CÒl^”Õ;+³ U¾e/-¥p ™ì—m ƒñ¤…ÉcQ—î?!_hZ¦ÏÛ–Yó’Ê(¢Úh4TkyaIf§‘–}¼e!y&sq¹ÿ Y­?Õ“ËLXUÛ¶>Z+å Ö£rù‘»:0^Ùuf·…œÜ0Çц‡VÆr{}¥\¼1ÇÊS3§íW'7FGÇjùüÍ %Ý/«êäLyåñÃR.3 jcXUUÙz²R~„ ›Îh™Ëó¸%¿ZÏC€mí–¦Ùµ‰ÍáBF|:^žzúl¬7±r¹d€õ€ð°Xžz ‹âà`.'jƒãåé'†•Ì+ª­9š»ÃÂaåûgÊåU87h™E–/;W˜êÚðpöªX€éL ªmXÖZÝüRam­<¹z±9±˜® Q`ygQNºnš¾âm_“Åt}}`Xê“ÅþæÚzŒšéž½0_XkÈrZ™¹fÛ·¤Ñ5a^8.Ð º•ÖÊè@TæÓé&å Â×›ЭC² Íöêc_‹â×õôÀºTÆ%O™Ÿg£p4 ÕWŸ}åÙÚL´8ÖLŒIó½U1•É)¶cùÖ“æ*8 ÎoHåÅ5f0 ¨hT0¤tr_KöÓúÃÐr>‰2©ïììÌêÛÊsËnl aå-˜Äê®a[«°ÊȘwë+•o¤a(%×iÜ©/XŽYn4$ÇÐ!;T·,Û ‚©ÙñFÃöÓpŒ©ùÀ1ÁƒSÑ ÇR GÛª††£×jªòÈÒüé­FMa+òÔËË ÍòMP¤åxó–­ªÕUK3êÀ¹’u#ª‚õ ²eš­úCG{4S«Ý‘[ޮՏ”‰f™úýúœiø«Up^wm‡·ôà2±k²H29—lù颴¥›¾Ó!é&…™½ß¾¸mÔMGÓF½ÝÝ­õéÃYh®nìî®Öï; 'ÐÉ¢4¶Zú×ûí8TžŽ3V_ˬd8KÒæ\´š«»={/ QØÈŠcø¦4ç€ÁŒ –£–¯+¾e¬dm°º-¡ÑSXbŠ3°Æ@„“·«L ÿß^¾|¹oYÞ*4]¨/ÄœrF¨<µmMu´gõ%ÐôØ7²YÛ›ö1ö:K“yØ€0™O*:t¾$-ض49ÄÎŽjö3OsÇ®‰ùä_?Ÿÿœ|!•§Æ¥J¾-çS “AÍÂp«jBšÊpw¼9>eºÏšY`³rõ$ç2‹Õ¥……v§Ói+‘oùÙj-+¦ëßÿvÎ0ßÙ{ÛŽc­y C±\3P–àÈÙö|h§¸¦)(„5Ms WaFšcŒ@î°Õ\áVýKH&î‹ßý®úÄ·¼m|W!ªŽQKñXÖßš­úfVwusô“-¢?ÂÃ=–IqØQÕgØ ÌÙ,cÖÃ% åO29‡§Òþ½‰bý ëF ¦)# :fÇ[UÝtÍÊøÞÞÆîþ^Ögg÷¶w÷ïGº¥Aô=Û :­ÈD‡õ -ìímo¼Ø#}iïÛŠëß®ïíqûÀ[ó}sÛC3ÅÔƒ°y`ú¾¿ê麩+zÄJ ›•1È+þó&èL± ÃlA;¹¼·n;°ä¸¼9ßG_à[[w¥.•箩ë銉=a»ºÅMËJO£?ÀrXöKÁÞd2³Ò²tiÑô›÷ 0Ye-]Õ¯æh{ãiÙvÃêwGȲaÕ™fÜ™¦©?š^Âîw‡xYš3õðÕwvh Ø¡z¶µº(“@׃Yïû ê¼Øí´Û]}°©ë¤9ÛÇÕ 0تF`ªˆâÊø²i.LW£(ˆ”( !Ø“iÆ›4‚Ž£b´cÀ²“[æPa %oÉ5½m¨|P‡”aHÅ(Š”Í8¿²Q° Û­êz7]÷µtúyþÚõ ¶v¡L 3˜­¸®¾'=ÐõJ6pÍîô£@ߨbhG29›ëÒ5Õ1Û#Þ›nìB–H±lÂdApŸWK¯^—ª¥£V»8ýúðß¿ýæ¨Û,[æ2é´:q¬è`wÿãðEeê¨õý½ƒÒįXéÙ·ª[A‹¨"P‚ w¥ÒÁa©Zã0VB.è)ýÃÁ o¥FñÝ»  ö ¢Vùjãðà0í­ƒBÐWŒ{¯îîÜEÞþá¥Ûa›àd²‡w!ß”_¼Ê®˜Ç2ÉÃŽ¯›ßLìMoÂ`v½ÝƒÃ™êóZA “LÎgІÞ>htcÓQsÉLeÑq£0Ú€EBôý·’ôväÍ›£ÖóJÝ{ëýG‘{†ÅŠméè hÂö"Ð_îxÍoÁpö­WOCüîÛw!ö  ei&ƒ‰ºWõJ^»·› ¨¸ )$ZÜ©BÃdÃÊ67!›à~A¿L×%AÚY‡Å%B_ Ÿ©º·3¾YJé­'í¼_»^¶;ÞnnnB7 ؼ4].“D¡ [XºI¨C7Q”®C˹0ıe“ð›Éäè‡7(Øœd4[³`×Ä&.úaw¿ôû? LÚÝ×ûÛ¿s,Õ€°•ˆ-Ë…°´6öçаûfîâöÑëÒÚwlcÜ[pÁ-È<‘>_ßkµP&o @ae¢wÖ÷Ú(“7hÞŽqÑa2Qhkk6P&Ýeb†‡ësVeÒú±tïÇ.¬mín½vcXübÌoí¹ýnðN&V n˜|?|¼uØf2‰oïïÅ “v÷X&—Ž+KAlÀ–nYâÈÕjb&“ƒÛO÷˜°‘¥˜­£ÎѨ$ âîQ÷èxÑIÈ r8Þ7À}Œ {Àv·ÕEÃh9 }Ä1´CûN.ÿW؇‚lu„4Žc¹` ü,·0x(ƒTÆ>Üꈢ(7œ0Ž`Å™`*à!1ȤÝùñ¸“†xG¸ að¶–ýdÑIàC:ؾZA f¬›h¹e‡ÐH2AëÏ&2p8SfÝLfYx'‰wš •(†-D®P8jõ¶°9ö4ÃÂ' ¶í0à ä†ЧÔöqˆ÷L. ï2ðLJôB£ÿø¡å ¤\öÔæÄÜ›½Z=fÃîÀ¤)nw`#ÝÁåÕØ™‰ÉK¸L©œ˜'eô:Ò™˜@Xxèúxö9zûw6)|î`øc&“Ç«Ncч¿d ¼ly<ñ(ÔýÜPNŽf«@ºú±¡JÁû´t—«îÍq ¼ò±Ê±XBQöš1àT‚oòrrÂI¸&†øÐBӆł݃>X. x;æ ºìÉ­ËŸ¾àcXQmhxN úÁdrå=ºV€³óô1ÁÙ¤0{Ø‹®Í™$D_p°ð7Pg¸zÀWvêpyöäÔÀçé¸*¨ÜtÔ3´,–<0­`IOu=6¾¢qÙ¥U¬Vc…–ëâ“ØÙ |‹*Ép%'LÞæboLÛˆH ²*Õi¨[ üù,%Áp!þüÄxSŸ© ä zå³möN‡dr6I|IzÀãc(Љ(‹Y†™eKŠÁç/RÜ0’IÐ ¾UÍ9fXãÕ<è <Ì0X€MÕÓÈøb…ª6`6>7E½ÂTp ÃÈgð9{ïÝŸá„qª½Þ «·,âªY£ÁÛ©µžQËŸ?òO¥RI>N™uÎ<5z=r§ììI&gÉf¯›'Ð ~|ÁÂ`ª`)ãVãGlÚA'ì[0à«ø^µÌóP­Vc-íš|,»X˜5f,rQÊâIO5•Ûã(ðÃF¾^p{î«7,ž5pícÒ8éGf ïùc¯*ñë<~b'g„æ§Î YøÌ/6E`¸ ùƒ}A†™B¿þʰBœVL"Ÿav”a³ÎÌP&°¡áqu/±_^;Ö]Öj=¯'÷tbÏ>ÅžXl™~° †uì¡ÆrKÜWOÝïùcãM¤~9ÎÓì«$’Éù¤Øw£œTÞ+Ë`Hð“G N1ÿÎç´YÏ2“áÕÇ‘â°EÇ}õ~2Ü)÷ÚƒæxÀzöÇîS&ïŒKdI ¿nOÚ¸,äN7ñÞ8{Ýôzdä=]v8®(©OòÊI)d’çòêãHñ`bÁùNQ•9×?sý~/aÉAf‚û°Ýi‰_8ãÅ ð²ãqE¹€L®4rþ=ä'¸à™^v<®(—æ¿§W§„ÿB¾.;W–Ëò߉ žéeGãÊòÁD]pÚÿŸáºÈ•ÿ7êê½n$“¿Žæé¢Óù™‘ú¯?þô§ÿæ·Ÿ#ìéÝíÐç „wËÎôÓ­/;Wš§©wô©é<Ýà“üñ'àNÏ]X#ŒŸþùÏþËÿò{èÏ’ ë6q‘q^vþÑy7‹Ÿ˜Ð¦ý#ögV}Ä£ýÓÏ9··3›Aá{*ùà„¤_ ” ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚øÇäÿ—˜.8RÅOIEND®B`‚ IHDR&–ÝE³(VPLTE•¦¡þþþññú×ÔðÇÅæÃÀãïïôüüüýýýž˜ÖæäôcXÌ™’ܪ¥Ýìë÷úûû‹ƒÖ¹´ç^RÏM?ÆÐÍïøøøúúú+Á5'¶ÎÌéö÷÷¿ÝÜñREÊE7Å‚zÎŒº–ÑXK͕ʲ­àéééääåâããðððóóóõõõêëëçç率Ò9*ÄðòñŠƒËííí¿½Û¼¸ÞÔÒê\QÃwǾÛÚèmdͲßoeÏâá﨤ӇÐÍÌÚ¡œÓ{rÕ{tƦ¢ÏtjЯªÜßààáâ⤠ËkaÑh^ÅwoÈ‘‹Ñ›—É­ªÑ'´ÜÝÝÊÉÔ××רÙÙÒÒÝÔÕÕÚÚÚÌÌÍÇÈÈÄÅÅÏÏÏÒÒÒ„»××ÞÐÑÑÅÄЬªÃµ³ÐÊÊʽ½ÊÐÐÖ¸·Ç¼½½rj¸E9²ÁÂÂTJ´Ÿœ¿ùùü···ººº²°Å¿¿¿ÀÄÄ[S‚²tRNS@æØf ‹IDATxÚí›íWÛH²Æ¥ÖöØ{mg¢[BF!à‚C^hHÅŠd‚r ÙÌÎäÞÝ™ýÿ¿lUË@€a÷œ{àî}~Ѫ®nu=ªjÉŽ¢ð‰zò¯c.îtI»‹†7ü±—KõåäfN÷_º„ÿ·Ð*}µ|êå ^ÒîT/唽z ¨—K=v~†é….Ôo¦¾áÔêý;2¹ôÓá^Tõrc©ßrÎÉ?œø–Së§žÍéÅüæü©¿Îut Žº*ÊÙ:9ç?vwŽ— uN¡Þ8±J7'&&&ÿ”Ëçó.ü 6Ëçr™}KᬆïŠß]0NJåï+•‹û®|ìô›a²éN~ö|¿ô¼êX\cÔ©[_G¥Z«V«®×•‹b¢L4«ÕÚí4­Þø„2­ª'õÇ 3­™ÅïÜN7[úìbsŽÇºÀlrþÈùœ°¼Y­NW«çL÷KOèä<ÔÍj¾ÒÈTA¶î¦e·; ã¯LÖ×ZôºÝ¶V¯\Z( ÄÌÝÐq;õ§îuoÉôóž^èv.ë^+sžËw»ùܩܓóÅ´ün»£5rgôÌ5² \u4®-j¹ÚœÑ:\&“e­cûþýÂòʽF.W*K¹æ7W‹«÷塼[õN×ê9Ž?÷àa‰îòµõâ†ÜZqõQžìïÙ—­­¯¯ÑÑ£’Ršét:N©¸>9³Ñ¨ÌȆSßX/–¤ƒR¾”õÌâ¼Þ·i(ßxlùv{ó‡¥'äûù~49Iš(åËÅâF¥Q©,·¾ï¯ô¿£ ¡õzýÏOŠëGúWÕŠB—åøöòÓ•'3ò2nе•éˆzÖëãTuÕѸ®¨jíÙó>é¢Û‘:!™´}×4·¼ùò£Ž¶2¿¹Y|ªÑ"Nz‹w§<™¶sòÔlg®)kz¾ðCG+yswŸ´M›in—^P”îyS™½6ÿdçîvsYÓ,*S÷mÿQm}k{~w¾£Ýäß™ö}ßÞÕ··Šì@›~r‡z:ãq£I*±Ã4MÃñç½Ò$)@Ÿº[ª_vØøùÝÍù]:º¥ësÕÒÒ—$»MoikNç©ËJ¥4Û1-óUsn/›Ö÷­âÝmip«Õiw»2Ï\u8®+ê„gÿÐ|@1°;’Éô?þX7z¯Mß.´ÇªZ{¯ìûÆšçÛ¤'ºA—›++5o{0ˆ”9˱ï7ߎ9»ëÛ·<ªívÇ+;cûVËô©ç¶í»ŠeîóõÀq‚V,%p Kq §  ÇžïRS–ß-lªg¸ÉZ£ÃBX¦Q[7üvÛ+¾ñ¦¹dÛ]¥OÎ…NÖk½ KÄÓ giªÛ½ï­¹Ž+¶º™5WWE„¯›Ë–ã–° + ‡Õ’eÖÊT|¶t×%ÛÙYš¢BÁF-àDë›I8Ûwþ;érlšîX&ÉêªÅ}k$¦ÉÖ0Ë5‹zšTŽØ29µT4Ãt¿ùÓ0ML[£ªÓZ3Ä 7õ„rô‹Õ8 ?¦ƒ×ÓƒAL‡iÝwË5ÅLF$“^H̵ØðãÇt%ñ^SˆÇÓƒ8³è¤…gz†¢'”h਀°’„$“(QÚ‹”ðEŸëÊž Ñ (Þ««I$Èúóߥ–àµ÷Ò-ù{oj©­&I¢ì…a”<ßIx„(VôÍA´:kY%]Ö).T䤢¨õžO2™#=YÖ›éÇBx[¦ˆw/Bñ¬Æ–†¢Ô¯:×Õ›h;"~¸r¨ ,¿Ó`™¸"NÓM= Ãä“÷)ŠÖ†£tça¥«úð MZø[5ߊ说GñObïe4x¿ó×áÁûɇé(‰ŽíGtƒ'”¢( {!…rÑû†{·õÑ#ÙLå“·'Â÷úb”$¤»dðt5J„BéD›ÑW(¨bOï“Úôgt2Ùi½aú)9Pô{ƒôUóà Ú$‡é^ˆ©¯±·.¤°"¬ñ…’LÜ xKxóp‡†YÔ_‹°ì}ˆ’m–°¢øWŒëË-¯ÝUÂôÓôÇa,”v=Ë&/zBËœ,6ù¥¹ûëþpô±uûómý§ýÃQdù ËÄLhg%=Á†ÏôÛŸÜùyÿp¯ù¹¹Já;¶ê›Q”É$é% Éb¶ùù—Ö’®(¤AÅ$“dPö~ùÜœM•HéEÔöô)©ÊtºŠÖy3Û¼½rÛ»CTØW”¤/È÷úó§Š’*KäÌûïQL# b’Éæ€dBZúXãñ÷ÄÑ•6z´â}|=*Q$§á=‹ Í2—¸«Çuå MqÃôðoû$£KÅÙ¥}•‡è@" ãý……¿ÿº¿xî-lÿü–ŽH&íz×òis’Іã€6–Ãí…ß~'Ãᯯö(hñhÿ§…í¿¿å†Ç}H‘Hö©>Eaüñճ÷$²ô¬ý„ ÇðÕ«O#zrüÊæ)ïªi¿ im+-ö†šN´Ÿ²LDü¡ðÛpxHzÃß_Þù}¨¤4 •Åt?N"Jx”µ~{µ½?ÁøJ+¢K;aËJ÷ hÒÉÇW û1e¤Ñ>ÍB°LrWkŠªh6eª2q8]ºêô\p§m)EÄ£ÑðŠK”PJ’^.:ü.ƒÎ›†Ü´W¤cÃ¥Œˆv&ñÁíG”qBŠ9ÃvôAé*¡’ …\$|&áýg”Á›²,~¨Ò´Žmº(g‘L¸r…ì¶%ÂГÃ{ZA³3 òF˶ºàL*çbª¡¼”Çߥga??’LjBMë/è‘ȰµzVÝ Çß¶mßaà ŒŽ ßͳ˜í©%°è‘W>v°¡Ë$g|KÓ)3à3ï'yßA° øÄå‡Y©ë›¬l O“z‹†£Ç:oY%+1Ò—Å?nÊž—òòÂ|~𥙲ÈÂñ<3§–4ÓÎ9¨¾É¾zrÌ5´¶ísðm~çDç¬ÂA½\ÚYD¤šS©ð tI‡àì„BŸšœ4ø¶ŽdWÓeÑã;dkq¨Ÿrä9×áøÉn5’þøÕ,E®QaáŽCËQ7ø­ g0ÁelHbÉ= <>Ç"'¥³Êw<]•d"/Œ»òƒ“TKSrGªo ¼^;U®ž\>›×)—Ï5¨…vœíÛí6§ ‹Û•ëOëj¹T›¹\¥Nç;t³×ëÒ°KIÈ<2ä0qœ,N#YÊéÙ™r˜-Î N&Hš'%~ÓAý¤JÉ%»¯är¹ìe=×Aëòh”ËL‹EÈÕ†ôãøÙ¹±Ä¥?öÆêWå•ò<Û]ß§qØ“?1sÚ©ãeý¹ä)Ü$büå—ÔI=#Ó ­7¿Ë”šñå[MZö<é¤Î=ˆÆ CÄ,!q 8't´LwGt¤RÈX~eۑȳ"gÃ_$Õù‹Æ¼Ì\ÒÞæsÚW£qe´d>p¾ôëdŒý±ú¹˜äÇóÔX(<=©myØe¯|õWk Ç»Q‘ðwð*7ð·ðŒl߃2oÈCù]rÖ±Â?óÉS‡GJ~f ÔµÁÔÇÒ´Û{=æh¤cû\öm^&ÎÒž§{ä¡›íŒ8d¾x€Óþä|å…˜ç×õúÑ`àLä/rƨÇ-ò»wÙ&³†¼¯sr‰ëÇwzôÌ’³J]û©ìn`Ñe¾Æ¹ÌiæuLÖXÏ6¶?þã8dÁÌ˦•åN2Úq¿c—•ú‰ù~=Ïñ0ã+ÙÏ¢®:ÿ§Qåºó*ªùñáE†¹cÍ©G gýˆÌÓÉSg6žôýÕÈZ¤tY@gÄùœñ¿º /‡à?Y#Q/À‚Ÿ°ÿûüa‚%]æWîúIEND®B`‚ IHDR&–ÝE³(qPLTE•¦¡ññúÝÜñÐÍïÎÌ鯪Üìë÷wÇæäô­ªÑ¹´çüüüž˜ÖÇÅætjÐ^RÏoeÏkaÑÔÒêøøøËÈëM?ÆTJ´9*ÄREÊ„»¨¤Óö÷÷cXÌÛÚèh^ÅÍÌÚÌÌÍÊÉÔêëëõõõE7ÅÐÐÖÅÄÐ{rÕXKÍóóóððð××ÞÜÝÝ¡œÓààæççç¶²ß+ÁâáïwoȪ¥Ý–Ñ¿íííÃÀ㊃˛—Éïïô²­àúûû¤ Ë‚zÎßààääåµ³ÐÒÒÝ‘‹Ñ¼¸Þvp²•Ê×ÔðŒºŽ‡Ò™’Üðòñééé‡п½Û¦¢Ïáâââã㋃Ö\QÃE9²rj¸aY°ØÙÙÚÚÚÀÄĽ½Ê²°Å¬ªÃ¨©©ªªªÊÊÊnh®ÔÕÕ¾××׸·ÇÏÏÏÒÒÒ{tÆmdÄÐÑщ¹Ÿœ¿'´ÇÈȪ³³jc´šš›···žžŸ´µµ“»ÄÅÅçê꟧«úúúýýýbMêwtRNS@æØf ÿIDATxÚíÚ_ÚÖðc;K­Zµˆ P…ð"„`¤J#®ÖD]™JX‰u’ª«c[·Ûõîn÷Öþõ÷yNñ}»o®·¿ïçÓœ<çä„ópòb…€ÿ²žS[·nß¾ýEÏõ•8ìª÷¢‚;¾»×T»ÝÛw¯§¿ÿê ;÷:ž;Œ×ÝËNë¤&\n`°{ëþÐðÈÈῦÒh`xdhìÿº¸Ó‚×\àÖph\ &ÂWl0rÅ·ÃÃÁ‘‘Û·peMðô'OmLEcJ\„¯©–HN¥¦Ó™Lüßî€U¯Ú}'0ÊjS¹P_æw683sþ$“Iéÿ‰î~¦fCùG"~*+TU}Ø78dzLßôô¼Wx«à+<7/¯ }¢¯ûHË÷MϨÖʪ¡ŠÞ‹kܵ}wtt‰ƒïù¦ŸZûJ|¹ø¬¤Ðœ3:Êõ¾^Ÿ§K]§e†º°1·þHnöôù|òróÕMÁ§ ½Y+«j×ḭ̈u}6xöÏ  #á°Ÿ®2Å\%ý NßQVžç«Ž•.,„ý¡Üô¤ö?JÖ|4·*^¼?²uÿi!1‹ ±õ@5ôɹÂH1-dAÞPÕòFº00 øƒë"W aïÂלá¶uG§­HºðDø Urk‘¹MêWp}:WˆPi~{±¶VË™Âf8.z•­ôF׉ªŠné‰Jˆ»õåÈH®–5E<žù½SÕgêvÐú&8£ëJ{ænoo¯˜W4Eí)ÓŒ õÑw*izv Ýɧü³ow뵚+ŠY]}œÕœä\E-ScÚT&­e-/^¤§,sÚ§–•¬Xµl½21Siš³”U‘´lK趘O¼4ØH1CãU¡šéù²w Ñ-Ý©šU‡â"Y=O³–6›Ô-QI:f*ÑG‡y¼¶šÝͯ*†Ø¢›‘Ä@v&ûòi÷ðëUm*˜£âJºœÉl$õ™T Ú ®ÆMÄŸ[ehð«`N3»•'{ûßÅ( L¡(#"—XŒLêöÔãB.—+ˆ˜­¨rø‚›…Ò«^Ké¶½™ ÈJP·5á{H“{W¼Ø A˜Ùt4)˜Á›6„m+¶Ð-GŽ¥GŠ4‹ AšR ÅW¤x9Ä Ù«ï)yKôYà¶…FãjUlEƒ†¡(¾I[y’ÏZ¦ìuôJEˆÍˆEíÚ™á_2…!²Á)Ãf2ªQœTŒ'‚:Wéɧ'#"P¯×ªÊ© <'44>¾¼<çÓÌÞ|¥R_žü¦O3[÷"ݪãŒ'*9©™Õ¾éÐsK?‰¯Šy]·æ]Ÿ,ᘦûƒëèº>!ªU§*LSkš›·éRçü@#hÆq–—Gç!Vò·ø ¯_½ è“ÚÒ{:ÅZ¾e:°°(Ñœ\ÀqæUÓ­‹œk.Wl»²Ìí‘3 ࣶžèµôtC±õ‰€C}£ŽÝô@ü¹Í§c©×ûù½æ¡¦ŸÛiF¦S©—»û»õFêq,ƫ͆ë(çâ´RˆWVê ×M•‚t¥zKyñ51A¹ð\¸šiÊèü>%‡S®«¹´ðšˆlº®¬äM ¢×G©é ]dÚ‹˜ ¦ø£Z¥¶³Ť}ÜÀŠ©¹î›ˆfNÍ•‰[óQŠÜ åèiki!'›§kiþµe9f1bRÍVÏà2Y^N¾ÍÆ{û»¢¾;¶Ø<:|áÓj‡?ŽE›uí‚ÀXâ'ºú<{Ó<ŠíŠüÆ Ÿëʼn ]W¬/A÷¿+|-é*ÝO¬P+!ú±»4¹¸]ᣉoWécöÅœ&L.pÝô$•”òrw(Õ¨? NœëX¦È‰ggŠ£Aºre}/èd}¡)SÛKìßô| ƒòÚ½ÿ—ÝîÒF½‘“+õ7‰í·¯ß ±—ÞÞÙ•ÞuÇÖk5oìJ±íÉŸßìm¿O¼­øÀéxOê~âý΋¹Ó…‡¥ÀÎûí¹ÔùðÌìt`ìû±Àr¬S´Ù~?6ì½îy³½³“(FÏU{¢˜ÐâÙâýôØ÷ÛoùlSsÛïé&MÝ”P{ëÅß~æ¦>l•x°›{¿U~üÀñû¼ÛãZ¯dÝÔO¥½”üàÅw¼¨ï·e–üċݓ„QW÷Šë¥½(¯ÿìõ÷åâÆâî®Lí—*¾Üûýp/Vóê6~)m­ïw%ÁkúG÷B¯KTµÕ­Ê«&¯ìÝô0|‡GG‡]Wºu 4ütS}×<88h6j‡©ƒèÁAô°æÐí=åØºÅwÉT+°Ùºµm¦hû Ú¤ tÑ(£$úÔ’'ç™nëÎ í\÷\Î?ó¤C«É3—D7Y﬿ìÌ„®[£ãh­KV#Ú¼èd³Éö™Ö¢1¿›cºµškZímÅ¢' 9üôAOGÍ#º5¥¯¿ÎéÔ0Ûq:%‰að³©E)ôÈrÄ»yÔ5·Ö¨Õu.¨7èñ‡ò΢;FË[8­;KžGæ$¶oz8E(Jוó}¥}UzP’3;ù£ë¶ê9A^5ÏßDéòqÊ çèVFQKÀ•h”y ôö‹ùR[?±õªÖhP’ÐYÕjFMk?騆b¨™L<žQe ãí®ZŽãM”}Tàò”£Û i/(¶JÏ'®7qFò‚2ÍôR„Ÿc…ºà(®Ú­A¤ ”´G¡Œ§(÷W·Q÷& ³jyõ(¼gaçÜ ŸU¥Û)™P<_jr•êÝô0üÙÑ(+rPZ/,Ãqû8¿ÀæP¶%¤üýó×ZµZïkýñL9ö®Àðn¨ÐÏÝâŸù;]†ß³W¹‚7}É£qóš.ç¢V•éÃõ¨%/ÑùÞädüe?˲ª%³2Ê’«Ühüº?v~æÂ2!(-:ßS8Üú‡yªPl[Îeƒç£þ.ïçÀx¹Xö&"(ž;Œ²—u]2ª*c)˜6d‰7)ÉtmÅwš§ÊNp¹»åç!‡/Dœp­ì– Òz¦5+ž¼®÷·ÏȇÎtŽÈ5ÿ؉øüû¥“ïé¸ýI…‘˜{à ©eüfû²c¹Iû)?q=))¯þá=Lµoš±1ï´NûÝ2£_î=AFóL.CfåçÏ^º5'_…·K͹«¯m¹-s~~>²§™ÈçeÄ]*y,èø9›xqZRI#B߼̅± ŠÌ3dzUˆ>!ô¥(rÇ\½"‹Ž«³©È̳$œ]Q[”üIbÑI«åè]›ŸÇBþì“–ESôžÜ+˜Ð}É,ʃ˳~íùûþ»ØCII7.g¥4â NÆÜîJvÕ -ëEJåd¾nvQÖ¼-¿YÌœëVöQé‹“üúÆÃá@Ê›m†c÷±±‡‰õ†B)¦b´}f$!8å¾þ„"®o‹Åb,4µ««zP­¹ …ă{÷Çnh3mâæ"¶guÆ=÷ ‹™æQ[·K~ÈýÎÍ66:¤ Û#ÖÔ¡®ÝH®3d¿ÜÊùOÞÇc^27Ú5.<y*²j#›m e2æ>µ%¹ ¶êæß‰&ÎÜ‘ÓÉT÷—­:¤‡Èt‡Ú±Gçãæ]‚ß%·†nÜφ:•iý­éæßîù8®ùÏB-¾—LAq‚Úz’ÊõRöÇ–ˆÚ,ûä™´ÞÖО÷0›N¶ò~Iü¬‡QÑCKñ¾Ù Ø]úEž«uÑzť侸${KñàNnZöd"á™s_ý‚ÚÝÛ•ð]d¡¨ v7³­“Ü-‘½ÝéTÒ—.šéq"xG¿š‡Õ¿‘tÙ}ø|d>> ž_æÂ“Êš?uƒq*jˆUÔ€Z¿)¯ô(yýf9§Ö_ÍÞþÝÍ}­^/Ýjîç?ò*E'Ë}.Ëo%ˆ= åú¬äÖÍ;x:ž_]]õÒ‡Þm;2°åÝ#/GÆÀcõ*«U.¸‰¾Í¯ml†ª¢‹=qX½(ÊNÅqäõ¼Í5$^È O!eo]-H¥"ƒ^óv¨”ˆþ[r´J¥â¸åƒÇÙr›m”¶Õ¬Ø \ ;¢¶Ü‚f©×Æf·Dl™¿Gx&“RJÁ“Ó¹VI÷zik;lÇ3 þÛÞ"R(Wœøjm#øµkË›ÁQöŽØzVUY1Û–T%'øÖeA5÷§aA&»e–ü \­ÿãõz!<Õx ìlW}˜î[ýaj,TÜ‘ñ§šjl4ö#·u Ôd²ªãÁtº {øjºãkr”ØXõW5óοëúéR¯ëǦH?©^ª¿V¼>kó÷ ušV¤:)‡ÑyäÈäë§&;ÓUMÈïå²TkÞ¸Šnl?Gv£jîÚ?ˆú9÷ÿêìéžÎÓ±yW?>>ö'ZÂÿâÖ½1mû¶£#]~bß4ê~b¤'¼@½¡‰·÷HÝ_F‚:ß~lFÚjo±½T£ÛÕë¡z‘9òäD’Õ‚ó8©ë+´®ÏoC÷NÛ«®47tG5Üá {³µkšA•¦: ‚IæÇM•sµf¦¼F3Þ’|¨Í†WªlМש:‰ÍSÿmÇ3ª›uæ©rvvv‹ª´XPT×%¦Ÿ¹ÑæéYì°Bƒ*Üfë%¯ÞÍ™)Òls€øŸq܇>üu‹Õ·'=/IEND®B`‚ IHDR&–ÝE³(bPLTE•¦¡ññúÛÚèËÈëÇÅæ¦¢ÏæäôoeϤ Ë¡œÓ¯ªÜúûû²­à‘‹Ñ¼¸ÞcXÌREÊÐÍïøøø9*ÄE9²ÔÒêö÷÷+Á^RÏE7Å‚zÎh^Åž˜Ö×Ôðª¥ÝÜÝÝ××ÞíííóóóõõõM?Æßàà‡ÐðòñääåÚÚÚ¶²ßêëëùùüâããáââXKÍÝÜñðððÃÀãkaѾ›—ÉwoÈ{rÕïïô¹´çâáïìë÷úúú™’ÜéééçççÅÄШ¤ÓŒº„»Ž‡Ò‹ƒÖ¿½ÛŠƒË•Ê–ÑtjÐwÇ5'¶­ªÑ×××TJ´ØÙÙÔÕÕ¿ÌÌÍÐÐÖÊÉÔÇÈÈÀÄĺººÐÑÑÍÌÚrj¸ÒÒÝ\Qý½ÊÊÊʼ½½ÒÒÒÏÏϲ°Å¸·Çµ³Ðvp²mdĉ¹¿¿¿Ÿ§«'´···{tƬ­¬°°°Á´µµÄÅŬªÃüüüþþþA™µûtRNS@æØf 'IDATxÚíÚ‹WÛFà 1“‚©lü¨…lË–ª•ˆxe7M­ðHÀ1;&P§bH¶›ÝînÓfÿÿ½wdÀŽœž=´›ß—sü˜¹3i®GBÿc#}ßFoE"‘‘ëÝâ¸OÞÔØ°‚ñèø5ÍnMÄ&GnßþpÐø—l&îûvëª%¼ßÔtï·øL<ÿ’×4ŠhñøÌÙdò“6•º¶`ˆÑ¹t†²Z.™üà "s¨ü*Oñn î[Bh$Õ”òº>o¨xM³’©Ï—Ó•Já7  °q­}ïÞ_øÃýåî‹ÅorÙÕÈýüƒn}[íçW³9uVˆQ¬wK«™*+FðP7|Z›]ßà²qîû~dñOF—òô@"¿ÙÌ>/&‹2pšÍdW¹âAïn9†ÿ8“ݸ¯¾ŽÄ¢ÑÉ›>ú3±èTéM” øB›»[Lfr¹x&É‹õ¢ö(¿•þòbÕ~ÌGVR¦k¥âßÞ*&séí<-8Éä]-W{Âg‡Em+ŒOÎÕ—ò9m‘ûؤG³>Ý_x²–›«Ï¥¯G³†“"Ãð3¥\>.$SÊoiN2<ñ¤xmðªåZüm!]›¦Äli+_[Xª%x5Ÿ›ËH_éR-6çÕi»ÆY·¦•צJ™žòe‘‰iSk[š ë›…l>WʨóP±PùØ¥ê3uKs"©Ñ àY¥vvvvõµå‡žáÑžeÍÏMpq:f9îdš?…ù”Êf÷µ•½†MSfÕÕ­@¯×y1ÑË.Šé\7¾B3¶c•WùÇÌ ÀËCt>°ægxƒ†ÎUÎÊ*ÅÒM«:­ËY¬l9ÞÜ„žÏ"%~q,×49%«´ä:…Bºæ:V$E¾_¡²^µšé ÞÌÓœ®·Rá^Œ¦ó^à6ó½Óo™ôL›Ôo*ÍgžèFÐLq²|7=¿oõøâ×ZM×½‹<É}×&ÒLªVãT«Õ¶ãñ Y^_©Õ6i1 CMŸ6‘‹}×’OÏ­€¦RX+§‚ªIßÏJáòz-Œ¯RÍ '?£®xQ ÔtÕ1Œš4­R k„çZñm"Ãyž"Ç ¸(³EÝ ¥Õ¨Ž9y×ùý[®ÇÓZͪŠx%¤2/"“i<üqµEÏ^Ò+ΕFü{Ήo˼·ó²vB´«Q_é+çûa‰O56/.vOøl:+ù1Yª›¤6mÛñc>/ý-|æRz¸×YI ˆV9r"ûNqGÛäóÔ“8oy«ôÌÔwµ–0hZSW$çOOúË1õ¶WÞÙßßyòš—“— ;û;¥¿ö…uäEýcé;ûÿÈþtxº»s¼Ã34<^9ûçÎñþÂFa3¦íïÔ[ƒáÅH]»s|'ýèನ•Ý9¾ýQ}ÞàjÛgÍ^•8&=ð<öåÌãeTgu†–ëÜôüŒ„KÃé¿.§SîEøôÐWYòFè*a*úa­;R'”×a>´~­­ªÁœ¾ÙÜzs*e¯åëÏínÛÆ/cÛ+'Í«] ³Ì;Õ~ w¶u¾½þ¢sÙ®Ó v»o¡÷\÷âš®Ó"ùÇ1ÍV‹NO{·¦g…Ï<å*¢Ùjóqu³{.霆ñÍþ™|[ÜlE³ÓsÒ©÷rÁnØý±z³qùùð¨'ޝ.Ú¡+…~Ù—Ýißô‘ÿ#±ä|OæÕ=AT«UÇ©A`™ö^§Ý–Y ?u®æ§jŽáû¾áH Gn ©k›¯(%¾Iºçz¼¹íÀ€®.–¹Êòx9²¼ÞyßypèÐÑr ®q» ´« ¾úU…ÜßvÄEi÷ZGZ’\ÿ™sø°öÞúdø$ÓÏw¤r—Ì3o›n8·{ ór’ù~Õ/²7àTáþZä©» [âùEMsÁpõ´Ä–Œ ê¨š€“Òòdšy‰’x£÷‰×彺©ÆÉ[«ªk"Ý>º¸UêVq¤#IÎIôç^ØP­†#Ùf…Éæ¹Übðï@ЇgY&åò1l"©k%“ÅBAê,žsþ±Éñu=™ŒîƒMõÜ>!OÔ%¤Z†äÝ’ø0ý _ •ƑÍrFÊËņñÜåÕßé|§§Wª •nûPƒ³óro û!Y½wï2ÎBeø× þ(xdßÛ;uEy˜)Ï2%gÂï ”j™‚p}y.ñ>“Åä-\>B/„uÅ¢*4Ôäx…êßF±¢¦VMpQþ “”%ìÀï¶KCÒßàCød²PQ›ñUn_nñÓþGÄgé¶2¼.‘”ŸÏf"‘P‡ò½TUs É´Ë|\¦_bH§…n¯Ö&º…¼„ û%’~E‚‡«âÕ°Ô"¤–?¬ëö%«\B-‡ºñîq®ZÂop1•áÁÿPà»ÕR0´Ámž,N‡Äíw ½ÖuRÅ÷ó$'a*ÊifHnIC3 ÜL؉¸æÿÅÁÇy{5qo¯‰¼¶ §Ókú;PDo%ä,˜xOgŸ´ øv›óå?7=€ÏÞû…9Eÿ@æIEND®B`‚ IHDR&–ÝE³(;PLTE•¦¡ññú×ÔðÃÀãìë÷™’Üæäô^RÏâáï–Ѩ¤Ó‡ж²ßXKÍE7ÅÎÌé+Á¿M?Æ9*Ä‚zÎcXÌ‘‹ÑÔÒêËÈë¹´çðððíííêëëðòñREÊóóóö÷÷އÒÇÅæž˜ÖýýýõõõÝÜñ¼¸ÞwoÈÐÍïççç¾²­àh^ÅÛÚ衜ӋƒÖééé××Þ„»¿½ÛwÇtjÐïïôª¥Ýää寪Üßààáâââã㤠ËoeÏ­ªÑÜÝÝÐÐÖ¬ªÃ××רÙÙŠƒËÍÌÚÅÄÐkaÑÚÚÚÐÑÑÌÌÍÒÒÝÒÒÒ{tÆÔÕÕÏÏϵ³ÐÀÄÄ›—ÉmdÄÊÉÔrj¸\Qø·ÇŒº½½Ê•Ê'´ÄÅÅ´µµ5'¶Á¦¢Ïüüü¿¿¿ÊÊÊÇÈȲ°Åøøø¯‰±otRNS@æØfÛIDATxÚíÙýÚÆðK Ø‹N<… j† ¦†˜ÈÁžÝÖKܹÛêíÿÿ ö½˜'aÜ.}õÕW?ï¤ãî{âŽÆàWödîÕÓ òl}%ö³»Ú ËxÙZSmCQ¢k‡ôn^rmFˆ§º‘béäöº©î¨jRUÿô jBà‰6ÿ.½4¹•Y_-›3-ÅøÈóüCÅϵ‚I}½JÝàr{.å·Ì/1Ü?¨h$ùz9w§øRÝ¥³¢ªÊ8§)¿™²+ã…§iQÝScrS¯FÊò&òfݪîíU)ñZaÊ>Ÿ)jzãum’‘)ÈÆjiU‘ PælO{õ’89_Ùt,¾øºL§-jûõÁ ŽFÔšØeÏRêÛç”’ìECM×–/ìeCm×û%‰5a­D³üÖd|&‡Û®{hd«4Ûj64DæVˆŒ¹»Œ¥h­¶WÉþu‡¦ËØŒ³MÒ¾ÖÜLSáî}|¶‘ŽGµû¹à[‰N5ª6²÷íTDçD´ °JƒÅ Úóqá-$\qÈ›¯h…øf"]Áx4+GhÊQ$ËMVE­^U¹Ku=WÑ”jAwŸg‰t¼¹«lh¹7É}×u&Ií²Ê7gEæpîD6¹™3ª™ ß5¸9¾!%ÕlB;îõúlÓ¶ØŽ¶Ï¹ëp3n˜¦EåFÕ4e<Í­eòíŽÉ(ßq»Ó°)–V‰Éf;ÌÍ)e:åŽHש…ô䳑nC4hÔ¸É÷ƒï5ï8ç¶±I¹•¦íu“'Žèí»¢ :±Ý¶as«(n–2Ï™Îãoel÷/«Æ¶ßmÙãŒÃVÿ´GSѦt„ÕëõwéˆkoTê…Bý;°ÇëÉ8lžŠÔ7tG¨kŠdI×vYú·øl|‘öªCÝWl%åRQ,‘hwÅ1"§ë«¤˜c¹âbÁtÓn'YZ¼1Yñ &*ZÙÂ>§S!Bц붺‰¨\u¬ÞÕ…«MuD±mÐ’ûr‘ßz~žT²Ù,3†Ã~k¾@ÌŽ§§Yб1¿ÕÔèu*U>˜¬'Ýòü ’¦¹Ít&"Ë´ÜNR†B7­i¼ô@»`ìÚø;cý=Ö~4ÎÎCû}m|ÅÎAųðøm-N B›Ïü¤5©#äÇ‘-#K“ÊŽï&«Í¯Ó.|71>1ö9y½4 Fý³ËÅëò ZŽööhnz Óð˜óñ„|Ú¼®| -ö?k†qóñJ²7úMâ £þøÎsdÜêɽ)¡éÚ×+ã…^LÓza!óð6¡k±Ñrx~?¦Ýfoo|u£ß^•eºp£Ú?O—ª tŠ1³OôÛìMg(†.†¡…ô‹þ<·œýû§Iý^p:½¼üA¬6<¿¸<þñnV’ß}úÂÌž?<¾¼g?/Ä[?<ûÏ8þN¼ e#Aì v4žÉŽÅAÎqwT+F÷y£ÞýsN·V;ìÉ~΃YíïÖ®GC¹Qß}þ|'R£óIÀPÔõG×ÅãÓ™›WðØó/j»A#£AñR¶7 ß!aÑh8\õ©ê '©~ØÛé8ÓâqädƒÏcˆ–öÇïõÙª Ýîb Ó½åì.¼R·× Ënß·å÷{ ¯ÕõýîÿÝʃ-xÁÏc³˜X¨G>_øÍ zºtÝ™y¡ûŽœ9³½. >æ®·¸ X|ZAüLê³¹rz`¯[.í9–Ú³˜Sg9Û±ÃÃÅXg¶lvt©lrÓ´¹ÌàñLNfÿ+åïÿ>ã–íµÛ®mqJÑ#¤7ÁR®”¿¯’1©xè8¶m;Nñ"Ç\øÓ"¨ÌsiNV$­:‡Ñjµ¾O ‡â©‚3iËäŽëz"³Õ¥‡pÚ®DǦüØ$âz,gÅZ¡‘‰–Ä@é2m”/‘üŠÂœÉ-zs2ŃÔC™œ˜(1ebõ‰¹ « b©lþ¯hSì<|Æd¼iæJÓÚÍ,šh¯Õ‹—‡t²ê‚©Y–‘=šøCÖÊå&]š&Ô¦¥¥’_x°ÓÚZ&›ÏQ\ñÁ¸»žÒßÂ×Ö…b±Xx ÍZ©T~R©äÓz•r§çŸ>¥ÆÝ|épé¶îMñ¥'¬VÛ,ù<-~DAžIR½’/>ÐiMEæqõãîjŠù;…Ål9š¿•åöXT›­v£Õ¡‹åVÊš°L^â;  Bcq[÷ ÷VOXå‘,ä+u^éc²uI#©~s¤pëÕüÒrõΖªëZgÙµðõ;|;žŸ+2~%ЧÉ.,HŸ½J:O÷\i].Uêm[éÞ¾Ö«¥ÍÌMr¾æséÚS\Æ y&i=½§Q©ïÞï™»¬RmËÏ%^¹Åk–•4Ã0wûB¿žË•áE%}æÂà‡´Éã2B½£› Ë4‡Ûí½å;m¡É7†ÜŽ0ØÈߎ/oì´Û?Rkãk½ìhW-¡Ý(×+-: é¯Óª,·…i‚R¾´è¹˜·v©"iºa>7M£·õ¬9 Ü”{#›¥š(åË‚P®Ô+•¬ðj×Þ]§5‡NPí=íò²þ‹¦&¥Øã]ÓÛxRâ=+¼'…óÿÖsñG»»ºaèš”£ÇYúšá¸îHµ÷è‘ ÂhÔtèfåÙ–ú,]ùé¹gYG·Zªçù {¼Ý‘Zj¹¿«¼êH/åQ¹MA}¹u/ Úý‘Üït^¶ØëmÃøIÙï„ðù€Ù0éòûÊ¨ßæ ¤Æ ÕoɼÅ׳GrŽêÖt\æ:¦a«[´sÃ`¿QˆEÁ¦e•kGq(—8ž¸§§†qzÌóq4ÜúÍnâÍß\Ë4L–1My]§E´z`ÑØ,Çq ½SÿÖ“ñÝzÔhYPf³È³´:}R {Ö$Ã*K&þÄ>ªÕjÍæ0HF*U53¼ž´z.Ë 78›ÏÏfôô'^Í®¥‘Aâ¿S_øî­x›¹îdlÓþ䳉—Ä Z\—щǼ$YàQC[kL|—Q1yµE™=ú—¼mX>­%ÞÑóy.wd»ë3 ™0^heŸŒ(W<«qR{ç8ïÒ|Ä1iús_nاJvÙÈw|%£aLü‘íûßÒµ:>NV( :†©‡g«Kécr¼pVEš»dPK‚8|OkƉLEÍY{–NŸÌðãùÅ;cA’]FÑtJ§™·'S±P|’ƇâØó‚·bLq<*Tº|Ò›b1‹ãhÆèÔ æÓ¾2VJ‡®”VœÃW‚ݶáÐAÚßPÝR.ï¼qÎ3ˆMžàRƃAr(ñl.–èY›L¶ž*ÑwÒÕïæv»TO“ɹ|’xÊȧkêÉ#ƒ6&¸Ÿúƒfy³ãß?^„S«Ó®³ÉXÈfeš» žª—Ñì½òÇÅœ}8 ¢³cåêb¸_žM?þœ$ˆe‡Óß½˜O .iò)>^ÄÏÅjDUQBFXW½ ‚CU Ã(dQñAF'AFéò™§ ‡××T;®Ñ“¤WŠý³Ç+¨EË…ø–N²ø$hÊ×<ò)œ•äOQ\£ðì‚^7©.•#/ˆ»‚çß¹ÝD©Q™ èîºÊ4 Þª™˜zA8LûÖ“ñÝÚd’î$gŸÿ¼ »ÎªÈ]YQäæÇWó© ‹²øžZ±ojRÿ«D—Š*6þ‹Â†4Ëø+±Åa¤?ãײ¨ˆOÙlΖýã=U¡ŽQGTd7ñ.mŒ­ŸÊª­ª[´hÅ}q:É"öäp'¦¦"áKÉ¢z¼ä°zÓÚ¥³ßš7Ã÷ £Å覇™xQd³³?ÿL?‘´ýÏ‹E‹kM«;·³Üì(~<ù"Å'o«éZv“V*°Îí_ïÙœƒå;J›ÈC©‚Ï;Y góU±Þ}/o²ú柰´B|  Oáe{~5gó{óÅ+r-‡|oü·Ê·À_vÿ¾ ~ëaÁÿ|SÀßå?Ñ®PÕ‘uÐIEND®B`‚MEND! ÷Õkit/sample/mgp1.jpg010064400237450000000000001331360676156117000140150ustar nishidawheelÿØÿàJFIFÿÛC     ÿÛC   ÿÀ&Ò"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýS¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢«ßÚ ëI!,c,>W\åXrBü+ˆOêz|sZM¶I“1‰–B8ëѺ½ûž•ðœEÅøN­Mf4åìê'Ë8«ûÑÞ-ifÕ¹^ÎîöI³zt]Uîîuë¯X6¯–·¯¤ŽYV ¤åb1‰ìcƒ4cÏÍìq¡^]á_ùô/ûj¿ú7N¯Q¯g‡³IçYU ƤT]E{.š½<ôëײ"¤9&âºQ_DfQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW¿½‹N´’æbDqŒ£$öó¯0Ô¯ŸR¾šåÆFÎ=@?^®é?Ûzl–‚ê[b ÜÁO$dåD¨éÈÈåOãšâ´ƒkáénæ>.ñF¼òÛ˜’ wRûL1¶å`áv 7ËŒÿu˜w¯È8û„ó.)¡ËC£N’r>[¹ÎÏy]réîÇG»o};0õcIê·0æñm¯‚`]FûX³ÒmÎöÅÝʧœácÎé 8@OÌ1ÉÖ|?øÅá?‰“Ü[h:Ä7·¶È%–ÝRXØ!8Ü¢DBÃ8É‚Ã=Fp< c×Å]Jvº—í:F…ojÖBA²¸¹žI §U¥½·<»s‘·©^‡‡ü=ý‡“ÑŸµ›ucÊk–.I?uY8½lõÕïÒÓˆ©Ï7¦ÁEWéç(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQX—^6ðý—ˆ Ю5«u™ÐÉ„— &u²Bç$ ­ÿ|šÛ¤š{2å BÜÊ×Õy®áES (¢Š(¤f¥˜…P2I8S!ž;…-‰"ƒŒ£3@QEQEQEQEQEQEQEQEexriÎhe‘¦’Úy 2¹É|çÛ®? ókccGG %üE&Ÿœytù¦Ýö÷ZÝ¢”n›ì&“á‹ XÖõKxÿÓu‰ãžæVUÜ|¸R$@@h 8.äuÅhZ^A}–ÞU–3ÝONø>‡ž•5yÞ¾.4?Ï%¼ ùªÁ¾ð''>ÛàúWÉñwTáZqδ¢åË;i%uxµÒÚ4ÓµÛZ®»Q¤ª·Ùž‰X^(ñÑ X¡Áº”¤àìÞ#ùvàúb±­¼y:ZºÏÉ8_’E8ñ÷‡æxú`u¬+WmSY€Ý1˜Í2 =A cŽœzWæ\Kâv‚§‚áêÛ×´yšqöwv×Gï=—-íñ'{_¦–©^¦Ëñ;k“ø‡H¸º¹HÒHõë@" ÝË Iä¬jO¹8¥nWðNÚê…ž¸¾¼û}î£j³ÜyB=Ò];\0Ú82‘ÆÆp:â¿¢Ï8(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ä¯Úƒöº“Â÷²øSÀ—‰ý­€_êÈ«"Û°<à «?f$¿w–ÎÞ×ö¶ý¡áOøY4­âÕüWª±Ç'ÎÖAœ¦'#j†À$“† E~qÛÿ«çüÿŸÇç³Lt¨¯eIê÷}Úø„!_Ú™Œ/M?r/i>­®±]W{èµ¼÷sßÞMus4—73Èd–iœ³Hää±cÉ$’I=sïÏêÇÁÿßx«ÁW:œ>F¥GÌxÛ²S r:mÆWaǴ䜒s_˜ü6<]ã-+JKöiçåâ`¬–ê7Ìëž2±‡n‡8Æpß¨ß ÛÀöWS[-µÅä“]J{7—•ˆny9]¸'¶;WŸÃôåÍV«ÙÙ|õü¯øž(ץͅÂÅ.d¤ý²_'g÷}Q_b~‹ãØø#÷zÆ¡¼ÛÛòƹgbpª>¤“Ål³RÌB¨$œ+ã?Žâ‰¤‚ÒY‹`æ(#ó’W†”màç·'L‘_/Ä9Ô2L«¼å¤WŸwä·wSèr<¦y¶)SÚÖOË·«é÷ô,x§âÖ½ãéV[‰Í•¦$D³µr©±‰á¿¾q€sÇ95Öüñ4ú7‰eµy¥:}¢´ ‚ ,q£`ôÁq’;zà ñÝ/þ=bü™¯WøO¦}¿ZÐbY<¿?S3»ÝÿщŸ{{~ž‡?†pÍlfkÄt«VªÜ—3m¾‰==ŠÛ[¡ú}K˪R¥–É|÷ýO¨è¢Šþ›? (¢€ (¢€ (¢€ §©_McÃórŠåÅR©ZŒ©Ñ¨éÉí$“kå$ÓóÓmšz4ž¨£¦ë6š²fÞ`ÏŒ˜Û‡^¿£Š½YÚŽƒi©8‘ÐÅp"xN×cœ÷éß§j ·Ú–„o`7ö¨8¹ƒ—g–ØzRkåµ±¹KåÎi§Oþ~ÓRqÿ·á¬©ú§8.²‰·$gð?“: *µŽ¥m©F^Úe•GP:¨ê:³_YCGJ5ðóS„µM4Ó^MhÌZiÙ…cØÿ¢x‹P·è³Æ—(«÷Gð±>äóï[¨£x‡Lœ|‹*¼9èF2«ìsÓ¹¯ŸÏ¿r°¸Ïù÷VuFé?—ï.ûZû¤)ëuÝÁ6+™ñݚͧEp\+Âø N7ê©à¦k¡¹¹ŠÎšgă,ǵy¶³ªÏ®ê¾fMÛaˆ@'Ž=OÿõWÁxŸžàp4òÊÑö•q ÑŠz«4Ôß[&•´÷š·vº0´å)ó-‘›R[\5­ÌS ãpà7LƒšI¡’ÞC±´Rªã~¶Öíus@y -Ó$⿊éB½Ö+Hšé,‘ U%À8Qž']}|Ûáß‹'îní¼!k¨ø¶x%{d’ÌCom5ÂÇæ4^dò£©Q€äÆJäpw.ï@°‡â}¬zlšv‘áÍ>Ù¶ÉycªjóÜJªpLhÑÛªFÃ, ~ð‚2ÍýÙÂxÎ/šTx¢­ñóEKk®h+«¿.[/S­+Zlõ*(¢¿M9BŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š+È~-~Ö? ~x¦xÏÄW:f³5’j mo£ß^~áÞHÑËA ¨ËC Á ü½1ŠM¨«¶iNœêÉBœ[o¢Õž½E|ÝÿøÿCŽ£ÿ„¶¯ÿÈ´£þ #ð ŽŒ5#ôð¶¯ÿÈ•Ÿ¶§üËï;?³ñŸóæ_ø ÿ#é +çøxwÀ_úµ?ü%uþD£þðþ†íOÿ ]_ÿ‘(ö´ÿ™}âú†3þ|Ëÿä}E|áÿø ÿCv§ÿ„®¯ÿÈ”ÃþÿÐÝ©ÿá+«ÿò%ÖŸó/¼>¡ŒÿŸ2ÿÀ_ùGÑ_:ø(?À–j¤˜ð¦±ÿÈžãó ÁA¾ùšµ_ü$õþD÷{Z̾ò~£ŠÿŸRÿÀ_ùE×3ñâ•ð»Áº‰u“/Øl&÷‘˜…DQêÌ@ÉÀä^?gû}üÔn൴ñµss;¬QC„u—yˆ ª¢Ó$’@uȯ–ÿkÏŽâ¯Ä)4Í'R7^Ò1²Á&è.&þ9ÇÊ3÷¶w )*püåV¼a(»³êxk†qÞa=X¸S½6Ó^íöWêö_7­™åŸ¾"ê¿r–[Œ¯V4aJ\ÒvZ1ß´·ÅØ4­*o é7QÉ©\—áP?“ _¸NxvÈã€sÆA¯˜m¿Õ~5Hk—þ%žçSÔî便¹•¤šy[,ÇúÀb®Ûªükù—ˆsZ™¾.U¥¤V‘]—ù¾§ôW”C&¬4u–ò}ß_’éät:_üzÅøÿ3_IüÐå¶¹¹œï--¼™aÚóÊÁßæ=8•—N­ó÷ƒl£»‘$wÚ[#O:äÊxänb«‘Óvz^…à?Ûw࿇ü1iouâ=\êeðv®¥¥s¹³¶Ð‚FBç¸QÛ¾ÇÃܵF¥lή‹àþù?É_Í£óÎ,­R´£„£+{Ò²o½¶ù¿¸úšŠùä~ßN?â£Ö¹ÿ©GYÿäJí÷ðDãþ*=kŸú”uŸþD¯Û½­?æ_yù×Ôñ?óê_s>†¢¾y·ßÁø¨õ®êQÖùû}ü8ÿŠZçþ¥gÿ‘(ö´ÿ™}áõµYu›Ý' ªÛnˆ`}²ß•ì2÷Sϼl~Þ‰À×õÒìOÖùŸÿ Ýðgþƒš÷þÚ×ÿ!×Ê×É(¬±Y]_«Õ–¯•' ¿ïÃE/Tã?ï*‹ZtÛ^Œ÷›KÈ/¡ÛʲÆ{©éßÐóÒ³|Sû­:+®¿ež9ö{Ïnµàñ~Ú­¯Òî g_·bð~´¨àŒ`±þŸ¥I~°jñí"Òݤ,7 šÔ8 ±'×?iO…Ú¶£á5 ­__Ñíõ?·êwc½°ã‚qm‹cn^Ef‘wʘ`EQù,òL§Œs<«‹òˆ{5{׋kã§~Y¥¥›”Tf®ï¤ÒjRGF¦"TªR©z.Ú]¥³ÞÊ÷M5§[=Qéß³7Áx¼¤Ø_y ¼Q…Œ^T—·2(ßH¡Ž ¤6–•U;#޽ú¼~ÜŸÎ?âoâ.FäLÖÿùµ|-û_ü*ñ†»k¤Xkš”W!ŠIªxwRÓíÆÕ,wOqn‘'ãs ’É Ýêâz’«RW“Õ“õjÿÈþæzµ­]øwQRT\ÙN *9Ã)xäõ ò;àcÈøçU×üS¤jV¾š;=RX…½‰žsŒÊëÊXC$o#¹ ¨ÀcÃ`ø£ã¯ƒu li’x¯N‰ÖEHáC$‘nl`´è†ã'~Õä0Õ[Çž3ÓþøfïZÕâ•£Šhí’îiY¹G¯òƲ¾6'fÐ 0ùk5̸’ŸRÁ`áRXZ•Té¢qRq\ÍsYÉA?yFZE(ûªÇlaMÓn_ÑÛúÜ÷º+ä þÛÚ^Ÿ¬µK»itl$v¾ñ)º…7.{éåd!3ò…Œ1Ç(8¯D·'Áóø›ø‹‘Ÿù5¿þC¯éª5e*q•d£&µIÝ'ÚöWõ²8Þµôƒû™ïtWƒ¯í¿ð×rê~$eõ ÖÈÿÒ:_ømÏ„Ÿôñ/þZßÿ!Öüñî/«ÖþG÷3Ýè¯ÿ†ÜøIÿA/ÿá­ÿòðÛŸ ?è%â_ü"µ¿þC£š=ÅõzßÈþæ{½áðÛŸ ?è%â_ü"µ¿þC£þsá'ý¼Kÿ„V·ÿÈtsG¸}^·ò?¹žïExGü6çÂOú x—ÿ­oÿèÿ†ÜøIÿA/ÿá­ÿòÑîW­üîg»Ñ^ÿ ¹ð“þ‚^%ÿÂ+[ÿä:•m?…L[ßyx#\çÿ$èæpö¿‘ýÌömbÿû3M¸¹ÆæEùF3É8öÉf’âåŒîÔ2œc ò+ÉtoÞ ø¯g©iÞ—[–â–iQðÞ¥§B˜ -ͼh\ç!n!X€B±µ?ŒzÃ/ [Þø™µ%³ûGÙm;JºÔ]X©dVŽÞ9$…“ ·hØ • ðSâcÅk$©%ËRŠœÆ¥;¯œUÿíÓOa/g{;Üôú+Ïü ñ×Âç1èßÛÑÇå4Ëw«øgSÓ-\+!'º·Ž6|Ÿ¸¬[Ž0¬Fæ¥ñ CÒ-ÍÍÝÛChPÏå1]ä1 €7g Ç8Çkëªf8:8ˆa*UŠ«?†7\ÎÊîÑÞÉjݬ–¬ç䞺%áßðÚ? ÿçóÅ?øCëŸü‡Sé¿¶/ÂÝSVÓ4Øõ-z FòßO¶kßêö±4óʱB,¶ª‰ºGE˜ °É®þh÷-Ѫ•Ü_Ü{UQTbQEQEQEQEQLšhíã2K"ÅêÎpãQ9Æœ\æì–­¾€>Š¨Ú½”i½Ü1¤²ˆ"wp«$‡¢©?xŸAž‡ÐÕºTêB¬Té´ÓÙ­PlQEhEPEPEPEPEPEP_œ?·~‚ºßíJwD^ Òº õ¾Õ=¥~WÊÿ´?ìíñÇßäñw… ðÅæ›>c¥¿(ÿâjÅ€”ÊqHBò6ý=¯©ᕾ3ÿÐÀ>¿ò5ßò²¤‡öZøËå´_°ôÿ„®û¯ºY¯žY]Nß‘úü¸ç ×ñ? ‘óðOôWyù#Wc“ÿ]ç?ùJ¤ÿ†vøÇÿBßÃïü*ï?ùS^ÍlëTs”wô?Ëø“ €ÂÓÃB¦‘]žýzuw>z°øoqpc J¨óI,›ÂÇ!ws€NTœIÆ$€lêš•µÒ[ÚéÑ=¶“j`‰”)vÚ¢Iœ üòÜyl ¨ª-küJñ掷>¸¶Ó­õHgVŸH½7VÌÈÇl1Jc‰UŸz/ï.?u¹ù2ÚkϳÛÛÄóÏ+Ž(Ô³;€$’zWå¼C‹NT¡²zÛ«íè¿èÖ2ˆT­N8ÜFÍ^)ôM|^M¯š^­?‡á–m6FE‡/!PHEÜO\ °¹#×{oõ_u:í’xÁ>·¸I®/'{»ëˆÉÄê‡daëq.d’ð»±\î“g6£qoinžeÄò,Q¦@ÜÌpIÀä÷¯€ÌðrÂb>®õž—]›ÖÊÛÙ5;£†ž6ÚrÅCH6ù_x­/®×Õ¯+3¤Ô¬þÉn¸óµWo•ÆáåÑ« tÎéúŸà^?½å¶>ÜÎ6»>èÇãÆkè»ÿ…Ÿ|WäÞøKHðÖ£ Ä÷Þ¿qc;ˆ¿t—”ਿ1e$îùÁ5£øñ’<ÿÅ1àÏ÷¼_|÷_И,¡à°”p±Wä^[½dþöÏÊð¼GB“­UÎÒ©&ö{l–Ý<|?'nc—ž_ojÃòvæ9yàõöö¯{ÿ…ñ“þ…o‡ßøW_òªªAðëÇ:N½imâm#ÁÖZsï3Í£x†êúæ<·Ia ¶Xs"àdò@Rc¾„±8¹(B;¶Ò_×e»èzâju%Ë ¶ýù>“·1Ëϯ·µ>‡R\KQÁ<’HÁX’ÇÀߥ}W¤xcE· ŦC! ÷ JÄduåü@Ï랥O“ EîâPcO•Tpµ~7˜x¡’aféá©N­ºÙF/Òï›ïŠn ÄSÑEüßù&|sðR²€Ïs¢ÜÛ¸Ý$°2¨$€2Iã“TÃõ8ÿG_þ¿õôåäÏ‘¼nѸ' §p+Ÿ¿¼Šêà­ü+q»ƒpyËïŸãíÃg€Fs]ygˆ™~2¢†*ƒ¥~·RK×H¿¹?òò#ÅU`íYiÝ?ÓþÈð1ðýN?Ñ×ÿ¯Ç½áúœ£¯ÿ_zöË?†ŸŠÓãoƒ4ï ¥î½jëŸ;KÐVâåÏ…òçž|¥XîUÇ nÀ'Tý©üee$º~¯_Þ.<»{׊Þ'ÉÜèÎÃ$aNHŒæ¾fYœIRÃáêTiÛH4›ÚÊSå‹]¥~MoÍkžMn:Êè|X…µôwüºùnC€Çš˜~ð# ßjÐÿ„¿ºÝsÐÿùþxº'í‘áD¾s«x*ëOP”–Òì_1|´Ç'”1Üî$8ôì¼ ñîïâÏŒEð—àÔ»–6’Òê÷ZeûíxØš|ðîûÄ*Lä ÜvʽžÏ<œ\ée²Kûó¦­æù%RÑóÕïîí|¨ñÆ_‹iQ­¯×æŒøAû­×=øÿŸæÂßÝn¹èÇüÿ?nÿ„Oãßý Þÿ¾ïÿ•›/Âï3ÊòÉáO³¹,ÇþÎIêä]:œäÖ6„ ºrÔsûÓ§ }ìõ#ÄTþÔ¿?ò<þFþëuÏCþ?çùúÂï‡qË£ê—ż‹‰Ùì®6îòš)y»w|Øš5ù[þxõ!ÍZÔ¼ ñ7E–Æ=sBð†›k?ØÒçKñÍíÄnQ›zC&>ÕFrDÈR-…>¡ac™coglž]µ¼k I’vªŒ“ÉàµùŠA<› K.ÃJÕªµ'廯ü JÝšŒ“Zže˜G:ÿd½éGYn®Ú÷cò^óÙ§ìÚg—|MÕ­¼S¥hºSm‹WûPžëNÎ÷¶Û†Þq€7:€Äà‚¹5¨ÇÈ89ê¿á^|ñ#ÆZ£ø¯Ãº†5+P„Gdúî»u§\G;…Äi§ËòÉþ´1~C¨ÀÚ ±ÿ ÏãGý >ÿÂÎûÿ•5ú' ä3Éòz8yAÆMsJ-ß•ËWÝÛ[»§«ÜááÜÙPÂÎ¥J—ö’rNÍ^6Œbú¯yEKKok#ËÇTcäõ_ð©-¼ ¢Tù=Aíì+Ó?áYühÿ¡GÀøYßò¦•~|hRü">ÿÂÊûÿ•5õÿUŸoËüÏ©yõ/çüùÿBàÏ×uoø²}oÅú^‰¦ÞJ¯mc3Ü\ÊÊZK· ²äŒåCÍ–æÜ7Fêgľ |+ÐeÖ|W¦|3Ñ,8{ŸÞ‘‚3ì²w;„PIÁÀ5ãWß·„4½!ÁÐçÕõäÇî´¹ˆÓd˹s4QÍÂÖ£æFWOØìÎQ©‡Ã9ò½%edÚåv“Ñ;6ž·³}. {‹ŠråwZ=מǤÿƒø3õÝGü!?ƒ?]ÕåÞý»ü1v鬸3QÒmvY¬o"¾v|Œ)FH@ÉݸôiÎG§ü2ø®ülžèxÏÀ7¡™,u_]Ùj+)†’ÜiŽþñyo"%Uß=ÞÌòå|M—}ûÓhô+â±h{JÑiw³kïWEÈ<Ä@~ªóæŸÿd_Ü_ûák¸_‡ß`xOÀz_ò¦—þÿÆßú<ÿ…•÷ÿ*kÅú´ÿ—ñ<§ÒÿŸŸƒ8oøC"þâÿß Gü!‘qï…®çþÿÆßú<ÿ…•÷ÿ*hÿ…ñ·þ…Oÿáe}ÿÊš>­?åüEý·Kþ~~ ãm<ÊJÇ“áP==*Ðð’ñû¶ýºà£þeOáe}ÿÊš_ø@~6ÿЧàü,¯¿ùSOêÓíø’óš/þ^~üŽXxIxýÛ~¿á@ð’ñû¶ýºŸø@~6ÿЧàü,¯¿ùSGü ?èSðþWßü©£êÓíø‹ûbüüüù°ð’ñû¶ý·lþ_ÝA‚ÄE(d{†Xƒ‚:©v¿Që]Gƒ|)ñLÖàkÿøÂųç\Úx’êêt[´Øú“ƒ‰à“’@ÝAá/Ìò>¡i£ÈìrÎöx‰=ËoŽLöéŽý{xù<Öl¶„*K´¦ã×¥¢ÓùÊ?=ŽJÙÕ©»®úÿÀ9 øb é×Ð-ÌW3]K“nŒUÇ%°I%úcu9ãZ)ÞÛvüØÎå ‚0#=eÈ W5="m28Úx¤ÝÝ|·*ÃåÛó+)ù”ç‚Bž9QÒª[ÛMtå ‰æp2V5,qëÅñF+<©ŸÍãáìñQ²µ>š]r´äõNû·­Ÿc•ÕöתÝïÿ 2êìî//'o.̲Êçs`ƒ$džFI<לë†÷Å“¬×Qù¨Ùì÷dF§ž™c“ŽÀ`v¾"Ó›WÑ&‚8¢žî ÓÚEq;C΄Y™QÈBN vPIUo™”Oüj‘מt`eñ¥ézø”×îž`òÚ˜*¸Ê3SÅÉ¿hßÅöJïU/‰É|OGð“ ”©TS¬ím·ûöûŒ!á8øýÒ~Ÿã\ÏŽü<–1øNq©_xg‘ï­ØZôOø@¾6Чàü,ïùSTu/ƒŸ¼Uwáû]OCðN—§ZkúF«uuiâ‹Ë©–+MBÞéÂDÚla™– Q–¨¢Š+Ô>4(¦»¬hÎìd³=kÕ¼ua¦¤®¬%ŠºiÙ¶Çççžpç ’yüÛ–8GUFSvŒur“}#yKä™q„¥²:J+'Âúðñ. ¶—6‘Ê2‚éEÇß °§¶O¿B Ö¯Y;«µbŠÍÕ1¿¾#akOd63Æ[ü1\Þ§¬²^ÇkmW^¹Ú ÓÁbÍ‘ò´ÑP“È8ÁáNð—×ÍföÖööÆÿT»;lìTó!ç.籌œŒà€F—wÂþÒüu¬j×Ñêþ"¹vwxPboõG@I-ó¼päîÊ*g4ßñ¶%ûgN5%hÊÝyt\½#½û½,ýåV|ÙÐZ›žøwo Lº®¢ãRñ€™o[;S ‘¯T´ŒŽÚ; â®ü}1|ZÛ" '™‰bGn1úÖUÏŠõKênŒhÇ8BãœàÏë_¢c¼Zá¼á‡ç«m,l¶ï':]'äš9£„©-ô=i£·ŒÉ,‹c«9ÀQ¸ñ›lžö ÇîÛyü—5æ.í#³»v9,Ç$ŸZJüëãV2MýOöæ“–½ôQû¿¥`—Y…qã]2»[ŒõòÓúîÅQ¸ñü*àAfò&928CŸ ¹ ­žÖšä¥œ³]ȰÆÄŒ€Èã'ìj®}°ût›kýpœ-±K}ÀgcM)]‡þ÷†2N*ð¼Oâ/ÝåÔ8»j £“ªÚ}Þ­öè'K Oâ×Èíá`ÿÓ‡þFÿìj½¿Œõk§)¤38+nǼ¡§xK^¿MÒZØhq´ghv½¸ŽLà)HñŽFw{ç8£øQ¥åÿÂC«Üë1Æå–Ö[Kcò Ž>¬2~`AÆAÏÞ`¸{ޱ®2ÍsUN+¥8Ç›çhÁéV0•Jø!r ŸŠQXÆ$¹Ô´hРÅ1œçýØ™˜têF=ùø±q=»M¥éw^" q»N²˜C»º´Ê°8ØzŽyã¨Ð>x{Ã&çMÒâ‚àô•Ù¤uà”¹%r Ïzè«ô¼HðrR©‹­VßÏ?ÍEE?N½nsJwè‘¥ë·:“Á»BÔ¬¡•wy×F1‘¹D…Áí¹óŽkbŠ+錂Š( Š( Š( Š( Š( Š( ¿=¿mOÚ#þ½uü \]E¢iS¼z‹‘/.Q±·n”õ8fç*±ö_ÛcöŽÿ…káçðfƒqwmâ½V•®íþO±Û °b9wÚÊ6à¯-•!w~yAþ¥~•r¦ãMMõ?{ðï…ù䳜dt_ÃOÿKý#ç¯DÍøVûƾ"´Ñ´áÚ® ó6ÔK»±Á8TVb$ã@?SüCÒ,þ|»ŸHŠ{+Ù›FÓÂå2ô‰æcÁ/È…€o˜áv×ÿf¯€×vH-¥ýúÁ6­9O,ØÁ÷…°%w ~u#ýb(Ûˆ‹·'ûtøº×Pø¤xSOò¾Ãá›ÕWß’l%˜á€E„‚?¼rIày•W²¥)ug¥‰ÍÖÎ&¡—áÝðÔ<»IÇ«[[šÑ^­êšGÍ5÷¯ìoðøZh:4—p3ambUvGTžãh€º`Ž99WÎH?(økúþ&ñ™£Ú¼qÜêQZDó^GTRÄq–À?C_ªŸôK-/ÁQÏaŽÚáÊ[£'ϼ_¹†"Ù%¶¬}Iþ#ÔäŸ7.¥z²¨ú+}åx£˜{< ^³““ôвûÛü>ÿB¯Ÿÿk¯ŽiðÓÁ’hzUÌGĺ¼mT™Ö[HÓ¼ƒŸ•rG'#;H¯Oø±ñ3MøOà›ýP–2$+im,… Ôä‘.9'¸$ð ~^øëÆ:—Äj^!ÕÞ95 ù|ÉLHUU  Éã’NIæÏ³O©Qö4Ÿ¿/Áwõí÷ŸÁ2ó|O×q+÷4ßþ.‹ÑnþK®”,º'Ò¾¤øðŠöiþÏ8ŠÓWš/2i%6l2$ 8ýãîPT`¨ùK Òòÿ¿ ä×ï-µKûq¬"Ó-¦À[«‚áC2ž%ù†I _æQ gø½áJ|×oÖC&¹,$K} g¸‘¶¡;Ï*¥Ç_s·$Šù¼‹+…<×´‚n+Ñ;Ëü¾þÌúŽ3Ïg‰Ä,/zmFoÍ´”n¿òo»º>Pñޱ¹âýjæßÈû*]5½¿Ùœ¼f±dÍœ¢)ÎyÎ{ÖßÃ;»Õ¥š(Úyí`i!…s<ŒËmîZPã9QŒg#Ït3›ÎpÇ¿ÿ_ü?©ú3önðÀ½¿°y•J¼Í©:;˜áÌp²mïæÉ&Aê#cï|E‡–kŸF¤Õí'9|ÿô«/ŸÈîâJʲ™Ñ¦í¢„~ë~W>˜ð+ 6-…maXË¢À|ÍŽÅŽI÷&®]]Ccm%ÅÄ‹ ©g‘ÎÞ’òò >Ö[›™R x”¼’HpªRM|Ùñâ¼þ6Ö#²±g·Ñ"“åSò´är8ô_Ï'ûñ‡ð®µ]fþõoôK«ýlÄ2ܶ®cW’EnûÁ쎯Å_ou»‰­ôÇkM?;‰$ ’{žžÂ¹ëwi0ìK3–cÉ>¹ÿëÖŸKò®3’I$$“ÀrIé]w…ü5ªx¤¤¢Ãj6³j÷QŸ$Øa2þñ†'‚8;Iþb†_Ÿø‹s”›‚zÉÝBéÞݽßSìñ”ÒTà¬ÿæÿ¯A`º‚žêxíâ*Ä4®p1£«}ÇVÎé5;T¸´†öêÝþìÐX\:6LAè~ø£øjo´ÃÞj'ï_Þ¿›9àŽýÞß” €3šßº¹K;y&áKkõL/„y _í•'R]]ÔWÉ-—«~§ÅVÌjV•ÒI<ë0Ik?“24r£dn ñ\–£þº»¯k®j¯vÃhbB)ÆUF08®b×M¸¾½Amlo.¤s µ°ù’NyãjpÍž>îxbkðœSÇ7yvU'895==Ôß¼ü’׻웱ňNQW=à.¥ssérÇ,‰ä›¡&ã²/ò!>ç|õ*’1·×Ù‚)f!T ’NÍxgÃ:gÃÍ wyÆì﵃†•†If' 8ã'©$Ÿœ>4üyÔ[ëI „Z›ÄÂ;[PQ%¬$ƒ¸Eƒœ1ûˆ³ÇÏaažÏÛOH}Ñ^Ùñõhã3i5{Gðÿ‚ÏŒuž‡õüGâOx—Âö)u¬øwUÒm^AÏe,(ÎA!C2€N8ôÒ¿Vt‚š^‘¬Qjz”0Â֖.–¶Äç,(Ôl rH<žsÍjÚ|&𵄆K]>[iÚ^ÙÔ‘éþ¾ó „ú²W•ÎõII^Uµÿüñ~ôýî{ÖïÞü2ñæ‘â{Í>Ÿp$hÑü¶–6dŒ>ÂÈλÀ%wdr}iÿøgáŸIá½jÊîD×õ)fŽh&Fw¸Bæ^‡Ê%PnË‘ ˆŒñ,ßÇõÿ?çù×êy?-zV’Ñèÿ#ç+a§–â]%+¸Ù¦¾Mz3ö#öxý£t_Ú ÂW´´—E¼Kƒe-ܨKΰÇ$žI.ƒÌHë•ò/ìIðPð_‡´oµG4/oçjwÞjœ%ÝÄH‚Ü«$Kõ •‘dà­}5ãÿZ|>ðf¯â+Ѿ  ‚<‘æ9ùQ2#s\àã9< ø¼d)G8aþÙ«Ñ«(áUlF+¿Ìùóâ¯Çm:ÚIРͤZVm5Õ윅¸”ÆåC«1D§pO˜b:_é÷~(’Ïš|†h¼s\ye…½¢€gü¤r Æ#-*ò+á?kW¾ ñö±y7›{p×rKµFdfÜNrzŠûÿöaÐõ«ï §â¿ ècsì¿?”—,ªEï)GX4­ª»÷îöŒUµlÊ­5(¯£ÇagŒ£ìéÖ•)^êQµôÿ’kºk]R†–Ð˳ñ¥Üæ/kp<›•ØÇ¦1õÏNµóOísûté³ÝÏü#>µƒÄ~5xÙ¦å"ßM „ÆÓË9%[ʹ%“)»ÍmïÛ¥<%¨ËàO‡7Óø‚Ò]ºž»å$édÊÃ6ð†ZLŒ;BŒ¯/Ÿ/Añ»Á¿Z 7â€îïüS?—¯‰|E©ÝÊ|„D’ù%vFã7Ž5Îkírâ»Ùæ9ÞëxGÿ>š…kt”©I¥(-Û…E6•Õ;hýL.WÍ%¢èx׌<{â/‰:ìÚߊ5›ÍsT˜¶n/%.T/±D@ÎÄ"€£'VHè+ï ~À¾Òuë‹™µ§ñ•‰ŸXI0·ŠÚ&ܸxX¼¸Nc1r™ÚÁŠ£u?Ø“À^)±Ž+Í;÷¡üÄ6"XÃ#ýe¬‘¹Ÿ”±\òF@#ôz^*ðÎ6VÊÛŸ"÷¢£É(y:såš¶ÚÅ.ÍŸKÚ†Ñåmw[|ÈëjÐÓï®t»ûkË;‰m/-äY¡¸ÊI©Ê²°ä@ ŽF+éßÚ;öÖþ èòøÃ²Ýkºe¼€¯›-”@d2ª¨‘AÉoÝ¡Ua€áduù£AÑoIÙ>šÕ§)þî#¿Õü]i¦;Ä€ÜÜ)ÁD8UÊpU½'ö!¦žrøÖú¤û$ì]<58t» )/¤‡I·[Fxôøeã ¸ã”P ?Q ã œjAåKeos›dà²yÑy{Ӣȼ“µ¹Æà§8Šøùpþk ³J”% Þô½ÛÝÙr§g-•>½¶öæå¾£)P¨u. &y pHúÒQ^|®èКIb·W6¶ÑÚIrO˜èKHÊp69;plQ´aECR[µÃíŠÙâf ŸBí…GSÜzÖxÖ¬åó–Â+Ýzxr-&Ù¥TnpL €Ë¼pO©Ç!»2‰µ+©.|¹¦34JÌ Ç¼«…àWé‡í]â_øE¿gÿÜýŸí?h´ûÝû6ùì"ßÐçnüã¾1‘Ö¿,aû {tü¿Ïùçæ±¯Ý±æøYJŽ'Ö­¨/’æ—^·Nž§§~Ï:GÛþ"-ó,O“g=ë X1QLœ}å–hœŒm$€éä·–_|öJä?F°{‘'dQüÍ´dô\àf¾(ýŒ<.àÛ]Ï3[.§ªÇq’,œnûÁ$nWi$LôS}ã3?kŸÚ,üH×_ÃÔÌÞ² O$+µ/näîÉßñ·€ Ë|Ãa®HÖŽ í%»ÙV}€­ÅÜS,jtRŒ¥Ñ%¬º|Wm%ÖÝ–œǯw_ürÚ©‚K-&Õ~Ïag$…¶Gœ—a¡Û#vÞ0sŒ¶7Ã7ŽuÏ.:"Øy—·Q•%#äor6Ž 3m*\ÿ„<7yâízÛJ° ö‰ËÒ¶ÔDU.îO\*†c€IÆ$€ßxþÏ¿,SI´kˆ$—EÓ‰ò<èÕ¡9bd–@ «ŽxTBͰçäð™|ólS¯_àO_7Ûüû/‘ö/´_ß\Gkoà»äv «– ’IÀö¯Ô?ÙsàŇ€ü7e4í–~jY]#k¹Y˜Os"(êxE IЧvÕcõ/õûÛéšYX„ÏD]Ī0 dà;W—–Á:êrÙ~gÜcªóT…þ'è¾¾ZÿÛ­ø3ðÒoŠŸ4½ VAfdó¯&@un¼¹Ýµ€'îÙAë_¦Ö–XZÃmm vöТÇ1(T@ÀU€+Ædÿ†£À¿ ÓR¸Mº–¼VòNs¶!xbÊÅó€y‚2µítfX¿­VÓáZ/óùxi˾µ?´´ÿOü â{n“Ø¡e|óêz³ ¬ SìÈ?0Oã_þ×_µ{_hþ4øð³Äöpø¿Hµ3ê“+ùr}™F¼ŽÎlí7*«82¯™°™„Þý¸?i=söwð­àðæ—,ºÇˆ\YÁ«Ë{]?l@³6rV |´#c±ÈM­ùOà-oÄñ~áI®àñW(, Š™åo”" ~íÛJ`† T‚ é¼8á f}“ÖÎkT\ôëVöJOÝ“§^|±«£j›ŒT·7+rZ¨·èNqE%ù á? jž2×ì´]ÊMCS»}Á¦*M&“*êºUž¹¦]iÚ¬7Öq43Û\ xå†YOH בè?²Ç„¼/¨ÝÉ£Åk::¦ØÁË`î¯8\´e²|¬_( Š+Ù¨¯V5jF.“I)Tœbá4žë¡WKÒí4]> ÚÖÛIÐêIä“É$“V¨¢²3 (¢€ (¢€ (¢€ (¢€ (¢€ †îò L·¬QŽìz÷Àõ­^öꓲ³æq;)áÛ\Õ‘Ðk~2ž÷1YŸ¤‡ñôôëÎ+Ÿ·¶šéÊAÌàd¬jXã׊­§K}âÃø{G›QŒ¸O·_ÿ£Ú»ieù·Ê¼7M¥p2vÕȾ_´3ßxÏWþÓ´‡.š]£¼våö…VùB…9-¨ää“’æ58>â'<ß‹q~ÆMÛI8ÅjôO–¶º9=5W:}½:~åq.¬æ²G:yr ´‘LŽÇØóPÒ³n#€ ¡TU`p§C —â¥ôT'ð¯ç:Ñ¥S(`Ôœ´S³“WÒöÒï²ë±é+ÛQ”¨#ª"–v8 £$ŸJ«6«i´VÞfµxÈ,ôö—+Ó,é•EÏä°È;H5«eàøŠMº´ñøG‘^ËN—uÓõP²I‚ ‚@;NÈ Èýk‡¼-ㆪãWÕéy{ïÒ5ÿorüÎ:˜¨CHêÌÍGQ³Ñ§H/fqxì,-Óͺv$<°FÓó7È?.zU‹ xÃÄ®¾\iàý9•[Î/æÞ0##‘‚¤‚–pØ;°kÒô é^¶0iv1Y£}âƒ.ü’71Ë62q’qž+R¿¥¸w€rNå«FŸ´¬¾Üõiÿum++ÛFÙæÔÄN¦èpšGÃÁVój×(ú¾¨¿½{ÛÓ½šRTåG!IqܰÜ~c\õÍÌ·“¼Ó9’W9f=ë»ñö¡—á{»›’VÙ ù®£,£pÆrN[’&¼ëDÑ|UãX"¸³ á="U—%¼Ë¹TŽ ‘‚Go/*ÿÆ+åxß…s~1Ìèá(ÔT𔢛“¾³“w´tçj*6Õ%y.kÝЫ 1m«¶&©¨XèJçR¼ŠÕÓ­¾à÷Æ@òÇÌ  m^G#"­h–š¿Š_IÒšÂͰWTÖ8ÊèíÇSó¤³#m9ë×xkáO†ü1$SAcö«¸þíÍÛyÛî‚00@®zúöò_ ø{'´åKÛT_j¦¿ttŽû]6»‘mÊ–ـ²§ ßçÚ>Sä}6ÎãRš KH$ººžUŠ Rï#±UTd’I×=óÎl÷·ô·w—]ÝÜJešyœ»ÊìrÌÌrX’I$ç9¯ªÿdOÓxŠæÇÄ6žeÕÔ¡´§‘mbGdší— euÛ[9W8 bsö˜štòì?"éø¿ëð?¨Tð|’§¿/ß9¿ëåä{wì»ð ;F†Âíí­æ«rGtQqjO)X rd`TJ1õýgx{A´ðÎk¦YÖêUw¶æ$’I'Ô’OsÀ´kâ%'993ùƒŒ­˜b'ŠÄ;Înïúì¶^GÇðQ¿ùð‡þÍ»í7rßý§Üò“fݸç>vsž6ô9ãáè~èÝ?/óþy÷_ÛÄ¿ð~зټì‹K{ Û÷y¿/›¿ÿ]·ýÜçœ ‡îíÓòÿ?çŸïsúï‚ð_QÈ0Ñ{És¿ûyÝu}_¥Ï¡ð÷‡ã’æ)oîšæAb)"ˆ`«óÏÎè@Æ>\õ?"ZñnŸJüŒ±®24SÒ ñzþV?xðÿ¨e’ĵ­I?º:/ǘ÷Ï€š]µÎ‹Ûf‰lnµ"÷>tžZ¤6Ñ$ù³Æå™€û¸*=r2|uã)ü{â½CY˜¶É¤"ØŸÝÄ8EÁcŽ9 dŸZѼsá†=²K›‹›HáŽ\Lrƒs61÷JùñFr~efã’жÿUø×Íñ)ÐÁᲘ=!)Š^õ¾WüNl·±8ü^m/·7ÿ†:_e½¿Ô¾xfmn{5„칺œÛ[I€LD|òÌ2G(˜À8$¸*rµõÞ‰£ÛhM¦h»mí£®@±ÕŽ'$œrI5æŸüº&‘%Ô‘¼sD¿cUe#çù^á²×ýçî÷Ò2kÖköNÊã”å´èòÚoÞ—~g®¾›|Ç3¼sÌ1Õ*§xÞÑô_ç¿Ì(¢ŠúsÂ9ˆ™†Þ $|4Ç{¨ÎJŽžØÏjã-€$;ÔÞ"ÕŽ¯â Ü>øc&8ñœ`ØÖv£k>ªm´‹G s©ËömÄŒ¤x&W HÝ„Œ¼0sŠþ/â/iÇïÄõЂ†ØaP[‰H;cr71ǨI?$¾"xßTøâÍOÄºÓÆú–¡(–_%"áBª¨ô  äàrIɯdýª¾;^|`ñ\ðYÞKÿ•„…tûr†!!ÚLëžX’Àg¢6©-Ÿ6øAàhüyã{[[¸üÍ&ÉMö »ˆÝ<¾0ó£r䯙»S^},B­SÝÙ3òlë<Û X§eæö¿§o+³Ô¿dƒW¾"×cñ##ŸÎ³°Äm˜Pá..ÎHV@$J9 ÅÆU£PIìl¡Ól­í-“Ë··b2NÕQ€2y<õÈü2øymà"¬Ð¢ÌUVbÕ~UD /hì¯UÕ-´M.óQ½—ɳ³…î'—im‘¢–c€ 8ðkÕ©7RWgè¸ <³ ©_E«{kÕÿ]›?lŸM Z_ƒ­Œ‘G: Bñ†@‘w2Äœ7#r»êÆAàׇüøoÿ +âF¦L›´ÈsyÎ3•á”üÌU2§#~qÁ¬¯ø¶çÇž.Õuûµò潘È"È>Z4È;P*çœdòkëÏÙgáçü!¿T¸MºŽ½²íùÎØ>JðĆgÎýæÓ÷k¢5(5§ÇájË4ÅIt›mùAioš²ktäÚÙžÍ^eûEürÒ¿g¯…z§‹µ(þ×,[`²°IÒ).îáKzrÍ€Ä"³m8Åzm~LÿÁK¾>ÂÅø±‚4«Ï7@ð¶R&\Ç=ûcÌ'l…[Ë\F2¡•ŒÊz×Õpv@ø‹7§…šýÚ÷§þÓæì¾wè}Î*·°¤ä·èp^-ñ†µñöAÔüCâ-Fm[ZÔ~%y×7w-#0Ó…P@½ö$ý”[UJñ¶¯‹ùÑnìEÔebÒ¡,B\¸ln™öîˆt Ë %™Z.OöðÖãßüBÑuûS¬iv:Ž©ÚiòƳÆ.„’ž#pWˆÒ)07$ø‹ðóáu®›¢ßøÇ@Ð5+q=¥¾£}2J‡r– •Èr¯–Ë{U™¿h¿…ö†5ºñÿ‡,åx£˜Eq©Â±Ð:6 tee`zAü(´è;üµîÞ“þ_‚í¼)u=Ô¾5ðý½Äº †;ûBÉ#óO%È1K/Îñár•ñAáí¬³ˆ”¨ËJÎÖå²÷j¨ûÚ-#S´-6Ôi´ø?µç;ÓŒ7O?/òóÓ©û áˆ^ñ­„—ÚˆtÍfÎ9L/=ÚJŠàT•$g §âºüµê>£üÿŸÿ_è—ì7ûS>»b|âû¹fÔmÖ[›-bòé¥{”/¹â»,»‹8¬HP…Ëæ™?Ô5„ù—¥Œp9ì15• ±åog{ÝöÛCíZ(¢¾pú¢Š(¢Š(¢ŠŠååŽhcJV2Ûw{gIªPu%{%}oNÉ]·ä“o nKEséãk?Ê•.-È$1’1ò‘Ø€Iý*ä^&ÒæIo;ÁR~€Ž ùŒ7ä8¶ãKNêú9¤ôWz6žíß³5tª-âʾ-ñh6½¸ŽK¤¶žà,ƒ*DÌ2–ð·«Ì’ëûcÄÉ:K™•6©Bv”Éý¥ù(óÝ[ ÜÍ&â #g1€Š>a½‚d'вœf{–K-ÂUTý£JrwmCwd·oEfâ¬Þ½Òš§.f¯c‰½Ö,ôûŸ²~÷QÔÎBéºzù³$1 ¤Ë/]„V¾ðç[ñ,ÁüCp4Íx?ضŽ¥PxY¤\nåU³–ûÇo—Ðzá}+ÂöÆ .Æ+4o¼Peß’Fæ9fÆN2N3ÅjWpVOà ŸNõmg9k/—D¼’^wJó«»Ð££è–’ÚiÖ‘YÛ®>H—ŽË¬pIÉ8æ¯QE}Ù€QEWQÒí5hØæÛŒ2rŒpq¹z0ç89õ‹TQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@uMRÏCÓnµ Bê Xšiîn$q"Œ³3g&¿i>+jz ¼šoYÈÖÚ=³1òã€<ÅRªA®ó¸nU$ìõ7ü3öŒ“K· <=w4S¢Í­\ÛN˜òX6-X °-ð%~]£æW8üü_½_ dYs¥Oëu²ÛÓ¿Ïòõ?qà|“ØCûJº÷¥¤|—WÓËÔëþø÷â/‹lt{@ñÂî¯yv±‡[KpÀI3@!Aàdnbª2Ìýqø%à[_ xrÞþ8>Î×VÑEknÄ?ÙmBÃ~Y¾@„’rp¹Ÿž?cÿÙµ¼- ­ZÆu—ÌÔî®T¡K Äʬ¥ä*6± Ácsö…|ÞmŒXªöƒ÷cøùÿ‘òeŸ¬ã¨Pw¥Jéy¾¯Ó¢òרTsÌ-à’Vª)b\š’¼cöÃÖ¯4/ÙçÅSXÍäI2Cjíµ[1K*G"òUfê3Æ xgÅà0²Çâéa"ìêJ1¿nf•ÿóGÇzä'ñLju›T’;]CQ¸¼‰&:¤’³¨` ÁÁ?SYýÐ=º~_çüó[½t~ ðŽ£ãmb-3ML…|Ée”‘‚»¤€p£#±$,À7‹Y9+#û¢r£Ã'9r vöIugAð“áœß¼BÖìgNµ ÷n„É!f FpG˜äœg8Uv¶í?¦_ ~'tHÍżj-pˆ–û5º"¬p$“´(ÉÎIÆK`ÀþÎ-<)áí>â{V{kA¾Å§@q#Ïu"2~P™$…EmªçÞ«³ †T#wñ=ÿÈþEâþ%©Ä8ÇìݨBê ¿÷žÚ¿=–îQEfx—^µð·‡µ-búQ¼—ÈQ˜*ª’Nzt×kj*ìøXÅͨÅ]³ó÷ö·ñm¿Šþ8j+j"h´¸#Óüèf,Œ¹f9‚B…rpPý+Žð6Šž!ñ¦Ê%÷7¤íÞH·fGÎ06¦æ$Œ < äµ=jk×ú½ÊGÍýÌ—r¬@„W‘Ë ’@É8ÉüOTø%a»S½Ô™\ ¶0†IH‹ku1¼¬_“<€sø$âó\Ö)í9þÿ#úººYFÒÞ•;ÛÖ·ã#¨ø¡«O¨x™á“jÅqÌ8æfv#'œÉ·<¨€ç9þ³‡Qñ‘ipže¼÷‘E"dÊÎ#ƒÚ©ø¬çÆž'ç8Õ®ûÿÓf÷ÿêcÓç’Ù£š)cpé"1 ¬At"¾G4Äû\ή"ªºçnÛèžßv‡‘…Âû ¶ž›µ •öÖÛýúŸyü9µ’×Á:Išo´K<_ky6ËJÆR0=7ãðíÒºJò_‡Ÿ<7ªi6·’ áWÊXÞ=±*¨àŒ6äã$g †ëãW„­¯Z×ûDÌã|1³¡ÈÏ 8?ã_ÑÑÏr©ÒU¾µÕÉ-{jÕŸ“Ôþx©–ãiÔt¥F\Ëɿ˧™ÜÖŒuÈô]àîC<‹å¤dŒÙÆGkƒÔþ6µÔ º]‰†Bpd¸ ã‘н둗Q¹ÕgûMÜÍq3`sØóþzþ_Å$à08yÐÊßµ«$Ò’Ò1ºÞïv´vJÝÚØô°ù-{©â*íÕšo;O\ƒÏ¯Jë| b—Þ1¸ºi#iÖj© @Å$™›/»ª‘Gížy=0+˜œýOJï~Û¸Ð5}R1Ë{s)‚[q¹š8‡•'¿(ÄG͑ԊüçÁì¿Ú昬{ZS‚Šõ›¾žv‹^̬âVQ‰ç¾6¿þÑ×ng åLŒ9äަ¸ýßg{Ë¡÷­ gP8!™‚)±Ráÿgß5ÐjÌí6dϘY‹d`çŒÖ.™¬Ä—»‰ ªÏ †³Ó#$÷û×É幕*œEËŸ+«ÎïÒò¾«Ë·•½£}1¢höÚ“i§Z.Û{hÄkluc€IÉ'’M^®>Çâ焯¡i?¶m킱]·'ËcÓnzÖ/Šÿh?ø^2ùµKŠéŠï `ÿt×ôǨ¯ì¯íL³öª¼{ó&¿=N9U„äÒGmâoižÐîõ}^í,´ûTß$¯ú:’OI8¯€þ>þѺçÅs.—þÌðÊÌdŽÍ8’`1´ÌÀüØ ¶ÑÀ'øˆ®üpøÃ¬|S½Œ]c¦[ Á§Äå7vdW1þñL‘´…« b~/ΗÚ=燵‹Ý+P‡ì÷ö7ZÜE¸7—"1V\© à‚2 VxŒð}*2§8FÏ•Ní¨ëhݤڊj)»Ë–ÜÍ·wðö]‹Ëê*µãe-šÒíníÑõõÛCöà—“ÆžÓ'ò¾Í7Øí®¾íþTSD²F»¶Œí S=O—¸ãuz|ñûý«þ.™öï;ía‡?hÎÿ/Ϲòzó·Êò¶öÙ³b¾‡¯‡?LÂÔu°ôêËy$þôQEPQEQEÏx§Ã‘ê0½ÜEb¹rÅŽÀõ=¿çíÀWyãmWì–+ibYþö!^ýú{Œ×¼“)dBT¥ºIÂŒú“ÀI kø«Å*ÜGõ|®“uš^Ó—^i½U¢¾×.²k{ëªmûXW%Nóz GhÝ]«©Èe8 ú×C¦øÚîÍ6\ ¼@0 ®:wÇ?ˆÏ=kžthݑԫ©ÁV úVæ“ ¶µs‘©Åap¬“ÚÅd²Êá·¢±–]ê2Ñ¹Â ãƒØ×áö;ÆæSÃäø¿«Î1r•îÓI¥ðÙÅ´ÚÒVµî¶4ÄJæ®vZV½i¬‚ r$Q–‰Æ ã>ÿ‡¨­äàøm¦ù¥ý´S â–÷Q”´nv2€G88Ï'šê …màŽ$.U(.娀1ËI>ää×÷ ž*•ÃQT¨·”cÈŸý»Í+>úÚû%±áÊÍè‰+žñ´Ïo¦ÛKÛ"\«)Æp@b+WPÕ#Ócgxç“jî"(™¸úô¼šáµïI­Âù JÁþöæÏ#¯sé_–ø‰ÄÙn_•WË¥ZØŠ‘÷R»i¦µmiy´ûXzR”Ô­¡Òxnþ×MðõºK0†Þ ɘ@ÌC•E%¶#ÉåŠg‚VOiÝÛA$íº™míÝâY>U{Œ’022FFx£ód ]#^­$‡ Š9,ǰ$žÀÛøs£¾¯x|KuÐ[„0év—£dd.ëŽä4„¢ñ–]¸àà~-Îøº·<éFž’JrÞS¶]oÞi+¥e}nUz0¢·»g¡ÑEûyÂQ_þÓß·ußÃOMáÚéZµÍ‘Q{¨Ý3ÍrüáíÂ.ÐYvK ÊFAÇN S?gI]ž¾Y•bózÿWÁÆòµßD—vϳ(¯ý‘h}Oã禽×tûk=bÚî{w’Ç" U-¸+PâáWlí'#8¯{¨­Jt*:SÝx¼-\yá«+J.Ì(¢ŠÄä (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?¿j? xݾ?ø–Oè÷æÿWÕ¤MqkÅì@ªÀ°”d"6…p¹læ&½KöXý›u#©[êú¶‘qŠ Íö B#ö|k·ý.E<«–$&à í¡™âeýÖü'¥ø‰·_Û´°ÄÆ9¤ˆºsò¶Æ‡'ç8êhðç„´ A4ZM’Z,ÌB˜–bN8ÀÉõ5ôØœò­|,pЊ’M®Ë·cï1|]‰ÄeñÀR‚§¢‹iî––K¢}uˆxSÃ6žЭ´ÛD@#Pe•WišL Îy<’=Nà Ø¢Šù“à¾uýºìüA}ðEãÑ`’âÉoc—TH‘X‹d û°~l+ª1+È“ò†¯¢ª+›t»¶– wåBµŠœƒ‚0GÔsAéå˜ç–ãh㽜”¬övþ´}§ãσþø‡Ç3FtÍ6v°3y2êrÄÂÒÜ€¼Ép@À íåŽ@PK~üýÿg7Ãz´÷ìÚq+0[„]F@8šQÎ#;#É×s4žÇ'ÂÏ OwÌús]MZæêiG ÎAìxæºÊÊ4Ô]ϰân4ÆqU_gIkÊîús;+Û¢²W×µŠ(¢µ?< ð¿Û/Æòx?à¥ý´,wZÔ«¦£¤jÊinè jã ’:ué^QûIü oŒŸßN‚í¬ïìe7Ö­´º;ª0ØÊªX‚—H8lm<øÕž¤(üM4o$©†£™aêâÿ‡&þO¯—#óRË¢}+ëÙGÀ‰«ÚÚ¥MÜÇQ–)"H-ÉŽ< ¤|ÒÉ*°nªœc‚ÜÇ‚¿dmN;ˆÎ§iª\Ä¥ÚÖ(ÎÔÿ—k8#‚Q¹8o—'ìO‡^‹ÀºS#H³_ÜûCÆ6Ä¡8Ô`*(8 âr оõÌRµ“²ëw¥ßm:o©úoñ^†x ¹“~ô¬Ò²w²½¯­öÓKßO”>:|0¾ðŒoï¼¹%ÑõK—¹·¹-»çsÆÇ±1Ô‚k€¶ÿUø×ßþ.𯋴¹-fcÛXEpª¦q•e<:6d<0 áÞ#ýîmî YèÖšœ’ÍscpÖ“)à“²G1®I# ¤`ãuÀõ±çˆÀMZM¾Y]YöM'×kÚÝÏ;,ã:tèB†:ñ²æVwKMV7µïØñ-/þ=bü™­Ý8âöqózÿõÇùõ¯AƒàN©o¢øoQ g®¯kÿÄWuáï·V÷Eïn,ô¸Ç}Èó?¤’äÇŽ>èù ö¯‘£áÖiˆ©jóŒ#ÕÝÉü’ßæÑX¾*Ájè§'¯K}ïþ<è[2=Úƒ}ˆg"9÷¬?ÙN¼ààœ.F2+j8Ö6PæF@d|cr ¶;dqï^·á„¾ð¤ââg½ºVܓޑ#GÈ#h( ®Ccw'šÅø¥ [ØÄðÊ ‰™RÝ3OF;‘ž™=ÈçœVœKá­:R–R¥R¼d›»^ôuM%¢ÑÙ÷µ÷ÐùjyäñŸ·´bûtg)¥Í»$ÓH‘D‡-,Œ@ÈêI÷õïùúÏ€ ŽßÁ ED¦Æ*Š,ÈÔ’Iõ$×iÞÕ>"G¶›æZi wO¨ÜÆQ'ù±ˆÇWÆÖ8ÈûÛHï–6Pé¶Vö–ÉåÛÛÆ±F™'j¨À<žzû¯8f¿e’X½*Õ|Î:>^‰iÖÚ½|ºa‰Ž"­á²‘ý”>Ò«Ëm³@Eåߘ˜-vëû¸ŽP©’§æI]ðpkê Ãð_†Ç…|;kbÌ%¹Á–æläË3rì[·<yÀé[•ú]*j”8ì¸ÃІ”hÃh«%ûXxÚO ü?ƒHµ¸òo5©ü—8clƒ2á†É1¡9Y`óŸ¿g¯‡ð°¾!Úý¦7GÓ@¼¼Ü™Gþî#•e;Ûª¶7"ɃÅdüiøŠ>%|DÔuH_v›-,xÆ`BpܪŸ™™Ÿ 27íì+ëOÙãáÑøðöØÝÁåkž//7¦×#÷q¨aµz©Î¤Áæ¹SöÕÛéÏúüưó\SÄ2©hSûœc·þ+¿ðß±êQEwŸ¶ŸÿÁS|=¨k³Æ›}goçZé:ìW²oUò£hå…[‚Ù’X× “óg $~M9äŸJþ€þ)xFø¥ð÷^ð¶¿í+SµxeuDw‡Œ¬©¹XB)ÁÃ(=«ð÷Ç?ï|=¦?ˆ|?¨ÅãO‰^?øH4«y–;r%©uŠ­m#Œ…|«y€#¾ RxUáÿ³ç–V|³ŒýÞÏ™]+íÍu+-['f|öcB|þÕ-:‰ðâõ×Àï‰+·µ—QЦ†ãOŽìÛ-Üo‚¶T9I0TŒ¢ž¸5ô_Á_ø(¤Ÿü;—ÃÖÞ5¶µ].ú[HayÛ¶E™Ë³–wrÿ9 ‘»,ß/Ý<óóþyž>•ú&oÂ9.k‹©ŽÆPæ©8Â|ÓW7QÁYI+ÅÕ©­®Ô¬ÛI%Ùƒ“äQè¿_øcîïÿÁU¼]âKeáŸXøcR—*uï é 0Ê!pÅX3n_—Nkäo‰!½×n“ýP¹p"‡*Š|¸”!;TdŒœžiž øWãF“x{Ã:¦­hgÍ{mjæÚ)>RD“cË”’샒@æ½çáÇìâ}~T¼ñ-âÚYÂÝiÚ"›ëÅùøG‘A‚0è¬DåÛ•Ìgæ ñÕ)ðÇ ·(rS’¿^iú+·;~ÖàçJŠr›±áÿ >j|c§èV"Hâ•Õï/V=ëelD“°%A  YЍË2ƒïž?ÓáøñS@ð—†Ò 6ÎÛñËt -Ã!yW%Q]Âò;·™¨ü\ðï‚ü;wá…úDº=œì‚ëZžVk«¶PSÌ$ó’¸ |É ÅbkÛaÿ‚WÕÇü$·q ûtM“ïRÑZ‰J\Ì8%\²ùKƒ’ »—k)?qvoW2š©(¸SÔSø›{·Û²WÑ]½ÏˆÏsHñjyvZiÞOÉoýzw>×ø!áˆü1à[H"– ‘Ãl󨵴Q$Qy‡BãŸ#Åz2c·…"‰(£P¨ˆ0ª: }~R{±ŠŠQ[ ¢Š‚;ëiœ$w;žŠ® 4OEPEP’ø—[¼Õ|Eyg£Ø>¹ªÄÁ!Ÿ²ÚŒ¶I7 >ü ¸Ÿ˜V®éŸåÕeŽëÅú›êÒ&vXÛ´yÈ8Ú®ü¡9î¯I†íФQ¤JYœª(³Ì~¤’O©&¤¯,ÈðLêUÃSýåFÜæõœ›ww–ö¾ÉZ+¢F’œ§dú&±àÉ4Äû>1.™[|²^Kˆq€¡:ùˆ~Sóá,ÇNðF§mÂ^£Yܳi¹n]—r°lev¬ärÄÅw5ÇøÎÿI𜋮]ëÇA*GehîÀÁ*b îr‘• ¸lq’äÕ᜺†o þ•©T7=¬£4Ó¿7gv¥Í»µï¦°•J‹ØÅ^û.¿#°¢²<+â­7Æš$:¶“3Oe1eGd(r¤ƒÁõ¯_c ƤTàîž©­S]ÑŒá*rpš³Z4÷L£u¡é××°Þ\éö·pã˸–i#k‘ƒÈÇzæ-éÞ·x¤‡ÃÖx”¬n²,ómwF'† â9' ñŸÙÛáÊøóâWWÖÂ}FÅõÚËèæpG“eJ¶÷Ád$n%ÁÈÍ}~Vá… ëOÕþŸ×™ý#¸jÅ¢Åäȯ “îûB 1ßÝàÈ É)!Pð3–Iu®à‡Â™uÝ].&§Ú¡-,È€;v=rq‰%ÛùfäüáŽß¯ll¡Ól­í-“Ë··b2NÕQ€2y<õÛÃYcÃÐXªËÞ’ÓÉÁü½N\³ìÿÚ&µ{y/ø$õåß´ö§«i‡,j¯f-àk¥Ý2È‘øí!È$r$`â½Fªêº]¶·¥Þi×±yÖw½¼ñn+¾7R¬2# žAÍ}ÌeË%.Ç¥Ž¡Í¦®| û+x:/Œ/Óu¶“ûÍíìWŒ«)À¶a”?˜ ¼mŽ#”g"¿A+‘øsð«Ã? 4ÛË i±ØEws%ÔÌ9wgv|ê@.Øú’rÌÌzêgN›’¤­»;ÃȰnœíÏ&Û¶¾Šúl¿Š*ž±«ÙxI¼Ôõ¨l¬,á{‹‹›‰8âA,ÌÌ@NIÅRM»#ëÏÿà¤_´DŸ|oà-æ­ø¢)üI?\`¶Q¤'j±B ¬¸!”ðì·§x—TøÕ¢Åá­V÷Du&£¨Y46 fl’Ž€°Â&õ+æ¼@àk?ö‚øÅ{ñÛâö¿âë—™mnfò´ûi‹³Ú'&Òìãæ`¤®÷r:×Ú¿°7Â}>Ú^»K·Ö®…î¯5½ÊH–ñÄ‚ÑÊHUdÚåÈd_µa—÷b¿¤§ \Â’„é©Vª¬ÓI®i.»ÝAwѵo´wb){Æ/s×-¿cüJðôZ¯…|;§[O!ž[Y¸…&[v†B¤…,ÊAV98Ʀ‰û ø ÃVk¦èþŽs!ºê¸€8’êI\ ò† Ôã$“ï÷šö‹áí&{«BÇOÓl`ie–IR8 ‰%‰ÎUF}à¿à ß¾}ž;}løÎòm¬`ðÉŽèF‡ÌÒ–Œ¦íÿ:¸9¯Åð5xƒ4_UÁÔ«Q_e)µ=l½YåÊTé+ÊÈöK?…ž²hn/-äÕn`ViÕ'i‰^~ò“³'/zó_þÖŸ·‰¨øcXømðÊÞ&°˜Ëc¨k) Y y‰j£†YÔÈ@¦íÁ×Á?hۯǟ`:\ð‡†âÚn™pæK€Ñ„t¸›åó™>@ª¸|0b Ž+áÁO|ZÕ"[;yl´$¥Þ·,,màÚ²)àI.q Àª×ï°|²J_^ÎÚRŽª7ºøšÑ¾É]zŸ5ŽÌ*VWÂ-úõùvõ:€?î>0x±¬ÙçƒJ³T–òh#-#夹'èªì¶íoׯx2hÂÖ4%}¥ÖÚ0‘Fª¡R(Æ8aGnpp<ëöuø-¤|=ðΛ5³Z[D¬Ö1>c^âfÀó$p:ãnÝ ¡7¾<üyÐ~xHêz› ­Nà2iÚTo‰.¤ÿEÈ,øã ’üÇ5ÌcˆrŠ÷VËõþ¶;p8JYNU+4žò§õ»;½ÄZ_…t¹u=gP¶ÒôøŠ‰.®åÆ¥ˆU’ã_üQý¶õmjþãOðßeµŒIvW,_î #©®šþñ4û9®îƹǩì?:ñ~åï/%šB ÈwÌ×â'UáÌ:)[Uèô|±[Ë].ÛI]wkT{¹v8š·ŸÂ-/âN©¾'¼œÍgå»K ÆÕ\’£ŽxõÇ5ì•áðÿü$Õ­ƒ Å7ïîyénŒ2:¾áW äc<ƒ^ï^ϬÆy$19W9Õnk™¶Ô]¬½¹’Z%!fn·ä£(«;wþ´ùµ½^ß@Ò/5+¶ÙmkM#`œ3ØúWÁ;ñ]÷|Cs«_ÊòI3ˆí»Ê?*À€g“Ô×Ó´×Εá¥Ðm&Ûu{†Ÿc`¬@Ž#qãFkå‹]:]_Pµ´‰‘VÁ’BBF½YØŒáTÄöžÕòq™ËŒ§–PwPÕ¥ÖOeò_™ú_`cB„ñõV¯DûEnþoò>‡ý”ŒÖ63Ç3´P\ ›ÅRÿ+ 0FóŽ%àŽxÁÉèþ,~Õžøf'³‚s¯ëi¹E•‹±¸Þ1$  2Ãp;M|×ñâËZéW~ð»Íi¢H©÷%‚½ÔHа1fgîää…©ñXô OÄZ“Ûi:mÞ§pªdhlài\.@,BŒã$ ûZõéñÔ°ô²ì¿ßqŠN[«õå]Uöžç«„áæXŠ™žlù!&چϗ§3éuºZù§¢ôo~Ø|cywöMPxM²Óã\ªØÌŒ oÚÀn]¿t®/Ãß¼yá][ípø–ÿPF_.k=Rf»·ž2À²:HHÃ`F ó“•â‡>#ð~i}¬i’YÛ\¨ÅÑŠ1 "©&6Æ~Wü­ÇÊk•Ÿýgùÿ?çóš8¬o¶½yÉKÎëðè~³ÊrJ˜nL-r¦ôÑFIÛM^·kÍÜýVøñ,|Wøi¢x‚EX¯î j…T(«2;*îbº>Üž@úÕ_Ž_´?¾mKQ"ëRœ°Óñ%̃óÚƒ#scŒ€$Å~ÇZtº?Ã[9™U°¶œ˜É+¶y'¸NOp“(>àòG'âŸÚoUñµñ›Ä—^"µ¹³”\¼6q\G"/Ùc‘££Ÿ‘¶–Êü¥‹×úo¶”(ÁËâi~Gà9 á3®!Äa\­Bœ¤ìž²Š•’_-ßnÍÝz‡ü'â$wÖïw¥è7«"™¡ŠÞXÝÓ#r†2¤Œ€pqèzWMªÿÁHµO°Î–ž´·»xØC4º‹H‘¾>V(#€8$dgȯŽW¨¨¯?‡ñþ•߃ýäÒ–§ï¸'‡ª5'…Zvr_‚i?™±«Ýøƒ[¾Õ/åóﯧ{›‰v…ß#±fl(d’p8¯føûGxwà7…"0x~ãÄ>$“Q{»„™c¶·Ù儈yÀÈòÁu 3àñ—ðÑþ²³.:Ÿsýùÿ9¯¼ÃP§ˆ³¨´:s<³ ™aþ©ˆîî´NËM–=-±öéÿ‚¤^øWàå¿øÅ}!û3~ÔZGí¢^È–GC×,$Xîtç”ȸ}æ6ŽM 8+q€À«q€¿!ß5ú=û |›Âz]j¶²[j“ÊšŽ¡ «ÂWrÚ@Ë¿†Pd”œ †7JY¶_€Âa9áMµm_Ïwµ¿ˆñ^G“åX:ä¨ÚQ÷¤ïÞé·¥º÷·sìº(¢¾üp(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠF`ŠYˆU$“€r7ß´›k¨â„½Ú‡š?º£ŽFzõý+'ãˆËO¶Ó"Ü­twHúÓƒÜöÁ¯3´û«_†qÇbrWö~]¹Å')Jî×ÕE+®–më£ÒÏSépTkÐúÅW£Ù/Ì÷;/h÷Ño[¯/œ‘H'§?­jÿiÙÿÏÜ÷ðx†›ÎÓ× óëÒµ›§~£§Ö¾‡ªK—‚ŒßxÍÅ}Î3üÌ1liÊБ鷞)Ò4ù.5#b7[<~ç~5øÓvOk¡¬†æEÇÚd\úçõ=1Ûšâu©õ?Ò¹««yn®ÄPÆóJÙÄq©bzžÿ?ζÆxšfqt0t•.m.›”µÓG¢¿Ÿ-ûXñkCÙÇFr~%Ô.5[énîæk‹™X»Èü’r)¾ðDþ#Ôm [=È™¶ÛY!Ã]0<’xÛÁÜÙa™z­ À’x“Z†Ê6Kë²Kh[tH¹i¥ ¼ƒò'îåXŠú+áÿÃø<hÓLÉu¬\(ܪáUF1cj €p8>Ó…8OR_]Í¢ÒÝF_Ÿyu^V÷Ó'ꪤùªlZð/„WÂZAIŒSê—.f½ºqæÈI?ÎAÔàk¤¢ŠýÄô‚Š( Š( ¾ ÿ‚¤|nþÉðÖ“ðÃN—¦ÍKTùz[£þå>dÇÍ"ʸ#ÉÁ=}Ãâ¿Xx3Ã:®¿ªÍö}7Lµ’òæ]¬Û#E,Ç <Ðí_…?~#ßü\øâjC˺ծšaTù1€(òª¡¶F¨»° mÉäšý;€²¯æKQ{”uõ—Ùû¾/&—sÙËpÞÖn¬¶çÓüÎ*/½ý*9:×Ôý„šú­Fc© ’÷]Ï’›îŸ×§ùÿ<ϦX]j×ÖÖ66Ó^ÞÜÈÁmn†I%‘ˆ Š£%˜’’M}±á?ø&µô"Öojº½Óÿi±Ð´§Dn¡<»©†ºÇtÞQýúú»àÏì¥ü>Ò¶hºdÃåÉ{2ý£RºS>l„‚¶‚Ñ©D ¹®kÍÍ|PɰÜpW¯?$㜚ü“O¹ò5pS­;·d|Eð;ö0Öõ=ONÔüwl,t㵓Ãé!7×lB”I©RI ¥„À¡]ˆX:þü/ø§øcJ°†òÂ+K#³Ñ­È0Ä€“óœä±,y%‰%Ëjôx;Ið¬!tûEIJí{‡ù¥~™ËÇh8íWµ}ZÏAÒ¯5-Bæ+;Hšyî'"FŠ2ÌÌÄIÅ6çÜG˜qkŠztŠ¿*ùu~oS¾†–{‹^ýNcâ×Åüð]߈üEx-íãù …@inf íŠ5ÈÜÇ  $HüñÿĽâß‹®¼KâKÃw¨\œ*¨ÄPF3¶(ר¹8RI$“wãçÇmkãçĽkP¹—û& ^-&Á—bÚÛîùr˜yŒ—lœž3´(§ì¹ð^‰^#‡UžØÜéšuÔk›C¹oçåü£¸l1¨¥êB²ŒûÔ­—ÿgaùªüo//ó??ÌñUsœDp˜uîßO?7äºÁ:__³V©ãiôÍ[U¶vÓ¥Q4:\[ÅÅÒ»ÈEnÎâÁˆÆWYßþ ø?¥xrÊï µ»h²a´†ŠÒßpùÂD0§,I$“ƒ€rOEàï Áá])b=ôÀ=ÝÁmÍ,þbÀ$ãüI'z¾J0Œ]ÒÔû\»+¡–Ó䤮Þï«ÿäU—K²žÞ$´‚H *b‰¢R±•R£1Ò¾-ø“¤C¡üMñ5¤ ïºós!åÔ9èc¾׹›ìÖÒËÞZÆqœ ×À’j_Û:Ö©¨y^OÚî^ãËÝ»fæ-Œàgë_™ñíH,:m{Ͷ½×óEcä½Èõ¹Þø<±Ô%û»mUúa™×€}Jïü7vÍ}u¦ØÇ¥éÖ¶Qh­¢HP¹Ë œwâ¾jøM É«K¤@°‰R{µ¸&\§‘㼋π8æ¾’Õõ¥i—7eKyH[g'µz\‡X Ž*éÍÍ7èÞŸù*LvŽGÆÚ°¹»q¾c‡ïàõoN½‡õ®PA$øfÚw;uÚ£$œgœMkGp÷eæ‘‹Èí¹‰=Èÿ?çšn— 7Šuèôñhг߱ƒ`V Aᘂ{ ƒÔæ\-:þ"ñ„êJþÅ;¿îÒ‹I/'/ý*MŸUFªÁPr[ôõ;O†:)²Ñ_R™6\êefÛœì„ D™ ÎpÍÏJ꯯aÓl纸‘b‚.îÄ§Šž¼‡öƒñÓtXtKi6ÏxwNU°V1Û†Ï'ÔFkúû4ÇÑɰ1RIF E¶»E/‘äàðÓÆâ#F;ÉÿóÀ>%øšokšŽ§1lJÀDŒOÉ?(Á's€q’kÏ®ÿƒñ®ŸXÿy>ƒùбàïoËåÌm5 ˜Ã´Y/s/ÊvqÈQ¹sŽN@^¥—ùs/£‹Ï1¼°÷ªTm·ë«o²_ðûýërH¯ÌßÜÚÞj·w6ÙÖRÍ$Yù¦_"2ÙX÷ž[hÀÜy8¯¹à Ÿ³ô}3áý”˜šÿmþ¡ÇHU¿tœ¦>gRÙVyX# _xÂ_ðxóBÐØIö{«ö¦…•]-×ç™Ô°#+»q€ 8:aÚUW—ùÓ¼G‚Ê*æ™…Y8Êí)I´£åfíwg¯dµ³>¤ý–?eíÄ^²Õ5½2ÎãWší´ÞÅö”‚)”"òLžT›£ .æRWÌ€È {µßìá;ëi­çÓ|:ÑLŒ’y~·‰È#…]O?yHaÔy¯Jø[¡&…àÛ5DŽºå`€mŠ*¢8Ñp6ª¢ ÛÛbºÚÑרå̤×Ìü 1Ïqù†.x©V’»m.gd¯¢Zè‘áž ý‘üà+ÈçÑ­lôæGiÅ­¡kÅfM§eÌÏ$ˆતãæ$ûáû/ é‘XØÅ圖<´Ý˜÷'üÀV•œêN«æ›mùêxµ«ÖÄÏÚW›”»¶ÛûØQE™€QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE‰âoéþ*·T¼Œ‰cË™8eÈýG|{WšMðëZ²˜FºkΛC -.£•IçƒæyD€zs×­{5òù§ dÙÔœñøhÎO®©éçŸã¶›´±¸Šä§6—n‡ˆZé÷–òȒ隤OØI§ÊÛˆ=AŒ:‘ïžRû‹»¨¥d]^œ ~ò-:M§¿°1^ÙE|‚ð»…½«©,;iôç—¥š{eO^¥¹ŸàþÁ¯jwK§„µ4“åÉ|(ˆõlª…àtßמý•Á9¯¡+¬ê¾D.¤5–’›vì‚d|—g 8'ƒÏ«Q_o—pþU”¾l0—t½ïü Ýþ'“–ìÇðç„´ A4ZM’Z,ÌB˜–bN8ÀÉõ5±Eô…Q@Q@U-kWµÐ4‹ÝNúâK+8^y§¸Gh ’ÌÇ…IéM&ÝÒ¾ˆøsþ }ñ³û+ÃÚOÃ>OôSn¥ª|½-ÑÿrŸ2cæ‘KeXäàŒ=|qû1üOŒ BÒk¯i©ö‹ä„º›†?,6êÊÍ#J‚¬cIJÊ+•ø·ñÿâßÄx¿R]—Z­ÓL"ÊŸ&0ÇUT6ÄT]ØíÉäšý%ý„þÿÂà»;FÓÊÔäÛ¨êlXqrëû˜rûˆÈ%˜æ’L5~óˆ­þ¨ðò¡IÚµM.·ækÞöêÑ?CíñQYV4—Æÿ7¿Ý·Ü}Aàß·†tU·šEšòYâæT+ÊÝH€: ã8­Ê(¯ÁO‡ (¢€ øþ MûA¶q|'ÒÌžC î³:ðs¸¼]âkx[W×µ9Ŷ¦ZKyq1Fp‘¢–cµAc€:šü2ñ·5Oˆ¾0Ö£+Z1Y±…‘ä*w ë,Å#ÜTÀØ'.è¥y_Úý{h|+O’ëýyÿðWé§hò^®×…”ZÚ¹A¹£Bw¸9È!c´ôÚ:ŒRüSñ'µÒ"=H–oý”tüx5ÛÜÏiá ŸU•ŒUå°ª0rzZùÿûV]oT’þõ“ÊÎGz1Ð`Sñ8†M“,³ îʪåIt¦–¿~‘óMö>¶ŒW2]Žš+ˆí,y˜ˆ¢]ÍÐ`p3Üô2HõÍzÃí M#CûEÚmÔoÛí7ÏÜ ¸NpKW á½'þ=nÊÁ{+p·w™)ý\G‚>cÉRTdö*¿ ¸wû(úÝhÚ®"Ò~Qû î÷¾vèm‰©Ï+-‘ åÜV²ÜÎá"‰K³ú×É_õÙ|I®O)?½o‘N~TÀê{}zž™çؾ0x¥•thL+‡œ€[< öÇá^'y§K©\$QaF7<¢Œå˜ú S’ä€ß'Çyäó\Â& 9*o[}©½Kû»z¶­¥ßÝðî8jRÆÖvºû—ŸåêbéÚ×n]ggŽÊ iSîU?ÄÄ`pqË`…5õÆðøRÚ»¸b€dPÇÌv‰ýÅë–9;›$’O'$¶/Â_[Çkm«][ºÇ Œ¨ð3pFOÌÄdg €¤zµ~¯ÂÜ; ‡ ûÍkKâ}¿º¼—âõì—Îg9¼ó:¼±Òœv_«ó‚ùܯý«þ+µøgqoeqäëšÆlív>Ù#R?y(Ã+ «Àaœ3&G5íUùÉûYxþ_|[Ô!KŸ;MÒI±µEª ãÍ;Xýíù€½q“éçØÿ¨àÛ‹÷¥î¯žï俟e+6Í!Šð‡½/;l¾nß+ž-¢é—:Þ§g§YGç^^L–ðE¸.÷v «’@$rx¯Ñ/ÙŸÀ0øCM•,¥ól,ÑíEÁŒ#]Ìî$’VpA;v)c³'ä¿ÙáåÇŠÿÝ9&\•;‘ŒMÒ¿E<;¢EáÍÏM„îKtÚ_‘½,Ø$ã$“Œñšòøcìè¼TÖ²ÑzÁ‘ö>#ç.¾&]){°Ö_â{/’üü´Ò¬ßx‚ÏžÔµFO&ÇO·{™äÚ͵K…ž`MiWÊÿ·‡ÅßøF<oàÍ:çf§­ü÷~T˜h­ŒƒµcapT«(WÚNJ»?2ɲʙÆaKOí½|–íü•φ¾#xæ÷âWŽõ¯_—•Á›ËùO–œ,iªÔ ¹ÀÎ2y5ôìOðÌê·W:µí³õÑI‡ÉµˆïŸ#±äXP8$†Ç!¾WÑ´›­wW±Ó,bóïogKx"Ü|ŽÁTdà ’9$ ýLýœümà¯[ÅlV[X¢vÓÃHªÌe”d–Q$¬í°ýÜ2Æ4nÓgôˆ™,¯(§•a½×RÉ%ҷݯ*óW=jŠ(®“ùˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šø£Ä_ <ã_ï¼Mák÷ñøŠÎ¹Õ´È.eXƇ¥°@Ò)!Af8é–>¦¤ÿ…ð—þ‰¯‚¿ðAgÿÆë™ø‰ñw¾ý¡~1éúçŠ4}îM~Êá-õ ø ‘èšb† î \« ãÒ³Çí)ððcþ.†8ÿ¨Å¿ÿ¯*¬¤¦ísîpTiK'ÛÈí$øð‘TðÓÁ‡ŸáÐ-?øÝGÿ áý/ÿá?iÿÆëЏý¥>_ø¯ü2Ø=?µíÏþÎj°ý¥~ Åyáž?ê+ÿXóK­ÏAa©5¼¾ÿ… ðþ‰—ƒÿðŸ´ÿãt†øGÿDËÁÿøOÚñºàGí+ððcþ+Ï ñÿQX?øªí+ððcþ+Ï ñÿQX?øª9¥æ?ªÒïÀï¿áC|#ÿ¢eàÿü'í?øÝFßþ)#þ—ƒ¸äÿÄ‚Óür¸QûJü<ÿŠóÃ<ÔVþ*«ËûJ|?ó8ñχõ¼íÿM')yah÷àzü(Ï„_ôL¼ëÿ ?þ"øQŸ¿è™x?×þ@üEyÐý¥<ÇüW÷·öÿ¦”ÚSÀÅqááÿq‹oúiKš^e}Rxþ¢ÿÂŒøEÿDËÁþ¿ò³ÿâ(ÿ…ð‹þ‰—ƒýägÿÄWÚSÀÅqááÿq‹oúi@ý¥<ÇüW÷·öÿ¦”sKÌ>©G¼½ÿ…#ðŸ¿ÃúŸø§í}¿éð¤~÷øaàßSÿý¯·ý3¯3´Ÿ€øÿŠÛÃÃþâÐ{{Ð?i?ñÿ·‡‡ýÅ ö÷£ž]Ÿâ_Ôèwàzgü)„ýþx7ÔÿÅ?kíÿLèÿ…#ðŸ¿ÃúŸø§í}¿éy˜ý¤üÇüVÞ÷ƒÛÞûIøø­¼NyWO´¡®BøçájbÓü[¢]N!šå’ øæuŠšY¤ØŒÌÁcÜ…áN<˜¾1üA‰¾;Ôu…óWN[iÐNpÑZ§‚»˜+°Ë¾Ó´Èò÷«ô. Ë%ǬEUîR×Ö]ëÿuárê3ªšI¨ë¥¾_Ž¿#wö_ø`Ÿ>&Cu¨[,þЀ¿¾Y£ÝÌîmÛr²°wÁdln‰&Áȯ³•í´gŒôßü>ð5þ•©[j–ñêš¼ 5­ÂÌ¡„:q*YIÃq^)Jþ¤àì2¡ÃTj­ê9ÉúÝÇòŠìóòÎ%âŒ.*_ÙÙ:RRÒRK(þ¯îîzÃO Ëâ]QC‡M6 yp‡ãåRr °(ÁèIùCè>7¶ð׋bK×ôm+Y°´d1Yêv©sL‰±Y3Ê©*äàžNyà¼wñŸÁÿ!OÛxLµÔ ýýÛ^_ÅÊò*üÌ…‰FeT!…6ýâK;Át?ˆ~3Óü?¤ø—Kžæé˜‘mwΑ"%"¸-²4wÚ9;p9¬0xHå”Ú¾'ÛÊý—Sî8S‡©á0UÕõkE×úùö=×¼àˆRçþдJþÍq¥é°ÛJm˱–E µ™D…NA&í^‰ ¨>VæØ‹¹€ÎÕ’qß\„7ÃR¾šåcG)Ê@DIü(:p£qЕOâ߼/á/ÃÁ{ªj6ºd—’¢’îU‰K°ce¸ÎäÚx!¿xYñ¯ËÚ7ìc«ò§‹³–ÞNMØñéT–;Ý5g7§e}¾î¦oÄ{/ |AÕÃø“ÃÚ6»ö6e·]Zʯ³ƒ´_1N8T×hÍexOàwÂÝ{WHGß¼0©žaý‡kÊ q÷só«Æq»5àŸðÐ^ÿ¡³EÿÁ„ü]}Uû?][k? ×­.í¯áÖ'’X®mfó≚ 3’2$Yºg¨ÎHÀý›ˆ³·‘åU±”ÕœU¢º]ÙGM¬¯v»&~›_/Ãá0ñ„Z“Ñt¿›üþgkªHÓNÒ9˱,N;’+ž×µX¼7¤¦÷ uyµŠ‘ÈŒ”zóÄõfºI`ûMÒ!m‰‚ÎøÎÕ,Øï€ ÷¯“>4þÑž¹ñÕöž¾"ÒmcÒäk3—ІŽDù]Hl0+´!Ï÷3Þ¿"ð×.•jµszɾOv/{Î[¿UÿÄAb¥Ot£ñJí/ul¾nÚvLêÃ/…Ãño<#Ç?ò¶öÿ¦T†_ †?âÞxGŽämíÿL«Æ¿á|x_þ†ÿàÿ?á|x_þ†ÿàÿýÿÛϳüOkû/ üÐûâ{l>øyáKYð„[Ž^YtkQHZG;~TU˜ö Mxߌ5M;TÖgþÄӠѼ?oû3M¶`ŽÞÜ1*k•VbZGÛÁ’I7=&Ÿãë]Gᦫ«iš”©] í§óFÅA%ÞÖSò¸j‡' — 6NÞÒÎ}Bâ$¹¹Ö(¡‰ ¼ŽÄUP2I$\÷ïq«)Ê1gè|-”к˜ä—ò¦­ko']<œYëÿ³—‡"Òíõß."²W°±<Ìè­ÁÏÈ©†RÚ2R®ê ø}¬j7÷þðÕåíÔ­=ÅÍÆ‘nòK#ÌìÆ"I$’IäœÖÇŠ~øks¦|7·×ôèÓÃÐ"Üù·(Œó0._k¶Ww˜Òà1˜Šòßø]þÿ¡‹JÿÀÈøº×^P—³‚z~gÆVT³ìMLμãiéÚº¦¾ÎZͯïyÒ>|3ãþ-ç…GýÁ-¸éÿLª)þ|4XIÿ…{áEéÉÑm¸éÿLÇó¯ÿ…ßá¯ú´¯ü ‡ÿ‹¨çøßá±cÄZ^}¯"ÏèÆ¹>±S³%e+üPûÑëŸð‚|4ÿ¡ Â_ø&¶ÿâhÿ„á§ý^ÿÁ5·ÿ^3ÿ ÃÃÃ?ñPéÜÓôtÂðððÏüT:wôýOÖjögGö> ù¡÷£Ù¿áøiÿB„¿ðMmÿÄÑÿ'ÃOú¼%ÿ‚koþ&¼gþ‡‡†â¡Ó¸ÿ§èèÿ…áááŸø¨tî?éú:>³W³ì|óCïG°\øá²íÛà? ÿwE¶>ŸìƒþŸ‡ô"x[ÿ–ßüj¼zëãf€åqâ 4ã¯úlgÓý¡þX?áth_ôÓð2?þ/üâ¥âkv‰´r|µœ>øžÑÿOÃú<-ÿ‚Koþ5Gü!??èDð·þ -¿øÕx¿ü. þƒÚoþGÿÅÿœQÿ £Bÿ ö›ÿ‘ÿñç¾³[³üJþÇÀ<>øžÑÿOÃú<-ÿ‚Koþ5T$ðWÑ#Å ážýí¿øšòoø]ý´ßü ÿ‹ÿ8ªR|eÑ<Æÿ‰î›ŒŸùzÿ¯þ}{§‰­Ùþ&ɲ÷öá÷ÄöAே#ñBxkú„[ñ4|9ÿŠÃ\Ô"Ûÿ‰¯tN3®éÞÿéQÐ>2èœg]Ó½ÿÒ£©úÍnÏñ5þÅËÿš|Of ør1ÿ'†¸ÿ¨E·ÿ@ðWÑø¡<5ÇýB-¿øšñ‘ñ—Dã:îïþ•ã.‰ÆuÝ;ßý*:>³[³üCû/þh}ñ=˜x+áÈÇüPžãþ¡ßüMÁ_F?â„ð×õ¶ÿâkÆGÆ]Œëºw¿úTtŒº'×tïô¨èúÍnÏñì\¿ù¡÷Äý}ý”äÖþÿØ›£é 5ê•å²üšßÁßûtoý!†½R¾Øþd (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>0ÿ‚›xëWÑ~è^²µ”iZÕÙ{ûåPc,Cýš~ê~;ñŽ‘­êš4ÏáKiEµÄ9R•Y„pF¬¤L¦U@8 Kd úë⯠é>6Ðn´mnÂÛRÓ®@[ÝÀ“! ‚­µÁRCFAä Íðïý/Ú”š‚Is}z˵g½HÈ1ƒ·rGëŽ2sõøN –.x,=;MÞò¿~¶ïm7ÒÈú¬6zðysÁP§i;ÞWïÖÝí§ÉІ´+{2D—ó.%ÎL’·,ÄàÏžplQE|ò¡EPEP¿ðUŸ Z\øÁ>%i&Özœštq†QŽhŒŽHÆwn˜9Æ pxÇçD}+÷OâÇÂýã/Ãý_ YŽ™¨ÆžÞB’FêÁ’E=2¬ªÀAÆ#"¿7þ#ÿÁ:|eà¹gm']Óõ»8mÄžmÌÚ4²â5 IÉÚ¡¤‘9<€¸cû/ ñŽV²üUNYA»_fž»ìµoGòòùÛZ­_kJ7Lùš×¨úóþý{V}ñþµê^ýüy{æIô}fÝŸm¿ù½s·ìÂlc½·;†3Î=³á§ìgaAs© ïË•ŒÛÛ@öÖ))RZ@ÛÝrÀ«f6‚À‚T|ÎwŽÃTmS𗦧É,—Šv;.ïOø?â_ ~ë_n#¸·Ag¢Ã(ŽçS”±¹*‰e|cå^…ÓqUmÕ÷oÁ?€¶:eŠEÅŽ„LítÀÜß¶2»œ*ål·ægjô/ ü¶ÓM¤º¼ÑÝ}•U °·@¶Ñ"ä*”nÁéµùÌhÁKžÚŸs•d´2Å̽é÷ÿ.ߟä2c·…"‰(£P¨ˆ0ª: ð¯ÚcÆÂ-<1nß< \ÝqÑù+Ü‚rðóֽ⼻â×Áë\G«Û¬ï©Æ&Ž9U<ÈÁè7 2yÈûÄüØ |lÿ ‹ÆeÕpø+sÉ[¶WÍi¯KžÝhÎPjžák_¶Ï ;ö)MÎøÎÔ,ØÏ8œ“ô×Âýû?D“R’?.ãTa>ÌäGü²AƒŒ9½Œq\o„> KnÐ B$²Óñ™­ÄæK™°~Tw(^ÿ&8Æyä{-x#ÃrÈ(ÔvZ^Û$¶^º¶ßË[]Õ(8E&Eur–vòM!Â"–<ׇx‚å¯/f™Îæî$àg“é^Ÿã¥ì`XÑš Ťڹ =ºšò½d¥¸ónC\‚ßy¿Ýù#Û‘’~Mâ}lÏ6ÌðÙ 9E.{¤í)==-{ɽ.ïd®þ›*tésU›Hw†´4×µ›K Œw/¾mªOîæ`Ø#hf¡½Aç±÷šâþø^M*ÎMNö'†þðamäQ›hA%c®NC6q“ŒŒ‚Oi_¹ðæM‡*£—§wï5ÖOVý.쯭¬y8ªïZUËÐ*†½«Á h·Ú•Ì‚+{H^gr¥€g äþ~¼Gö©ñ”šƒ­´kiü«RB$Q¼1yl0Àä•äÅzy–69v®*_e_çÑ|Ý‘¶]ƒ–?O ´íòêþJìøÏÇZå߉ÐSþärñ½+ÂóøÃÅ‘éñIäF#2ÏpT¸†5$Œõ<(¨,Ê23šû«àß…¢ÒtOí³ýœÜ¢Ekd˜mPrFys“¸=kòþ ÀTÄ×–c[T¶}ä÷$þö»²q¶k &_O*¡£šM®Ñ[/›_r}ÏC¦K"ÃÈ瀱>€SëÂlO‰¶ÞøG¦)ŠMSÄ Ú|> °Ä²Ü’@fLŒýrµXѧ*’Ùeø*™–.–Å6—ù¿’ÕŸ þÐÿâçÅ]W\÷iÈE¦ŸÒÝ Ú~Ꟙ–˜doÇa]çì¹ðÊòöí|Kä4×7[-.Ü+$€²Ï“€Si’0y2TÆ3ã> ðœþ9ñ†™¢A'’nŸO€ÞLJ¥å“ÛQY¶ç'‘ŸÒ_€>·Ð´‹[Ø­Ökqg§FJ– ¹HØP³K nf‘óWÏå°•yºóþ™ýÇ9¥,‡)¥‘à]œ¢—š¦´wó“Òý}ãÖ4í:ÛI±†Îη¶…v¤iÐê{’y'š³EôÇó`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÉ¡ŽâŠTYb‘Jº8ʰ<Aê+Mð&ƒ¤ÜµÅ¾›¸gy³–™ÃÀ¹$œäJÞ¢€ (¢€ óߊ¿tÿŠFÊk»»›y죑bH]U\¶•b9QȯC^…EsbpÔq” ñæ‹Ý?'ÌèÃâ*á*ªÔ%Ë%³_wäy7„>Yi$ÿhGh– Ÿô-<8uÚÒJq#`³àqž ZõhaŽÞŠ$X¢B¢ ¨è)ôV´éS£N”Tb¶IY/‘J³­7R¤œ¤÷mÝ¿˜W”ü|ø £|kÒlšø]GL.ÖÍip°³«c|d²²óµNJç*@&½ZŠ*SX¸M]3|..¾´qi¸Î;5ºéùh|×ð¯öV¶ð}ÅØK{.)¶‰®®î"¹º™ÊV@ª‰Æîœ¶Òwavýgi…¤°'—±Æ™'j€2yè*j(…8Ò,ñxÌF>³Äb¦ç7»z°¢Š+CŒ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙkit/sample/mgp2.jpg010064400237450000000000000520360676156117100140160ustar nishidawheelÿØÿàJFIFÿÛC     ÿÛC   ÿÀ·Â"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýS¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢˜&Œ«0u*¹ sÀÇ\Õ]3XµÕÅÁµ“ÌIå9ÚFb¿~¼:ÖJµ7%%v®•ú-ôÕ}ã³Ü»EV¢ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<ûƳ­¶ªëk;+K¡ã>þøÇù5sÀw¶–1Ü[Ë7•qy8•Q´6#0§¿ÜþRÞü:†çT»Ôµ5–`Ûmdhü…'§p{–Ϲ¬ÏxDÕ´ïíWCµ½Ô侞Xî5X¤–%IJE±ˆ%T$hWŸzüs&áœÛ/âœFg:‘©¾X¦Ö²»Ž­8»Úm­oNÝÓ« QPêC¢Šo˜¥önñ¹æ¿bm-ÎÔQE0 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¯Œ¿kßÚžëN¾¸ðGƒ/ͼ±|º–©k!­Ÿõ°û¤cæ#×s\¸œD0´ÝIžþI’â³ìZÂaV»¶öŠîÿ­YõöŸ¯éš­Í͵–¡kwqjÛ'Š •Ú#€pÀŽ£­_¯Î¿Øi5&ø·-Ť¬±˜<«ßuÃäë¶7#é_¢•– ñt}«µ:x“&ŽC˜KœöIÞÖÝ^Ö×ó (¯øóñšo ÝCáíëÊÔ™•®çA“ œ€öcÁ>ƒÒ±Ìó*NX¼CÑtêßeçÿxø lƺÃÐZ¿¹.ìöÅž6•¢YÊ£,†áõ%|›ð‹R¾‡ÇuÚM,¬ó¤3f;ÕØ&<àóýÜö¯¬«ÍáÜéçø'Œö^Ís4•ï{[[Ùz|ŽŒÓ/þͯì9ù´Ok|‚Š(¯§4ý¯~3XxÛĶZn³iŸgªÞZÛ¡Óbb±Ç;¢Œì9áG9¬ÛÛãŒÛ·köiŽŸñ+ƒŸÍEyR̨FN.úysGƒs:ô£Z<¼²I¯{£Ôý0¢¿5ᮾ7ÐÅgÿ‚»oð£þëãwý Vø+¶ÿ _Úx?¸ÓýJÍ;Ãÿ?J¨¯ÍëoÚ«ã¥Ô{ÓÄ¥sŽ4ˆOòSV­¿iÏŽrÊÞ&´·Ayg},GŒ³“œN;ã©f4×ûˆ|™­/ü þõWíKñîƒ> h,ä âmQ+ÔŒÂ:˜dƒß†¿3'¸šîi'ÚY¥bï#œ³±9$žä“šßø—ñ#Uø¯ã;ßêò™n%T‰l`pRq–8²ü;¤>¿­éúd,KÉã€3œ,Àdœœçáf•%Z\«äFð¯Ò᜵º¿Å’æ›íe·¤v}»û|=m'OM^Xþy!7M!CÖ@j ô-ÿmc“õÅ~wê¿þ#x U¸Ò|}m¦hc}>9˜•P¿yàÀÇN´–´—Ç{Û¨âoØÁ9’i4¨BDݎΚõéâðøJj޾î›}çóþa‘æyÞ&¦fÜmUó+½löV·Ed}»ñ_âE§Ã? I¨JCÞÌLVvçŸ2\gŸaÔŸñ¯‰¿´.5mGí—r´÷3˾IòÄžµ™âŸˆúÏÄ¿[ßkxööâÞ&1¬YQÕŠ/Ê IÇ®; ½£Â×7V‘& É*¢äã’Øø/gSÎ1^Ηðãð®íõùôòùŸ{“d+#ÂÞ·ñf¯/-ôùuóùÿû=è¯-Ã&è-ÏœO</>¥Ÿ=þ鯤ëóÿPø­ñ Á¾"¿±ðn«m¦i+¶0òÙE1¨9bX9-ǹõ¤?´'ÆàÿÂYdqÐeAÏþ9_²d4hä¹u,¿4W½þ'«ù]Ùycò\vgˆ–.¼²³W’½º_³¶èý¢¿?Ïíñ¸6?á-±úÿeAÿÄSâøùñÊeܾ+²#8ÿLüE}רùýÇœø_µ|¿ø>ý¢¾ÿ…ïñÓþ†«/üÃÿÄQÿ ßã§ý V_ø)‡ÿˆ£ëÔ¼þâÕœwxÿàHûêŠø:?Žš5/ã+UcÔ ãOÿ…ßñ£þ‡KoüÁþþ»KÌŸõoýß¼û~}"3!šÙÚÎsÕâèßï/Cüê!ªËc…ÔaòÆ?ãæ/š#õî¿õñ2|pøÏ¹wxÎÜ®yD€}qZ_ðº>.çð“ŸüÚÿñºñ%‡£NN®n”ž­%xIÿzkÝÅÆO«cy5i>WÿoejΟcŠéHe†D˜2ÿw8'?B Âñ—„õ]Åö^ÛM¶HÎZ[Cq&üº7ªŒç ž{b¾O¾+4B)ºÔÄ~lrK±mj©L„™mdä#*íe-À°ä­7JøuñâÔw÷2É.¡E `mÚf>lŒTä4˜(>Uó2Nð‰ñ]x{ÃÉ¥_Am®¢‹{†–Ú9šC!˜$€ãŃc??_š±4ŸˆôKW·´ñQHži'!´ûvùË·,‡Œ“Ðò<+‚Êêæ‰ð}´„©¸%uu>W8è­Ï«¤´ÖÛ˜a0˜¬vñk~ö¶‰Ûñ>Öh>ËcåYÇ"$ apŠáp:ÜW¨xÞöò8¡ÓÒ;­è®Ÿäº‡ç¢–a‘ÉWÏZwÆ/Š amw©[j­:¨I'³HÌÎvˆög>ùéõÌúŸ¼CwàCm µ‰e™bk«X°‚0K串T?_BqéqÏ«cp³Éê(ÒæJ¢wÕ'Ì’NÊÖ•¦œ¯f¬®n²Šô•ªE;ìÓ]tþ´²>¸VWPÊC)ƒK_xoÄß|%fÖºoŠ.Rlí¸†;Œc(b:ö­Øþ%ü^dËx¼)ôþ̵?û%~‚±P¶¿‘#Å.±ûϱ¨¯?ád|\ÿ¡Äà²×ÿˆ£þGÅÎ?â±ÿÔ2Óÿˆ§õªdÿbb»¯¼ûŠùþÅ¿úcÿÁe¯ÿGü,?‹ô:Çÿ‚Ë_þ7OëTÃûÝ}ç×õíȳ³žàÂ$gÀïšù&/ˆ?žUÆŠA<…Ó-sÿ¢ë²ð†µñöü¾½âîtsâ{ x–RWn©îÊsǦkÊÍsJx,|O5œ!&ŸšM¯Ä‰å5é.iµoSè{y–æåC”u ±©+Åï/õ÷‰§x¢ïFµ…J½µ½¼¾aÎCo•ޏÆ1À¨üeñO^†ÚK"U‹PÙ†¸+ˆr¼AnÓ¸çåx޲ìö4háù¥YÅJiEÚkÍ'e¾Š×oM?©TsPSÛ(¯’îü{ñRÞÒiGŒ$Ê#0ΙlG?󯾖ð±sâøsU¼*×wÚmµÔŻĬ؆I¯Ñ)Õ[ò‹‚«ƒåökØÞ¢Š+c€(¢Š(¦É"D…‚(êÌpbj3Ólƒ—í2‹#óé^6eœåÙ=?k˜W5ýæ“~‹wòL¸ÂSvй»EpãÇz†£©Åa¦iÑKtëæ–RGŸ¾ìÚ;t$žñÙÛ …¼bá‘çÚ7´jUIï€I ~5¦[™PͰ놿³{6œn»¤ìíÙ´¯ºÐ%fKE#0E,Ä*’OAU%ÕìaÇ™yg¦d×_‡Â®jõ#æÒüÉI½‘rŠÉÿ„¯IÿŸÔüøTQxÃMŠÆòÈ@Î?Ò¼qNE¢ñÔ®öµH¿Éš{*ŸÊͺ+›âlñ­Æ£¹…Q)ÚIúz{ô­Ë[¸oaÁ*Ë8ܧ"¾†…zX˜{J2¼{™´ÖäÔQEn ¢Š(åMGö$Ô.µ}Vî߯Útq^ßÜßî<<òºyÓ<»K‹µ ‚øÎÑÓ¥%¿ìS¬ÛnÙãnëÿÔ£ù^×Õ”W7Õ¨·~T{Î3ÁSU¥eÒçË?ðÆzçý:?þrÿòuðÆzçý:?þrÿòu}ME?«ÒþT/í|üþyòÈýuÐ8ñÖ?î[—ÿ“«åÿÚ ÅàVãÁvzõ¶¿<gP½²²6Ñç‚°f”’¬ c‘ÎÑ—'ìïÚÇö†‹à¯„Ž êÈÉgî#ä4äôàð£¹ö¾øGðãQø«ãžhæ¾·îسÜHI!2z–<±=I=3L<`“Œmsö £Z•ñoUªÓåOí>þvzG¼½Ðü2žøk©ø—Q‰×SÔTYi±9Û夀‰$+Á;“x_¨89mþÌޛſâòÀ-{ˆÜ«$‡ËŽà)vê9Q]íy{o¢x§IðE”¢Ñ-„·{ªµÌª§Î0¨¨€O©¯eý|aÒ/¯½½twwÑ3£ðvˆ|9 \x†éJ]\/Ù¬Q‡ÝÞ¹ó=ŽÐÛ>ëž§áo†æñ6½´,±ÈÇËŽYr¤Žp®A;FæÀ ük[öˆ’Ï@ñV‰á <‡Lµ3ÝM´–y;ž;(µz7ì©áÍ6¯"·îÕŠñ“”^þ‚^ßÄ=+â°™m*œEKKXPWo¼–­¿ûzËÑ$kšfUÞI<¶“¯²íÚIÛ·—«lgü2‡ˆüæøÛCgbI'ÃSóŸû¬=wàUþ„í ž:ÐgºŸ" LÌ£§ü¿{/ÄÿŠñxreÑ´·YuYHY$‹pöonÕæzH¸¿¾á%º¹ð©ïy©Àö“ÐwÅz¼OÅSÂb?²²**¶%éÝEö·V·wv^©|–2T/YÆ<ÿàvîKáÿèöÑ¡{g¸Q––@XÇE$€?ÎMiêÊ––ò-¼i H"“œÁâ»áÍź¾§w%ˆ`?Ñm^‡æ”ƒÏדYÿ´Ý'F±KK8¤D‰´ï&ÕÈ;‰ëóšü·;á^%Âà§œfùš³äæ•®Ú²V´SòJÞ}O#ŽŽ&|°½¼Ï#¿ÓSW¹èÖ¶7Sȱ­ëZy©Hh•ÓxÆF)ÉêqƒÔÿÃ0ø§þ‡]ÿ y¿ù>«øcÂW>+Ö㶆F¶ù6ÜìQü\àÜ÷ùH®Óâ§Æ;oÚC"}Z8„fRÛÖÔœçsã±ü}+õÆ×Âd_^Îê{ûŽZÉ®ÝÝßÃÖÞV<—˜â(E·Q¤(ñßÃÙ>Ù™uωž¶’Ñ<3+Ï'ÑþO^½+Ãçý¡ìô >ãí?öåìW «" °ˆÅœ“|Ä7sócœvÉ»ià|SñD÷—³\Ë%Ôåæà%›bäd\…ã­{‘ûiÑÅ6­w0óO™-¼“Ç}§`Nýpß}||ѧÈáJëfÓk®©§÷}çÍÏ8Ïñ‘æÁË’=·ßª—Þ|ß'íi$Wžt~ Ó~ÆŸ9†K©ZF’7Œ/8þ熽kövø“¨þÑZæ­a¤ê'ƒïm#IÖÆëDkö’>ŒD¢ê<€qŸÝ¨”g8Í/Úcö6ð×Ã?…šßŠ´LZÍfªÂÞRâ97žZîg9;‰äõ\wãä¯Úv³©üVðÜzÕÅ•ÜWi;Ïl쌱'.2¤W+Žå‚÷¯¸Áp¶Q‹ÃNU¡vºÎSšZ_iI¯Ãò<(gYî ÚÎ|Ïemo¦š+kÒÇé•×ì÷ã+×7ü<Ìܯ…¦^>‚þ±ü;àÙ´êqꥎµs§È-Òk+´HÙ‘Y†ÆšRH íë uϳk~.|5›^ñ¬—6VBYÆBy’íû£€-ÓŠøÿà±®|@ñV¡¤y“Ý'ˆ?ÒoîÄÇu²õÒ:AŒaŠ×ÃqO csޝ…É”iÙÁ>‹•És%²Z]µÕ&·gßO0¬¦Ü£Z¿Ê?ù5½-s×ôÏ…:ÇÄòÞ,Ò|C¤i–—[­ K­K·hâvMûÒæ/¼ÁÎ0xÛÍ^_ÙßÅ®2¾6ðûQá«þXW½ÚÚAckµ¼I ¼J#A…Uã´ŸÇ¿ þÍ~:ÅüÌu»œ;F´˜$—Ž1œ©ÈTŸdu$ëåù-|-,6Y”a½·*QQ½¦ì·W\­½[æq][F˜lN"”9K=ݶ»Õþ'ñ'ÁsüðÄÞ ñgÄÏ éj§ðÌìò¿P‘§ö.ØáA8ö¯“5ŸÛ|i{o¥èÖšùbÞþâÑ´ô ÉhDÓ3gæÇïd@Æñ’]þÝÞ9msGñÞŸ®Gnôr'û FÛ{ˆ”®9c‡Uv>»ŽßMÑÿà™7zdžC¯Š—>§ ^62£o¶¶^¶þ¼ŽCAý¶U{(5]ËB'úF¥ml×Ê©Èm̱ô%¼ÓÐáNxúçá߀õ/Š·×ü/ñÃ:–—32 cð¼à«¯ ¬ þC8> ÷¯ÍŸ‹_üUð7Å+áÿؘçoµ¹„†é3ŒÆØç‚:ƒìA?¢¿ðO_ë^øe{¨^!y?ÚÚÚCþ¥Ü( ÿ|"±ô.GPjø“&Éðøu‹ÀÙs=wMw×]?àn{Yí*04±˜j¶r¶‰Ý>ïÊßwC¶ÿ…ã?ú¼;ÿ„´ßüŸGü(ÿÐíáßü%¦ÿäú÷š+ócO±ù÷×qÎÏ ÿ…ãnâ·ðÿþÿòÂøQ6ÿ¡ßÃßøLOÿË ÷Z(ö4ûëØŸçg’ø[á‰ô[‰ŸPñV{.Zè@èÙë½®ä?€ÇÖµõÏ Ë¥ÙKu5Ê\ŽQ bÃ9›=ûƽ³õûO¶é1„ónà d’9À÷8Çã_Å\7„Ï2Êôý„e[’\­T­¥ŸM|ìLqUÔ§+žH·–ñ^ÇnÓ(¹Ú$òŠ3asÁ8õ¬»_…>!ׯ.äÒ|_¢Y@$,-®tIo%LžwL·ª$9ÎNÑèEzŸÃÿ ?‡ì¥¼¾Ãê÷äKpØ»ùbSè£ë]3Y[»‡h"g ¼1@Ho_­y<+Àô8])P­&åªEÙÆRKu¢q³nÚ½4jú­%©vá¡á·¼kqo,-ã…‘J’<1>pF?è!^Éá] |/á}FYÂéÖpÚ Ší.#@›±Û8Î*Ýþ£o¦@e¹•bNÙê~ƒ½qZÏŽ§¹c€6ñtó|çü+Óâ/ɸVíu?xö„u“ù_EæÚ]…|F.ÜÎéw; KZ³ÒcÝs2«vAË ¬;Æ7:λ••šBù³<’`Çp Çv9{Ÿ^!YîffvI†oß> Á>ý?³¥j³hz[ZZ¾n&o2êøŒI3ôàtUЭ~GƒñJ8©Ï1ÇÉRÃÂê¡ïT©+^ò–‰E&¿•7¥Ýšz¼%—,u}ú#Ô/õK]22÷3¤CОOÐu5Éj?d.VÊUþü¼“ø äY¤¸’ZG<’y&› Žv•hÚH—s¢Å:}ìd)ç¡Å|ŽkâOqj,ž‹£J ¹8®i$µnSµ¢­Ù/ShaiSøÝÙfÿTºÔå/s3H{xAU&ŠàG†0 ¬Uf”c«1qžƒ“ù´1 weŽ5êò0U_©< üŒ©[0XœM'‰¨õQ“oš]9·”—xÝ_kØí”R“²6t=NÇ·ipÉuss!–âöï¥~„pÏŠ[¯ê·Yhò”ÿ Jë×õ¬«KKFq¥ÅóFø¬+޹•°½ûn>ÕÒYü:¾¹LÞj+§äŒÅ§®çÆ9W}ÕGø~÷‡Ê|Câ·í1x‡†¤ú]ÃNÊ÷Ÿý¿k÷<÷,=•ÙÍ\ÜI´Ës>Ä Ÿ2y6Œ}I©­ôËÛ³ÙôëË‘#`8ˆÄƒŒä´˜àä`¨nõßh^Ѽ?—‚Ô\]7/wv|Ù˜ú–=:öÅtö¹o„Y= {LƬñëw˹{ßù1„±“zEXàl~ßJU®î-­Ù™Ÿ8?ÄØ^?€ú{Õñð¿Fº u3q«:°eÊR5#Ò8ö¯é]}úÆ]‘eyBÿ`ÃB›î¢“ù½ßÍœr©9üL¥c¢iúZm³±·¶^î¢UÉÎZ»Eî™…Q@Q@Q@r¿~#èÿ <¨ø“[˜%¥œe–eNÿÃaˆËÀÔHë3»E³1ÀÔ×å—í}ûB?Æ¿=¦‘|òx?I>U”hÇ˸”d=Á'%Fs…cqÏv ñ3·E¹õÜ3Ï>ƪOJqÖOË·«éó}?Æ^1ñÇ¿‰2j—cÎÔõIDpÀ¿rÿ…2ÝEä¶:Ozý ýœþiß ü"º”Ê¡V&’)'@­·«Îùà30{ 5â?±ìóçZ'ˆu»o-ÙU™$Q¹W‚°õãpÃ1Æ@!z“¤ioü ñ]ì$C+Y5œGµåZ•ã¶ìã¾1YbgkEiìx«6Y¶2åºQ„£ 6r½¾èì¼îû™>>ñ$þ:ø‰âe‹O.£,¨\ì08¯»t/音Oìïk}vÞn«p¿g°·(Çí"鑄܉ãƒÜ× ’Ëþ]2}Jhà°´—ís4ØÚV0_iïd¨]£“œksÇ~9Ö>/x®Ì0‘£Q–›b˜F¹ Ÿ™ÌÄu'Ó|}lOÕ•J‘øžˆýs>È¿¶18\¾~î‚æŸKÛÝŒWÉ;ö^¨µ¢Ã®ükñõåÕõÃÜ_ßËç]]òsÑGઽÉÞ¿Eþ|5ÓþøAeší'H I¸ôx†X©o^¬Ç¹úWû.|¶ðV£} Ë;17®D²`faŸá#¶îõÖ~Õ>1oüÕŒ2îõ¶126oåˆäº§¨§†ÃC+ÃÕÆÖÖvmú%{Ÿ™ø·gO‰ó*Y^ÝÃÆJ1KDús[²[.‹ÕŸ^k7<ø‘¨–g›R»vO39›^ƒ¿JúªÛÆ¶ß ~éÑZaõW"݈ÁòćûªéÉöç埄v÷Ƴ2¢Á ÈYÁ „R}0Îá]׊ußøL ‹ÃžŠý×ý*î<§_–"r;õl?€í^‹_§p¿ÒȰªSIמ³—]uåO²ü^§ãyÎi,»Qv¦¶_¯õ±õÚØZKpã+Î3Šñܾ£5Äó6Ýÿ;¹èªIüò¯Iñþ¦a¶ŠÉ /Îøî£·ç\F•¥Ã«ë‘Gpßè–©ö» ÀcbŸ‘sþÓÉO¯•ñJœOÅ^£&©R\õ{.­¿Hè¯Ög8{:.£êQ¼×Ÿá÷‚£6аkº¿ïXc絃¢®;žåx){â­Z15íÍÄ™XwÏýçvþÏRzóõ®ÏÆz¤¾(×nnd}žcü¹ä*߀Éü+×þx.?èi¨H¸»½J®Ò<¨ºªõ<Ÿ¼}Ï~µïd‘‡æu1ûѧ²í¶ži]ùr­t½­Odnø'Àº‚´äŠÞ4{¶P&ºØ?N¢Œ (àbºZ+Èi¯ŽVÿþ\^ÄVMzùZ 67 øæF*ägž¤ ý­YY^½<5)U¨í£äOÛçã˜ñ¯Š›Á:EГFÐÄŸl1ž&¼ÃSê#¼[=w?°ÀFÒ´éÅ}+À~hßþ1™µ)Y’yõóà1XT€}Ô‡îgWÓ|!áëÝNþhôý'L¶{‰åncRXýйթNŠÁÁüM6»¾Ÿ×¡îàœ±gˆ–‹·õÙ[Êþhó?Úö„Ñ¿gë Õ¤ŽâèF‘éz[K±ï.vx$(À,À¨Ïæ>¡áŸ~Ùß´ß. e¹ÔYlµhÙÚEÒš1òÔˆåh×8ßæF7oŽŸ|IûdÙêXéžyÅRXivÉ&ÆÍ­Ð¨•ÀÈ cgfcŒ«v\¦þë??cß O¥ø‡ÆÖQø¤ÉÝÅOr’²î "D¬T€ýÁÁ;‹Wè^ÁùTª`ã*¹·´ª¹sµ7&ùZée(¸½/4•Ü9¯ìB¼'ï½#÷F|ýžü?ð?ÂVZu”_jŒoiXer0Í»¹îÜz (z“YÀ÷)pb_=˜ç•â?¶çÁí:çO·¾ñD–’ßEð´šm×–èü+òñ·9ç‚8 ê¾ øƒá¯ˆºt—þÖìµËHŸË’[)„Ðã¡ú×åøªUq‰b±ræ|ÉÎ/W½õ[§óLkN¤ÜcQ9u³M“ø‹Áº7‹>Îu[îÞÝ·E#d·Ólb_–(—Øÿ²£,×Þ½:³WÃÖ#[“VhD—íÄ%~v(쾜óžµú¦oÃ<Ó-ŽQÜкn0J7K^]¬®ìÞo™É Î3çz³Í4¯kÚë/“§&цE框rଠ‚ÿhàñï]Ö•à=3Otšá¥v¸"k°¬ú¢ãj~>õÑÑ]¹Ge9rì<`ûÚò~²w“ù²gVu>&QE}QEQEQEQEQEQE`ø÷ÅÖ¾ðV·â;Ñ›m.ÒK§]ÁwíRB‚H'{š¨Åɨ­ÙP‹œ”c»>iý¿~?¿ð@ð6”ÿñ;ñ .dVæÚÏ8oÆNT{>•ò7ì£ðžçâwlÿÑŒ¶V'Ì.Ç æç(®ÐÈéò`ýà®jþ%ý ~)Ýê7.uÝjàÈ@;"…à ôDE¹Â÷=P¿eÿ‚6?|hˆ¬÷³©v’U Ä62äc†l¢„•$ý–60Êð1ÃEþòZ¿ë·Eÿ~Ù­Oƒòo¨Rí5–­t¾ïä´ž½ÏZÐôK_éVú}’l·…p3÷˜÷b{’y&¾Vÿ‚Šx­¬< á¿Å.Ó¨^µÌ¨²Y"\W¸ÜàóШ¯®+ósöóñš¯Çl>Ùö‹}6Ê’A³.öS¸ÄWÂÖvƒ>cÃü×sú-íM9ýÊËñhùÒ⯰?d/ÙÖMfîk4Pª‡‰Xñåºäê][þ§Õ†<×öfýžõ/‰šý¾¥sncÒ¡e• «ò>ï0îœ?ˆñÐ1¥Z&máý.ÞÂÒ1®©=I>ääþ5çQÂsUöµÛ¡xƒÅÊ1–O€–¯J’]?¸¿öﻹnc·‰"‰(‘B¢ ¨a_þÞ.iuoøf9?w M¨J˜þ&%ôôWè{ò:WØõù‘ñëÆ'ǼO¨‚†îÚÒƒH€@r:çnðø³ìrçMo6—Ëwù~'ÀðëY··kJQoæô_›#ÀJ4ë·[©F› ‘”,ã=SŸªŠìþ hÉ®xÛM·‘ ‘†”>RáóèŸÃð¬-KF»Ò~xhK‘Âó1.AÚ\¡“÷ ýj×ÃMà¯Xê—6ÚÑ¿FRy¯ÈkT§—æx8b¿‡MBOþÞ÷Ûù7ø b¹ñø<]\;÷ª9¥ÿnÞ ïQ¿ÌûÜ €…’’kÅãý¤­î…ªÛèÒ‰dâ_2POû8ëß®*­÷Ä_Ä›¡vK[|sßRN{W蹯ˆy]BU)Ôud–‘Šzú¶’_‹ò?ŽCŽÞ¤9W›_¡±¯j¿Û> ¹•Oî×÷iÏaЇTc¥ü?.6­Î¯9™ÎAo$±ƒÉÈÚÓ’xɬKGu·›ÉBó+ŒrçR+¤øŸ¦+NÒícÀµ‚ÙaM«• Óëðü’¾&¶Mñ$—ï+J0ºè¥%ν-8ýÈY„)Ó¢¶Háü¡Gâ/ÛZ0YÊE|ÿ«/ú ¸ÿkÚ¾¯šü1ãàu¯ÞÕnÕ×ÊeÈ  ó•$gÓ9­íwö¢¶Š ºN‹,—Úò@¨¿‚äŸÌWê žäù~I5*òTM¹'{¶ÞYk¥—Èùš•¡I¾wmÏCøŸñ_BøQ¢ ýbf2Ê[ZD3$ìAè:džkó;ãGÄ sã7Œ/u+ä]ÜJ–¶–vãåw€‘¯©ç©ä“øW£|E»×üm>¡âß^¾_"Ò-ÏÊz*äõÛß9«?²ÇÂßøO>!>¡qk ic‘ò“Îóï… }dSØãîéã«cñŒU šiwK«ýƒÌªb3ZÐÂGÝŒ¿.ïóHúŸöQøMÃO†ö^lp›ë„ÞòÆ¿xž]Áï¸ðR¨:_öÄñü––zw„-Y“íJ/oà4aˆ=Áef?î-}¨_YxsF¸»¸)i§ØÀdr8ÑsÀ€t¯Š|ksûG|qºÔ/Pÿg þÙr¬2Ù0#‹Óœ*ý2{WÙ©%%Ì÷=î~à O,ÂüU-»Eoþ_yï?²ÏÃsàßk^[ˆu=`‰°Ø,Ë1퟽Œ÷ÁÈ)ÿGøÇ/‚¾éž Óî CÅ·Ú ©æÎ,vF7;F1ÎFîœWÚqDD‘Æ‹hª(ÀP:+ò#þ ‰¬Üj´Ù³˜¯“a£ÚÅQƒµ·Èr{üÎkô¯røfœGEVÖ0¼íß—oÆÏäzõi¬ Qƒ¿Kþoç©Íüñ»ð§önø•ã.ö‹ËÛ+KIˆÁ·)æ#\Hû­pväîê6î®á¿ìùñ7âþ›uâ- Ã÷:åµÌï¾òK¸Q¥“'{1Ã7ÌOÍŒžr uîåø“ðCÆ_-§ŽÓR´/í¼æ+ Ñµí¯˜]º!B£“ƶÒkõOà/„ô‚t‹¯,´ûk[HÞâæY•GÎÄà.âKêæ¾ÿ4âj¼1ŽÍ]*1xªø•ºo÷Q¡EAèÖý,í~k«˜ÑÃ}f0M¾X¯Æîçåö³ð÷Ä:$3x[Æz=Î{2h—×jK ËËkæ( ¬ƒs» ๮ƒö]øÓðOưjQ\ºiry¹,c’>0ÅGR„ä`:×Ö?´gííðbÛAÔ¼5 šüIšXöy6è fVóÏpXÁ#pÁë†F™o}¡ézÆcuke©Ï41ÚM'œë22‚ˆÁºíxðqÔ•É*kóŒÊŽaSSŠ éB¤“¶Ë™ë'õJ[½-{»·&xyÎO‹Ëi¬Ê…ùbÖ½uz_ºÝ_µ‘ûWc{£iÌ$˜ä\ŒõÇÜt©ë•ø]gqaà  ·ܤ'Ì”>ñ!,Nü÷ÝœäóÏ5ÕWçgݧup¢Š(É¢ó¢dÜÉŸâC‚+ˆÕ5oÃw~T³­ÄLK#È€†œt®ê¼«Æ¾!·ŸTÝ,Â81@œ³HA䪌“Ï·¥~=â3ÅSÂЖU:‹)Z ›~òZËš+G®¯fÖ¶líÃY·Î—/˜ÈµC.®/n·12¤­³ý—VÀÏû¸®îY4¿Ù›´9Œÿ¬‰ÆÌ½Ô÷ÁèqôÏZó¨¢1I ÜC4HÜ“ÆREêzÓë]¶™à:kx¦–{»‚É‚¢ëb†Îå–ÐHãù+VŠi¸»¢£)BJQvhðÏ…ß²‚>k¯©i°Y† K½·`åCvʃÎ g8¯s¢ŠÒ¥YÖ—=I6üͱšØªŽ­y¹Iõnïñ ñO‰Ÿ²ƒ¾&xÊOÞÃåj¢¬àïd•”mW :òÓŽs^×EbÒ{šá1¸¬ÝL%IBMZñm;>šÞðžàÍ7M„E `nl\ã8úcÀVÍS8ÛmÝÞB×6sÄ弑²‡þé#¯|/û!øÅüK5®¯lZÚ+–V–=ág˜@ORA-áï_ W•ŽË0Ù‹ƒÄ+ò쯧Ïî>‡*Ïñ¹5:Ôðm/ik»]«^Öí»8}CáV™ªü>O ]E ¡zÎ#Û¶n»À#’G^œW‚_þÍšö—¨ˆíã–æ!ÃÁ²Eõ#,Èr?Ýõ͘äYvjÓÅÒM¥kê»]XçÁg8ì½8áê4ž­hÕþw>mðïÀmrKˆÚTû$jIßtʼöùT±?˜úŠô[/„&ÃI¹ioÚçP)û´|¸W8ÛÉ$ôÜNkÓh® <)“aðõ0Ôðé*‰Å½åf¬ýçv¾LÏšã1SS«Röù/¹!áÍUÖõKH¬¢xí!$º¼š6TTRÅ f8íÓZõøvioi7Ê~ôn:«v­z+|¯‡2ܧ-yU w¤ïÌž®WÝËk¾žI+lqVÄN¼ý¤÷>{ÖþkÑÏ$I§Í(À`öÎ’#L±B9ÿf ð÷ìÿ+©¿ÖHÓ-b>dŸh”3„\’v¨Ú:#ŽF+èºðÚâ”RÛ¿†4›ûŽ/¤GhÃgó‡®~{’pï Ñ–7Ø$Öɶîú$›kü·<ÚþÊ žjìùsâLj-üeãÉlô(f:l3}–Ê9[t“1!K’{»øc¥}›û:ü8·ð¡*»§»gš@’Á¿àE™¾…GðŠðÙÓà©ñ'ˆîu½Nö4•™A¥§ß1ÑN{ƒ_eEÃFŠU€é_C“aê>|mŠ—õ·’G“–aæÜ±•þ)í俯Á#çŸÛ+âBxÁpxZÙØ_k'tÛ‚Ý“þÓ``v Ÿ~öXøiÿÃx/.íÄZ¾±‹©‰ûË?t‡è o\±§§ÄoÙó\øûGØk÷Ì“x4ÚÃæî—&3 'Êç¡nHàO$œ} 0}³j£›}4ý˱ͅÂÕ¯™UÆâ#ev_Ïõb×çüà‚k^0ðÇ‹´{Ë3®_Z=”º;HæðC—Y"\|ä*Fw(<×èÔÓ%¼/,Œ4RÌÍÐÉ5øÛñÓÇú¯í“ûL}“KšTÐְ默–ÖˆypF@ù°ÏŒü«Éëú§‡´±Íž>ENÊS“WVièמý4NÚØúJ¸uˆ§(ËoÔùšâÒãN½’Úæ-®"}’E"•u=ÁEtžð7ˆ|g+G¡h—ú³'Þû%»H§RQ×Ö¿iü û=ø^Oi¾%ÑÓZžÐÆ5&2´@&Å'Ÿ¾W©ÆrÄV?Äß‹Ÿg:iõ;‹u8Àht‹iEÝëàmFc°d}ã´ Wè²ñS’¡€À9Uz/y¿”oøéÜç£J8XZrÓî?2aý•õoøzüDº>ÐU‰!²_´]\HOú¤#÷jp ÎãîžqôìÕà럎´«¨tç°ð—‡WÈÓíZRR-»v““Ëw“ÎX 9çž5ø‡ñöÔø™g¦: }Ê]öú}²Ÿ³ØÆÇï1ÆdŒ('’GA5úEð‹áï‡ÿgß…ÖÖ÷iV–»¼½œ"Ç““½Øàe˜“Û,@ã¿9â¼Ë^¥˜Í:ºû±øaú·æÛëm7૯W½Gl=7{mÍ%ú#Ó-mb²¶ŠÞÄPÄ¡¢ÐS.ïíl"i.®b¶FYæp rkâ?¶íçŠ&›Gø{,ºVŸ¦)5§ÂË?P|°AØœƒ»ï}+Ìü+«ßêºékÛë‹Æžn%iQê~µøFkžÓËc.Xs4›ÞËO“üŽYg¸yTöt7ŸO—sô®ÎþÛQ„MisÔ'¤¸u<ã¨ú±_|#ñ%ï‡+¹°•m,f10æI¨>™¦ü*¼¿¹‹Q[—’keu)$ŒNÖ#•çÛkÀ…raxŸ Ïjä¸znS¥å=9VÞíï}ÝŸš=Ya' :ÄIÙ=—VuºÆ‹k«ÀDãc¨ùf^FsŒúqÈ<ÃðwŒôRîãC·Ö,õFÌu´rë°·ž8é€N+•ý£¼fÞð#Y[Lb¾ÔßÈ]D}\ûqÆ}ëç_„þ!±øyªOâíRS´àŠ#}Ã`1EÎD|ô$ô¬ñÙå&sO Fí{óf:´¯øëßEv}_Ë—ÔÆ6ï{B)|NéÀÓ³}¸kñº¬º$Œª&’yK÷Û°QîIñ¯…¾/þÖþ3ñ©¹³Ò®†ô‡&/&Í¿}"ãt½FqÑq×׆ÛxÛĉbÖ4ýbú TßiIßÌsžç9=°Çg~qF¦Ps¥5föºòëùi—xm˜W£í«Ö9t¹¾öšKåsõk@ðŸöU•´;L)yef.†Få€RxQÈHâº:ñ‹ǯƒv~'–Õ.õ«õZZ“„yðrÍþÈÁb=¸ø2×ö¦ø­«s¨Gã]DM319Y!\œác`UG¦öTþ¯‡¼iE+êì’×»ó²üȸ+2â ÄÒ”c»'&õk{Y=»­¾Àý¾~%|þ´»ê^ ›ìæ5?9¶^e8ô9U?ïþ_=~Áß __ñ³øªîöоõÎ6•iqÇðÆpwH:×…|Iø™âŠ7É©x§W›W¼†! o"ªLçP“ÐsWü9ûOüEøs£Yh¾Ö£Ð4ëxvyvöpÈe%ÝË»J®I%Û¡v¾ã„­W*NOVû}Çê/…±¸yVQöµç+»YôZ]è’Û¾Çì-ñ¯ì;û@üGø«ªk6¾,¹þÞÓ‘C|ÖñÂÑ>Ò]G–ª³ Œãž@¯²«çñXiá+JŒÚmv?Ìòú¹V*xJÍ9F׳ºÕ_²ü‚Š(®SË (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ Âñ'‹ì|5±'-%Ì‹¹ N¤g'°ëùVíygÄ/ êrk’êˆ$¼¶tR$ghð1£?Ÿç_'ÅÜÏ–N®QGÚVÑ%kÚýmÖÝ»»ís¿NZ¶ÄK–?Ÿ‘ÕiŸ4Ëõ]âKw'0È䊳ã½Nˆ¼—{ñŒ¬jXŠò‹2-Dœ‹wAó$§c óÈ85Ÿ«êvw #K€ìøUXãw'Ÿ@:úWâ8.6㪓ú³Ëy¤ººU½uKò:ñXl57zrºõLÛøñŽ{»9,ôe{8Ûå{—ÿXÀöQü?_ÿ]xÇ„|ãMq ‚&“{d“Ðú’{(îÍz¶›ð£ZÖÚ9~̶0³j zb%$ÿßXôï^Åá_iþ°[{(”HT g*HG®:NàWÝå|=›føˆæG%¦Ô×OT´Kº»o©ó•(*³N["O ørߺ®›n"\»…Æ÷=OøÀڵ袿_ÛDt…T·°i¶sÝÝL–ö°FÒË4µQe˜žÀM4¯¢ä_ø)ÇÙ¾ü+·ð–xÖÞ ñ3ä’+$kþ±‚ç=FÿJü²ð—Œu¿jéªxT¹Ò5R‚{Y 1SŒ©õƒÇÒ½ÛâF¹©þÙ¿´ÜÒ[K$z}åÇÙì÷ƒþ‹am¼c‚ܶä÷¯Ñ?Øgá=æ™gý©á;/¶­ºE'ÙãD €2’ŽIÆI¯è<¿5˸#K¤êTªœ¦•žú$ï£[«y>繊¦°”c‡—Äõä~XjÿµWÆoÃý›/Ä_L’º…Ž ÇI²0&¯`y®ßà‡ìoãωº”wÚͥΕa3¬²%Â3^ιˇ”Èþ'ÇÞæ¿O<)û%ü5ðCÆú‡œère†8„Ì2 S.Ï3n@ãv8Æ+Õt­ÃC·òl-"´Œã"5Áorz“îkËÌ|I:Ãd8HÐRÞV7É$’~mÈù)`£R£©UßÈòo„_¼/ðÃO}p–štVq´ÓO3± ie”ãscÇzø«ö˜ý£ïÿhÏÅ xXÝ?…mî<›+P»ön33¸çå Ð 8ôoø)í!KO…š<ÈÍ1ŽïYuÎP 9éÉÏÑ}j·ìû=Ç©@ž.×-Y•÷4L…vÄÀme=A|xùß_™ÖÂN8O¯âäÜê;«îüÝûþZŸ=™J¦a]exgËñ5ù]}Çöpýc±Ó¡Õ¼Uå\É# ‘7*Œ•Tð}w°ôÀî~†ñÿÃO Gà}VG°Ž9--%–—,ï$Iõ½ €yGíâ”Ñ|ºjJRëT˜D¡[Ë_™Éç¡À_ø|6e*40•ëTŠk•·¦úý,.†téÆÑKïõ<ÀJMûºeÓo'pRWŽÿ68¯¯#š? x^Ø98¶·Ž%Þ9$(P1õ¯›¾øaµíl™An®®ì¿t¢Ä«‰ôãÙ~!k‹q©A¦Äùò¯mǧä3_eøïõ[…q9¬´œÛä¿Weú«Þ^—;pù¡úœ¶¯4·²ù® ²»ço÷Øþ$šõŸèñø{FŠÛr—PdšN¤<»}3ŸÂ¸ÏhË©jÏ}*†‚Äí#¬Ärà*qõcéV~3x¡¼?á à·}·wƒÊ\ §ñ=Ž?jéà|º<-ÃÕ3ŒÅ·V²ö“o{?†>®÷õ•žÇ¿>|v"žŸ¢ý_õØùÇ㌌¼Q5Ìr²…¼›až6 üÃêr*à4ŸjŸï­m ßöhä1äX÷*ƒŸ^Ã95ÖØxVëÅúœ6VªÌI…êzð=Ïè=¯ªþ|9´ðFîãkâ›Y|±/]‹íêz“ɯ…òzüI^y®=µNRoüO²þêÿ$¼¿KÇçáü40˜+{D´þêïêÿà¿>Â?³ÿ…>hž½mlÚÃ$ócM¤±yxb@Ü88íÒ¾ðæƒÄ6öÚe‘mÆ ×+j¹m„…öqÈùp£ȯ®ÿnOŠGÃÞµð…ŒÛousæ]í<­²Ÿ»ÿaù)õ®'ö&øaçj—%¿´+¢ù‡ÜE-‚ß|?éˆ<ƒ_¦Öù…< Fž®Ëm´û­ógfI‹Ädù/<ÅÔn¥v ·«Õ__6ߤ|Ϩ5_…š7‹| gáïXÛêI`ïš%s½K&AÇ<{ŠùGö ýþ|"ø6µoë7SùVE#(–CÔí,T*Œ¶G@¯¹+ó7öÂø¶ß¾,ϧéó4ú6ˆM²!ÊÉ.ãæÈ=rØP}W×ÔåKmO€ifÌÒ¨Vœ(ÃÞšRi5Ù«ÛÞzz]ô*~Êÿ³åŸÆÍbýõrãKµ.åã Ä• PTxF0~”¿ÿ‚xü=¿–ÝÃËkå8f[s6%ø|ÌvŸövŸq^‡û+ü4_‡_ ,£’0·s.]ÈÁnrÄŒœ|å‡ÑE{5zŸ[­ ¹R›^Œàâ+Çã3:µ0•åIÚ)6•–—·žú÷8_…<=ð{Fm?BµH±¸¢íÏOrIàd±$àdœWuEÉ)9·);³àjTYº•mêÛÕ°¢Š*LŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( *ÚO{Ëøm|1¯ßGg{s`×ýQä‚g†M¡î±¾6Á dsAøÿn:ø7Äq÷¬?ù*¾|oIáísÅ3Ú߯éâ-b@Œ¬ ¾¡pêÀ„ ‚¬ ô4MñJô}I¹þ ÿÐyò­UI¥êhå˜j”ã9T³i=×ùAÃ@ÛЛâOûêÃÿ’¨ÿ†‚¶ÿ¡7ÄŸ‡ÿ%WÎÿð°Æ?ãÓVÏýzOÿÄÑÿ gþ=5oüŸÿ‰¨öõ¿”èþÈÂÏÏÅDÃA[ù“|IùØòU'ü4·ý ¾$üì?ù*¾uˆm‘¶ÓTÇ|ÙÏÿÄÒ“Ÿô]KÛýþ&Ÿ·­ü¿ƒìŒ'üüüQô_ü4·ý ¾$üì?ù*øh+oú|IùØòU|éÿ Lô]Oõç?ÿUnü}<…vØjîl¦'õZ=½oåüÖQ„òóÿ&‰ô¯ü4·ý ¾$üì?ù*øh+oú|IùØòU|Çÿ ÝÎäÿ€2ÿñ4Âwsùßÿà ¿üM/¬Vþ_Á•ý„ÿŸ¿ù4O¦Ûö†´SƒàÿƒîÖü•Iÿ gÿB‡ˆ¿ï«þJ¯˜¤ñÕáo—M¾õÍŒßüM7þ›ïú^ñÓýoþ&¬Vþ_Á‡ö.þ~ÿäÑ>Ÿÿ†ˆ³ÿ¡CÄ_÷Õ‡ÿ%WÏ?·íC ø%{á­;OÔôMS_•mOÛE»¶4ÛLS>8ا#‘&r¸ÃÇ7™PöW1) –ÒDUÏ«0œ’|Ç≿iŸööpI"èp(Oíd³ˆ–ypAÃ9'Ž  9Å}¯ ÑxœrÅb•¨Ñ÷¤íÛT¿_•ŽÌ6I‡„ž#žñ¦¹ž©­6½¿­Ïmý…|5kð»L6ÖôCQ¼ÕsöT³nŽÝJ˜Øù²F@wÜøçˉ±Ð×Ù?ðÒ:väRñçcÿÉUò›xõí‚ÃEÕm¬a8!M2ç Œ(LðëIÿ ûþš¿þ .øÝ|þoVÍ1Õqr_ÑYè¶Kî\ž¹{jÓ´ŸšÓËä}Wÿ )¦ÿУâOÊÇÿ’ª Cö Ò4Ý2þú ø‚,ífº‘å›BÇ9û· z.8¾Rj ì³õQ“Ÿù\ñÈ|añ–¡?ÂO³ÞÛ²F›îl%‰H{ˆca—P2UÛß¿jŒ¦53Ãz{IÆ;>­/ÔóñÙ6 …©ˆS»Šn×]¡ázLÿ~;#êsI-Ö·¨µÝäŠrÂ>e—nAÆÔVÇ0+ôÿÂ?´ox~ÓK·ð‡ˆB@¸&%² [¾ºàvÐ üÅøâë|[³Ô5v¯ öæâAÌ,ð²«)Ï˖“ýÖZúROˆÆÞßí–¶ö˜í rŒ„uÊíb_Ž~PIí_uÇs­GN({‰;Y6·jÚvIÂX,&Ž'Ь¡%-o(ÇNúô½Ï¯Óö’Ó‚ø“'Ž~Âþ•WÍþ6ø™qñŸâÛÏdû2Þ·±‰ÉSpÝ#qÆzž8zWk_nünÑhú+Ý{‰D²)Y. ãj€IÚAèy=Àé]äHß ´Å¶M&þÿ]»|×6–RM(x«ªOàõö?ŠæJ¦bþ§5î/Žß—õúµK?ÇÇ•Êô¢ýé¶’vít´^{½—¢~|MÒ|c6žº¬÷*oÙ¼«‡ývür~LåºqQC®Í/ö†­uûÙÿÖ° ¶HžÙÀçµyOÃÍNê÷EY®bš ›©I0Ü+#¬hJŒ©Á`ÇŸE?Y>*øÆóÚeŽ™§i××Ó\>i--d•Tܪ@8=:òsÚ¿2Î ø›;¡”F?ìØkJi-­¥¾è[¥åØúø`©¼Åà°óÑivÕ®·×m?3Ý|#ñãH²µÓ´˜ü3¯£1TyßìAK±ù¤l\“Œ’N5ÊxûT¹ñn±s#8\„‡8Áã?Ns^uð:æû\:®¥mufÖÛ`Š+¨ž6%,Ø`Lø­Ÿ‰ºìþðíÝÕ­•ÝåÕÄ‹oZ@ò•È$± ‚F Tñ.aWˆsÌ?Rº§ N¥¾û|£·œ—d}^G-­9R’rÑ&ÚjîÝv·$ΛáïÄÍÀ^s\xgZ¾¾GhÒ걘öyw\)Ëz0;÷1þÓš;̨Þñ @ ¿Ø°£=N.zWÅð•k_ôÖ?ðþ"­¯ˆõ! ê7Ø]Øù˜³OµÂñæÜFà3ò©ð?Àþ©,l2¬©Óå…8è¬í¦Ëç±×þ¬QÆW\Õù¥'üÑo_$Tø‹«]üqøÃ{sH#¾¼ÙJw {dÜ}•Al¼õ&¾¥øsñ—Ã_ ¼;‘má~_+ÒÃö2Œm]¤Ü)Æä€I$žµò§„þÓáý^ñ½…åõÎñ§Z%•³NÁŸæ‘°€²á@é‡"²ÿá9ñ'ý zÿþ ®øšñr Ô¥BXÊ‘¼ê¶ïn—ÿ;ü¬}g`ifR†_ª°éE+¥­•÷쬗Ÿ1öÄÿÚâÃFø}­Ýiú6±¦j†*ÊkÑm³Î~îLç nn˜ù¶~%ø%áã¯øÁõ‹ÕšâËJ"òr„$”“å¨,@,[æäŒí##5[âOŠ®u¨´Ý9‹‚!<±CyÒ(%X…Wjàòï\¹ÛSøsám/@²ÐuK»ÙÑu Bkm:yHã刲¯TP Œà÷Í}RÅ:‰Í­º¶-¥ÃY$¨R«b¹›JѶ÷Óe{zHûFÇö£ðÞŸg¬>ñÅ Ðm²Ž×5#þÖ~ïxkÄcŒýÛ?þI¯…¿á-ñ?äYÖ¿ðOsþ ÏŠ¼NåL~Ö—×þ%7#ÿd5/0«üŸƒ?> `›³Ä/ü 'ÝßðÖÞÿ¡kÄ÷ÅŸÓþ~hÿ†¶ðïý ^#ÿ¾,þŸóó_ÿÂOâÏúu¿üÜñº?á'ñgý ºßþ î?øÝOö…oäs5ÿT0?ô¿ð8ÿ‘÷“~×>\gÞ"[>òf“þïÃ?ô.ø‡þù³ÿäšø ÿÄ0˜¦ÏëÇÈ].ãÿˆSûoÆô.xƒÿsÿ…/íÿóïðf‘àì¹­qKÿ‰úÿ wáŸú|Cÿ|ÙÿòM1¿l )Áðç‰3í¡ÿÛŠüúþÛñŸý ž ÿÁ\ÿáMm_ÆLr|9â/ÃM¸Ò—öù÷ø2¿Ôì·þ‚—þôþ Âÿô.x“þýZòEðØ^ÿ¡sÄŸ÷êÓÿ’+óãûWÆ?ô.øÿ×jøÇþ…ßÿàºâíÿóïðaþ§e¿ô¿ð8ÿ‘úÿ …áúøƒâ»_ÚiZÅ…íÌrIßGŒì]Ì2’¹Î=«ócûWÆ?ô.øÿ×ퟱ¤ž#¾ý t‡Ô´m^ÎβÓ^ÚMaŠXc'šÚŽ:µJ‘„¡dü™ææ\/Áá*b)b9¥t¹¢ïòHý¢Š+Ü?1 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€8/ŽÞÕþ&ü%ñ'†4-Yt]OR¶òbºuÊãp,Ü©#‘^û#þÈü¿ºÕõ™…Ö©&v@£•TœÇ$“É ÀÛ_WÑ]ðÇW§†–´$îüþ{ÛÈï§ŽÄRÃK Zwz-~{ôØ(¢Šà8¼Ïö”øoqñkàw‹¼/g sê¶e­@0gFF2H–P2OÍzeч¯<-hW¤í(4תwDÊ*Qq}OÂ_xÄ^ÖoBÔt—Y„?é–Ï/Ž€‘ƒëÇQÍz/>xÓÄÌ–ñèWvj¼€@Ç$e‰ôPO¶+öûÃún¥0–êÊ ¥od»wüåQXøSFÓ%ÚévÈ!Ö!GBjú|Ûˆ§šÂÒ¦¢úë~·íúŸ!>£VnU*;>‰/Ïþógìõû&Ùø:Ô]ê +Jä3Ü\FixÁT^±!y,ryÆ1õvégh°ÛD‘¤i¶8ÔaF¦¢¾=$®ÒÜúœ>–š£F6Š>N¶ð߈5j?ÚÖÒ6£-ÆdŽ&Ëg€½p91àZúsÃ:*è-½ ù¥|Ïýù–?ž Õ¢¾)Èð¹<ªÎ‹nUäÞ­ö]6»4„5dx&Õµ %lF€•<(äþY5Ùü4ÑMо×<^]Íáß‚>eøTþ­ÿ­ ¼¥\êböh¤™ƒXBbVõÙÐþ9ý7ëæ¸g„ç’ã1Yž6·µÄWnòJÉF÷²W{é÷$¶»õ+âÝZQ£hÄ+á¿Ú»Å/ãˆËag¾xl´…NZCø»¸ü+îJñ‹_Ù§IƒÅRj²]5Â<íqºŲÌI*¸ÀQÉçåíñ_ŠÍ(ÓÂáÚQr¼Û}e×_È÷xo3Âäø™ãk§)F-E.ïϧù2ÇìÓà!à¿FÒ'ï§êää·$±Û‰•{äž“ã‡ÄEø[ð¿]ñxÖî|»Eðó¿Êƒß“œz]­œ:}¤6Öñˆ …"€¯:øñðRËã†-t»»Û«F´¸ûD^DÂ5vÁR*݉ÇνåGêøeG¾dy¸lE^gNg'É)óNÊú^í[Ïo#àoÙûáåïÅ/ˆ«¨^)»HçóZI‰Ä÷,w œsƒ—o ëôãGÓcÑô«KŽä·‰b ŒnÀÆO¹ëø×üø§|!Ó#† <é•X À÷˜±s œ:Šõ XÜXÚøS1_Þíh¬í¢2Ê#.ÊÀ}Ô'$‚Û(b1[>%h ¼!yâ-~ãÉ´ƒ Iƒ-ħ;bI˜àñØN$~mxRM[ö‰øíö´©=Ö«x²Ýù07‘±Çm`Éú¨·gp YºùXüTè(ŠNrvWØý†8nžiN¾a˜7 5¶ÚÞM+Ù]5¢ß®Ë­×ê\ÇusC"M Š$ƒ+)ÔÞ³üEâm/ÂZq¿Õ¯Ê×xŒ;‚K1誠Ç‚pàпPÙ[$q¢AoT@Q@àÐ+ã_Š¿ÇÄÿÇ-”›ô+ ÑØf2…ÁQ¾B?1ã  çÇâlú9 ÖŠN¤´Š{_«}lºÛ­–—¹àä™Dójî;B*ò’^oò»écëÏø“Nñ^˜—ú]ÊÝ[1*HaÕXAúö ô"´ëŽøK¡¦…à]9¢ÙÍp¾|Ê“ùÂF  `HÃ*©Ààf»ú,ëTÃSž!%QÅ9%{'mm}m~úžxÂ5eNñMÛÒú2I£‡o˜ê›˜*î8É=÷§Ó]Ddu ¬0TŒ‚=+zœü¯ÙÚý/±ˆêŠYZ9!P…þÖ#øFÒrãQ¥³Û+)ü0¿Ý^3\€*+‹£%¬‰-L,’Iæ0¡ƒ7# åAèO\ò±×J‹uS„ÒnÚ4ùuiIéï$í{K–ò²³µ¥w¡“«¯… +{–Á!T·Žò’%Q·`€À`b—Áž%¸ñz¢ÜÚ›w²»òÉât1G u»'~c<ç rßg¼Ó®´û»¹A’{“l¶–Æc,oq0‘3?ðNkãôý'Óþ>&ÿãU-·ü¶þ7hé+Çienà÷ھ诓nÚ"/ hmðÛÃ7Iwâl }F¢óšÚÒE Ç×Yw( ‚v8Rѱç†W‡›²‰÷9NÄ9Î2*u–îÚEu“ò_ð‘µO Ø¿u h:¡»Ðì#’ëQÔ4í×Ó›xägž4 €íFhбÚX’$T“#Ñ?fŸ€·?|3âf‹ì"3$VÍ5IJ+D„…p©vpHò+CÇÿ m~þÌ– t¶ÒøŸÆ7<«s°ËªÆ&aV?vEKå†Ù?€ÈV½WÂ4¿ÙÃöeð­œ:„zÿ‰µ‹g½Ótÿ+ËÂV,Í(Ÿ-xƒ!.fO6­gÍSHE7÷éoë©úVešb±¹\he›©V0ƒë%OÞ•V쬜’Mh”Uöº^!ã†ZÂÿˆð‹iS­Ç‰T$3\Z\¡ˆMÓ 3¢ä²ºe· H$’Bú¯Ï­xÒ×HÓo­Mä11ŽâWa‘#äÆÑÈVË+d }µµð[áý÷Ãøâ׊äš-y’àÚÃ|í3O30›„Æíßh;Žì…c³iÝÑ~Îú¥¯Ãoj.ÔáÍÞË+x®¥Ë…-´ £.Òw7ð·’3ùÎ/N¦c‡Äc_,UêI?±N ×^g¾žK±àæ9Ià«ÐÃKÚ8Ú’Ÿüü¨×¼×e²O«o¹ƒª~Æz²I¨jÚ|LÙ«$…Ÿû«³'¨údT_²÷†¬Ñ/nn.."UùáŒ$àð“Ðû~·°xCAñÄ»÷Öu‘5´ •¸e ‰ä,(Üヂ¼³b ·kã='Ið(¬-îoü¦.î#G™’Y·cŒ–8dã\9¶'7¯«›Ñ«š¼ §R§HÝ= ¤íËdÞ«t|6/>ÇQWUܧÖÛ.éw±óg†¿f=/Å—·–7VÑÜAwK­ÈXdŒ®7d—$ã–Z«ñàoƒþÛF|Mâ&Æi)lžlÓ2Øo-c,åa¸ñ‘Œç½ZÿÅr|1ð©»²ˆµpëlYƒG !°&Ù¸±L–Rà@fVÉøYû1Ûø–aâ#ÞÉt ék,‰2\¬Š|™ É ù$îËdl(¾£$¯ŒÅa©a1æÄ(§RVåP¾©5³ž©Y'Óså«ñNseBw}ÞËîµþGÊ·Ÿ¾éw“Ç-¦·q2”I­,a)(üÃ|¨ÀddÏ t¯¦ü=û-éž-ÐtíoH»²ºÒµ+xï-'/*"u ŒT¦TG‘ßšóÏÛ¿Áß þü>´Òto i¶~1Ô®#–ßì²:Kmn¥·ÌÊ [0­€K3 ˜Î;߆º Ÿ²?ì¥%á•ljµ•YVÁãKé”ía†–2R0 `BȰ'˜çôº5`ª¹·9>U-²»Ñ&¼îÞ¯d Źäq5hâ«)¨¤Ûе›Ú>¯ÔÙð'Âè,,/ô=@÷àµÐ>m¿Ùåó7Ã+ 2…Fïß&P„lXOÙF0¥þ×bÑ®wÍŽ89;{cð®¯ölð­Ç¿‚Ñ^x²h´¹„rÞÜÉ~©°´RΩ,„𪠒älóYN6×Í>'ø½ãoÛKâM÷…>húL ã· }7Š-$ ¯Bò´Bëbí•R7‚Vˆ£FUà;Ýdd‰|œ‚ñw‹ÅsÆw©)Ô©'ÉmN0½ï%¨Æ êîÜÔSg³ƒÍq”å&êYÉÝ¿×æîö[Û¡ÆøÓãçÁß k  ÙÏyâx,䕾ס[+Z¬¬BHåhÌœD‡z†B0UŽM{_Áø3ãw‡åÕ|«Ø]}ŸÊ[Ë)Ä‘\Ù»&à’!_¨Þ¥‘Š>Öm¦¶¤ÿ‚oü&“Ãi£ mBÝ¢LÇ«[Ý»gmÈÊû„_tüŠd“b!l×Mû(þÉ~ÍI­Í.²šî¥¨8Aw»@ !Td.Ã*áÈ+Žäžý¦' ÃsÁÊYz©±v´Ò÷µÕéug«Ñîúê}³zÁÉPœ£U5emw¦›z;“Ã3?üô°ÿ¾Ÿÿ‰÷5)ýšœæÏþþ?ÿí^õE|ÏÕivµÉ-–¡~ÑCii%Ã(òÐòà‰U™-ª”‚‹–ŠŠþÚ]*U¶ºPo[8‚Ø´Åð«‘ÚB7n8^r0¥›ç³ž1ãÍ7öÚ\Û»ßKsº—Ù$UÓ!º·²Ž;Û”¼ºß4qyJÜœ|¹8ã¯jµEöŠ„TVË»mýïWêõ1 (¢¬ã§Æ3à_ÃmKÅz”jhvÃgb²*=ÝÃð‘©?‹1ˆìcã؇àΩñ;ÆÚ‡ÅL³@óM*1RîêYÎ|.)b2r$?*åZ—öˆðçŽj¯ÚoKðœ>Ö4¯øvilÚêú³Æè$Sut’˜Èù×É>|mùȯ¼ü5áË hVzF™ÛXZ&È¢E ª2I¨ £$ð ÐíVŒpxhÓM9ÏWäº/^çÞË‹(ú­|J÷Úwå§Ò²½ß–l×À_·‰­5Ï:~‘%ýÀ±Òtè ºŽ$2}žI¥vHت³˜žÃv¨,1Æ¿ìõðÃÄ¿´W|aw©­•‹Â,o>älcc…„žHŒ®71fbÀ«âjÿ<_ñËö™ñ{jÖ·¶6R™ÍÔ>CËh’ epWËG™†U?;²#ýñàŸØøÂún‰``³‚8wó™ "¦âI'¢€2Np|‹Ã{zÜõ>öîÖßqö™î{†Éòl.U’•f”¤¬ù’sIÛG7óQWvm3æßÛÄ‘ØØxCÂvm%¥¿–Ú1‰"XÔEû¨wÌ:rSƒòy¿è×^9ñ/†¼+µ¼6úE²‹ÁjCÆdÚ‹4¤o\Ÿ–4m‚P²çvNÅmZóâÏí]-¦“e¯‹4rÅ,x–'jËæ¸ó¤‘;Ê’Ù7<â½Sáçŵ-oO[ÍfgŽöFDÌ9 ™\îÏ@T‚qØÈs¼U)f¯‹¿ÕåR1“³k–´÷ºnÎËWfkG<6QG FÞÞ4Üìݤ¥RövèÔn®öº>ÕÐôkoišmšl¶¶ŒFœN:±À$䓎I&¸rxõíjy$ÈÓí óeV4Éb ºIÈR¤Xpk™oŸ‰­‚YéçIGBÎêÆWÙ»nàÛT(ÏË»œA«:E™Ô4Mua¶v¾·²ŒÇ"¹ÉŽIº…ïþ zú~n â9î? —à)J¥:JX‰^-)û8ÉÓŒbÒrNvOdöW?%©€©„§)×iJöµÓ·{Û©•á_§Ä¯ßjzšï‚ÕÒwŒ¨e$·ÉÉa1ʰ*pvšõ¿xÇMøáMSÄ:¼¾U†ŸO R¡äÀáq»*‚FI¼;ÃßÇù.âƒBmZòúUPÑÜfÇ v°',ØÇ'<û|ûûGë~(ø…¨ØÝë‰%œ×¥SFѸTHþZrÀìP#‡åDakÝàüç šź•¤Üª;5ïÍêÛjÍì•·±ñ¹†3êt¦éÇš_×õn¦çÀßëµGí¨üQ×í-SAÒ§T‚Êi’å!d #ƒÊpK …˜¾yŒ]ykÕø+ï€|àÃ6³ÙëzŽ®¶«ªÝb5ß;5¹1Ûdr%7$’!ùk㦳=ßímñ õ=~]6 jZ]Ö­q ¼6¶O4¶ÎDg%• %B¯;TÆjøCö©ýš~ üÐ| Ìÿ­-‘b»²MR³HXÊóDïkÅžý)bqnJ‹¶¯Ïµ—ësßfÚëGý£†©fúPðƹfVDÓå¾[´ÂÀüñ¨Ä©0Ù… ‡'qß«óöWðÓjß´ÇõxjïÁzuÜ7Âi7Ú§Úå†È¬Š²+ùQ·”á‚"¶çeØ”ucú_‹fxxáqu(ÅY'µÓ·•Óiý쬾x— ÓÆ|p“‹jÖ{;é§[|»…U¿Ôí´ÄG¹s±ÀmŒF}8j°|d÷gK[{;)¯dž@¥" À7%ˆ ÷z“ŽÝHä3¼N/ —V¯€‡5h¯r<®W—DÒqv{7t£ñ==x$ä”¶.éúÜZ”—‹ lÿgl>g^œã¨?§á•{¥k:ýô¢âá4½1¬qÉf”áÎAEÉP@`ùVè­X–Þ»mB;†¹µ“bÌo4â Ä~o—|‰‚2;.ï¸x×}7™ä¿•·ÍÚvoû¹íŸjù.žeœå²—áí8JW…þ+94¥TšQqQ\ÓŒ´“´'Ë ~íœìú$vÔzˆûTä@ïp̲8V)—yfUÁ9ù~æ~PY£ø*(q.¥åÝK‡U7•]HepOïx;rÀ B)-œý*=OR×aón^8'‘§ŠÞCƒ ;„M´ü¼¸o˜ò Õ·ã¯iŸ¼¬x—X—ÊÓtËg¸— ªÏòÆ›Š‚îØURFY”w®Ì†8>"”sª˜G ªÐ‚šÖ)Y§´¹y›ºvæqåwµ’µN¤¦¨SÕ·¢][ÒÆíT¶Òí,ï/.á#¹¼eiåzBªr}ORs㲇Æß|xð^³â{EMªIš!‰ÄrZ€¸ÄŒzÊÛÕ™@^€äo¯ÐjÓ•ºsÝŒÂÕÀâ'†­ñEÙõÔ(¢ŠÈã (¢€ (¢€ (¢€ (¢€ (¢€1¬¼¢iÚö¡­Ûé–ñj×íÜÝ„ËÈÈ…ç± Ì¹àš¶t=8ßIztûSy Ú÷óqÁldŽä*õ’KDT¤äï'ø"’èöQéo¦Åm½‹£F`·R…lîÆÜc9<Œu¦èÚ—‡ìþËa‘âç,]™vf$±À$ôt±|{.¶¶vñèñJÁÙŒòÀFõP8uç'‘ÏËï\KüD¾µ´’Üë6ñ_FÌŒ“¼JèÀœƒ»¡Œüï9âü6M˜,-Lj“i%(SæNúÙ6Õú^××MÑÙ4¥GÚ©«v¾¿qÕxÊ_ |<ðüš´úFšjL–­º#<øB¤©%WæŒgµx_Á/†Çþ&Ëñ'Ä»DÌg·äc#ÌFP»(ˆ¥J†à©\¸5ÕŸ†ZßÅn;½vKËk%lK%Ä^[ìcE` “A · Ç9O¹iEžƒ¦Ûéú}ºZY[ H¡Œ`(þ§¹'’y5éåòÅç5£ÆQtiGà„¾&ÿškì¾ÑÝ?ÇÅ©CÛUŒ§´v^}þ]>ø¡ðïQø…㿤¨’xGM{«ÝR9'âY—Éû4~IVYf]Äã ^½TÕ,ô=2ïQÔn¡±Óìá{‹‹«‡ 1¢–wf<IèZ¯Œÿ࡞9ºñm†¾xYç›Å~-½¶¸»…-L°­Š»•22£8X–Bc‚[¹l~•`?´qÃß•?Š]¢µr~‹ÑàòúY©Rš÷ª4äü£¾I%÷·ÜñŸ†ß ;Õ>,üLHum1–K+K ­Ÿì邤$*Çh‰C:¾wŠÉ‡?O~ÑWö>øTúlVë ßÝÁmp*¢¡yÄãŽ1tîÃÞ¿Ÿ8²xÑÄMVä”So—MWD÷K¡óÔV"­k òRKÝ_j_Þ“ó}{³ øAã™|oáXä½}ú¥¾å‚mœíqŽ9äàð*í§‹îu?Çai ¶šªÞlÅ’v’G Èg¯=ÈÈx |2³‚õR+ëö+)*DFv°`¿¨`Áæºìþðþ§â;ÍŒ… Ä@¼°fï·Nv‘°SùÕÓ_ƒË}£Š£N5±í§¹M½lå«—V£umQöøh¯ey+ÊZ%æúÿ]O<ý£~-ßxoVÓÁ©7|7Tº]—tßÚcXð÷ì›aãû½8ë¾!–Y,Y£ ä$þlгÜ`ååªàuEج6ü±ñÓöÍñ_ƇpøFïKÓô¨§•eÔ®,·‘t@ñ"«–1¨*¤üÌX¨ÁQ•? ¿<¤|7øA¦i:ÙNÓì׳ÝZ%´gjïyeLc,I' ’s_1þ˾³øáñÃÆõ)ÂÖìÁ¤Ææ(’8Ê:,Olå€Â™ £ ;›‘ú¦ ºªîÒ_z7É1Ù5ã³9`“¹Ó—3ZÊV§Y[W}mkò¶•¹¯ÙSöÀ¹·o|2Ð>‹”Dw¶º’¡þ–èÇ埛†æ ,ÛßõNÏFÓôù–¶6ÖÎÆU\çn@éžqëW+»Z•yóS§ËßVîûê~e›cpøüC¯‡¡ì“»k™É¶ÝÛmþ‰Q\gŒQEQEQEQE‡ãO xfóT_,˜6­û¿3ªóÈþ÷­nQI¦Õ‘pj3R’º];ž"ß´«ü6_‚1ÿÙé¿ðвrËþý·ÿ^áEs{:ŸÏø¿×0ôÿ“ö§…7íµŠ“`<åOøý2OÚKËBâ^Hí†þõ¯x¢—²©üÿ_\ÁÿÐ?þMÿÚžÿ 0àã˰ÏO»'_ÏÞ¡—ö¡òXM?‘‘÷‡‹WДPéTþÃþþ»‚ÿ oü›ÿµ>x?µDj7HúT1ŽZY¤òÑvfg@îIw¯–~øÎ-ãwŒ>8kÉÕÞ£{$:z•ª/—n£`“Ë v²¢ÅÈ’”X·&¾øøËð²ÃãWÃ}_Áº¥åՅޤ"ó'³Ûæ)ŽT•q¸ȹã¦zV‡Ã¯‡ú7ÂÿéþÐlâ±ÓlÔ„ŽÚ $’NI$’z±,{’rO¹„Ä<½:s~Ö­£{m«ë¼“ò^g\s :O’…¥'f¯ö}mÕô·O4x„¿µ›CÃMçý‡ÍëæÛÓãÆ§ñÀþÒ#F¸Ô®nÚxù†{x‘Bƒ¼àm»br9%px5úg_1þ۲ƱûGé¼ðþ©ki«èáb²» v'h3™AýÞÁò¶ìãåë]\5Rž5¥_SÜ\Ý:¸µ¯ö­úè|öu_ŠÀT£…ÃòÍÛ^kõWÒË¡Îü9øã£|,ð­¯…<,4·Ðt#Ké‚ít2Í22Äw³¦dáIaÏ5Ëø›ãm·ÄÏ/ˆµ«‹9|9¢Ÿ³iÖfÚX–öG e¾h*¤’ÀàD ÍŒOƒÿðN}^ËUIleGsðŸí_‡gg¢èznœûcŠ¡•åšFàtl³“ǰW˜AñZÎóãf»ñW†ÆâPVK)ƒÆ[t~Z¹dÁQl® °Ìƒ‚GÙ¿´ö£mðÇQ´ÒážK½I’ÀI‚±$‡Ò@T* n$`¸äuª?³‡ÃI~|9‚ ÈžWP¶]Ääæ6 ¤n  F3Üq_oW Z¶>–:S¤¹¯ËhßhÅy¥wä¬}n5˰˜ بѵJ¿»å缜tsmòì죶®çË¿¿j½wâ7€›ÂÚE­¸›]›ìlº~ãrÈ “ªÈXy…‘9Rg¾~Ò:À ÿÂ)£Ë¤jÃ;KqzC8¸œ€®êÊSrep¤Œí šï>ü=Õ¾5~Òþ ñïŠ,/¡Ñ4‹çƒL¶Ô,8¥Ž0R5Ù8%9 í\¼ŽÀ«)ì:÷)BµXóóÛåÓï;3\×,˰ô²šx~xÙNiJËÚIlß+¿$tè®Þ—ÛâÇý¿nˆºScºÅ&?ôm1ÿoû ¶ÏJÝŽ3˜ÿѵöµ§Õñó÷ðÿ‚|Çö¶Qÿ@ùSÿ´>ðP]DÿË®…ÿ|KÿÇ}ê)ÿࡺ„Í–ŠùÏÜŠS¯ïÎ+îZ)}_ÿ?¿ø%¬ß'ë—ÿåOþÐøWþ'¨ìí'?õÂoþ;[¾ý¼o¼aãŸh/a¦"jºµ‘há”0Ê©L„gŸJû6ŠkˆNî¯áÿU3|žPqŽ_fÖþÓoü(¢Šô‹ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?ÿÙkit/sample/mgp3.xbm010064400237450000000000000407000657017766400140300ustar nishidawheel#define mgp3_width 250 #define mgp3_height 102 static char mgp3_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00, 0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfc,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0xa0,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x90,0x02,0x00, 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x6f, 0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00, 0x00,0x1a,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, 0x00,0x00,0x80,0x35,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, 0x00,0x00,0x00,0x00,0x80,0x2e,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x10, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfc,0x00,0x00,0x00,0x00,0xe0,0x15,0x00,0x8a,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x02,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfc,0x00,0xfc,0xff,0xff,0x2d,0xdb,0xbd,0x29,0x6e,0x5b,0x55, 0x55,0x55,0x55,0x05,0xa9,0x56,0x4a,0x22,0x11,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x54,0x55,0x95,0xd6,0x96,0x26,0x95,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0x0a,0x84,0x90,0x04,0x08,0x44,0xa0,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xb4,0x55,0xd5,0x6a,0xcb,0xaa, 0x22,0x92,0x2a,0x25,0x11,0x21,0x00,0x80,0x22,0x00,0x20,0x81,0x00,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x54,0xaa,0x2a,0xb9, 0x0d,0x44,0x95,0x44,0x00,0x40,0x44,0x08,0x92,0x44,0x08,0x22,0x02,0x24,0x20, 0x00,0x40,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0xfc,0x00,0x20,0x11, 0x44,0x54,0x4a,0xb1,0x24,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x08, 0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0xfc,0x00, 0x00,0x00,0x00,0xac,0x07,0xa8,0x08,0x00,0x89,0x02,0x00,0xfe,0x00,0x22,0x00, 0xf8,0x01,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0xfc,0x00,0x00,0x00,0x00,0x36,0x05,0x58,0x14,0x00,0x00,0x08,0xe0,0xff,0x01, 0x10,0x00,0xfe,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x20, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x9a,0x06,0x54,0x0a,0x10,0x00,0x00,0xa8, 0xed,0x01,0x01,0x00,0xdf,0x0e,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x80,0x00, 0x00,0x02,0x00,0x00,0xfc,0x00,0x00,0x00,0x80,0x4b,0x03,0x1a,0x05,0x80,0x50, 0x0a,0xda,0xfe,0x07,0x0a,0xc0,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x80,0x86,0x01,0x15,0x12, 0x04,0x02,0x00,0x2a,0x60,0x07,0x01,0x80,0xb3,0x0d,0x00,0x00,0x00,0x00,0x00, 0x80,0x00,0x04,0x00,0x11,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x40,0xc5,0x02, 0x0e,0x09,0x10,0x00,0x84,0x1a,0xc0,0x83,0x06,0x30,0xc1,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xa0, 0x63,0x03,0x03,0x05,0x42,0x80,0x00,0x05,0x80,0x83,0x02,0xf8,0x00,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, 0x00,0xe0,0xa0,0xc1,0x85,0x02,0x01,0x00,0xa0,0x02,0xe0,0x81,0x02,0x7c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x81,0x02,0x00,0x00,0x00,0x00,0x00,0xfc, 0x00,0x00,0x00,0xa0,0xc1,0xa0,0x02,0x85,0x08,0x00,0x82,0x00,0xe0,0x41,0x01, 0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x00,0xfc,0x00,0x00,0x00,0xf8,0x60,0x51,0x41,0x21,0x02,0x00,0x50,0x00,0xb0, 0xa0,0x01,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00, 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54,0xa0,0xe9,0x80,0x82,0x00,0x80,0x20, 0x01,0xe8,0x40,0x80,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x3a,0xb0,0x30,0x40,0x51,0x00, 0x00,0x08,0x00,0x78,0xa0,0xc0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x80, 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x2e,0xd8,0x5c,0x60, 0x21,0x01,0x00,0x50,0x00,0x2c,0x30,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x1b,0xa8, 0x34,0x20,0x11,0x00,0x10,0x00,0x00,0x38,0x48,0xa0,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, 0x1d,0x70,0x4f,0x50,0x49,0x00,0x40,0x14,0x00,0x1e,0x28,0xb0,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00, 0x00,0x00,0x0b,0x58,0x0a,0xa0,0x24,0x00,0x00,0x00,0x00,0x1b,0x24,0xb0,0xdc, 0x07,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfc,0x00,0x00,0xc0,0x07,0xa8,0x0b,0x50,0x11,0x00,0x00,0x04,0x80,0x0e,0x18, 0x38,0xbe,0x0f,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xfc,0x00,0x00,0xc0,0x02,0x74,0x05,0xa0,0x0a,0x00,0x00,0x01,0x80, 0x07,0x0a,0x38,0x7f,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0xa0,0x03,0xac,0x03,0xb8,0x08,0x00,0x00, 0x04,0x40,0x05,0x14,0xbc,0xdf,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0xf0,0x01,0xd8,0x00,0xa0,0x14, 0x00,0x04,0x00,0xa0,0x03,0x0a,0xbc,0x43,0x37,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0xa0,0x00,0x6c,0x01, 0x38,0x0a,0x00,0x90,0x04,0xf0,0x01,0x02,0xbe,0x03,0x3d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0xf8,0x00, 0xb4,0x00,0x48,0x11,0x00,0x00,0x00,0x58,0x01,0x05,0xfa,0x01,0x3e,0x00,0x00, 0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, 0x58,0x00,0x5e,0x00,0x34,0x0a,0x80,0x00,0x02,0xac,0x01,0x01,0xfe,0x01,0x28, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, 0x00,0x00,0x74,0x00,0x34,0x00,0x54,0xa9,0x10,0x00,0x48,0xe5,0x80,0x02,0x7e, 0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x05,0x00,0x00,0x00,0x00,0x00, 0x00,0xfc,0x00,0x00,0x3e,0x00,0x16,0x00,0x58,0x15,0x42,0x08,0x21,0xa5,0x40, 0x01,0x76,0xe0,0x37,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0xfc,0x00,0x00,0x14,0x00,0x0a,0x00,0x16,0xa2,0x04,0x00,0x48, 0x71,0x80,0x00,0xfe,0xff,0x19,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x48,0x10, 0x01,0x22,0x50,0xa0,0x00,0xfe,0xdf,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x0c, 0x04,0x01,0x04,0x00,0x2c,0x40,0x00,0xbc,0xff,0x0c,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x60,0x00,0xf8,0x1d,0x07,0x00,0x00,0x00, 0x00,0x00,0x02,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x30,0x00,0x8c,0x01,0x07,0xa0, 0x00,0x00,0xa0,0x80,0x01,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x10,0x00,0x0e,0x80, 0x03,0x34,0x01,0x00,0x40,0x60,0x02,0xa3,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0a,0x30,0x00, 0x0e,0xe0,0x03,0x9b,0x00,0x00,0x20,0xac,0xc1,0xfa,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 0x00,0x00,0x07,0xb0,0xc1,0x56,0x02,0x08,0x50,0x54,0x63,0xaf,0x5b,0x00,0x00, 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x02,0x00,0x00,0x07,0xfc,0xe0,0x5b,0x01,0x00,0x90,0xba,0xa1,0xf5,0x3e, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x80,0x87,0x3f,0xb0,0xa2,0x04,0x00,0xa8,0xc2,0xc2, 0x5a,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0xc0,0xff,0x1f,0xf8,0x00,0x01,0x04,0x44, 0x41,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0xc0,0xfe,0x07,0x2c,0x80,0x00, 0x00,0x28,0x80,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0xe0,0xff,0x01,0x1e, 0x80,0x02,0x00,0xa2,0x80,0x01,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x12,0x00,0x00,0xa0,0x7b, 0x00,0x1b,0x40,0x01,0x00,0x14,0x60,0x01,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0xe0,0x00,0x00,0x0f,0x00,0x02,0x01,0x08,0xa0,0x00,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x08, 0x00,0x00,0x70,0x00,0x80,0x06,0xc0,0x00,0x80,0x12,0xa0,0x00,0x0b,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x78,0x00,0x80,0x07,0x20,0x01,0x00,0x04,0x50,0x00,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x00,0x00,0x00,0x28,0x00,0xc0,0x03,0x40,0x20,0x00,0x01,0x68, 0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x60,0x03,0xb0,0x00,0x00, 0x02,0x18,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0xe0,0x01,0x20, 0x08,0x80,0x00,0x2c,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0xe0, 0x01,0x18,0x20,0x00,0x00,0x14,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e, 0x00,0xd0,0x00,0x28,0x80,0x90,0x00,0x14,0x60,0x01,0x00,0x00,0x11,0x11,0x11, 0x11,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0c,0x00,0xf0,0x44,0x14,0x09,0x02,0x54,0x5a,0xa5,0xa9,0xaa,0xaa,0xaa, 0xaa,0xaa,0x4a,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x44, 0x92,0xa4,0x24,0xa7,0xaa,0xf2,0x10,0x4e,0x82,0x44,0x22,0x85,0xd4,0x54,0x55, 0x55,0x55,0x55,0x55,0x35,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x40,0xaa,0xaa, 0x00,0x80,0x20,0x08,0x11,0x07,0x10,0xf1,0x54,0x25,0x49,0x02,0x5b,0xad,0x72, 0x56,0xed,0xb6,0x6a,0xed,0xff,0x6f,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0xaa,0x2a,0x95,0x52,0xaa,0x6b,0x6b,0xf5,0xcb,0xd7,0x60,0x83,0x55, 0x6a,0x2d,0xfb,0xb7,0xdb,0xdf,0xbb,0xaa,0x7a,0x00,0xfc,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0xb0,0x7f,0x01,0x05, 0x08,0x00,0x05,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0xf0,0xee, 0x00,0x00,0x00,0x00,0x05,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00, 0xf0,0x7b,0x80,0x02,0x00,0x80,0x02,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x1f,0x00,0x01,0x00,0x40,0x01,0x14,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x01,0x0e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x0a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x00, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc}; kit/sample/mgprc-sample010064400237450000000000000007010655427575100147570ustar nishidawheel# # this is a sample for ~/.mgprc. # # setting up font directories. # "vfcap" is commented out because it will be guessed by "configure" # in most cases. #vfcap "/usr/local/libdata/vflib/vfontcap" tfdir "/usr/local/share/fonts/ttf" # last resort font for TrueType renderer (FreeType). # this must be specified in full pathname so that it can be used even if # "tfdir" is changed in presentation file. tfont0 "/usr/local/share/fonts/ttf/arial.ttf" kit/sample/multilingual.mgp010064400237450000000000000010600710646440400156440ustar nishidawheel%include "default.mgp" %default 1 fore "blue", font "standard" %default 4 fore "yellow", font "standard" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page MagicPoint for asian multilingual presentation! It may be slow... Japanese ($BF|K\8l(B) 0208-1978 $@$3$s$K$A$O?92*30(B 0208-1983 $B$3$s$K$A$O?92*30(B 0213-2000 $(O$3$s$K$A$O?92*30(B Chinese ($AVPND(B,$AFUM(;0(B,$A::So(B) $ADc:C(B Hangul ($(CGQ1[(B) $(C>H3gGO<H3gGO=J4O1n(B %size 3 (The text was grabbed from mule distribution) kit/sample/sample-fr.mgp010064400237450000000000000100440733520026100150170ustar nishidawheel%include "default.mgp" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %nodefault %fore "red", size 7, font "standard", back "darkblue" %center, fore "yellow", font "thick" MagicPoint %font "standard" %size 4, fore "red" Keio University Yoshifumi Nishida %size 3 nishida@sfc.wide.ad.jp %size 4, fore "yellow" Appuyer sur la barre d'espace!! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 16 0 0 "red" "black" Comment l'utiliser Page suivante -> appuyer sur le premier bouton de la souris Page précedente -> appuyer sur le troisieme bouton de la souris Quitter -> Appuer sur q %center %lcutin test message %center %rcutin test message %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 16 0 0 "red" "black" Les options de la ligne de commande. %prefix " -h:" affiche l'aide . %prefix " -g:" geometry. Positionne la taille et l'emplacement de la fenetre. %prefix " -o:" Do not override window manager. %prefix " -b:" bgcolor. Positionne la couleur de fond. (defaut: noir) %prefix "" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Placez le texte ou vous voulez! %area 40 80 5 20 %fore "red", size 6 %center centre %left gauche %right droite %area 40 80 50 20, leftfill, fore "white" You can make a 2 column page by specifying drawing area. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE Utilisez la fonte que vous voulez! %CENTER %SIZE 10,FORE "orange" Bonjour monde %SIZE 7,FORE "gray" Bonjour monde %SIZE 5,FORE "blue" Bonjour monde %SIZE 4,FORE "yellow" Bonjour monde %SIZE 3,FORE "green" Bonjour monde %SIZE 2,FORE "red" Bonjour monde %SIZE 1,FORE "pink" Bonjour monde %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Choisissez la fonte de votre choix %size 4, fore "red", center %font "standard" Times %font "thick" Arial %font "typewriter" Courier %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page On peut mélanger les fontes Control can be mixed %fore "green", font "standard", size 4 Ceci est un %cont, fore "orange", font "thick", size 6 Message %cont, fore "red", font "typewriter", size 5 de test. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Automatic folding of long line! Hello, this is MagicPoint. I can properly handle the folding opeation of very long line, of course english word-wise. The source code of this line is made up by a single line. This is the next line. Even if the indentation changes, I can handle this! Yey! You can also connect the line using backslash. \ Yes, UNIX tradition. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 16 0 0 "red" "black" Mettez une image %CENTER %IMAGE "cloud.jpg" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE Effets spécial! %fore "red", size 6, center %shrink Message de test %lcutin Message de test %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE Pause Appuyez sur la barre d'espace pour la suite %center, fore "red" Happy hacking! %pause, fore "blue" Happy hacking! %pause, fore "green" Happy hacking! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE Grab command output into foils ls -l /kernel /bsd %size 3, prefix " " %filter "ls -l /kernel /bsd" %endfilter echo "this is test" | rev %filter "rev" this is test %endfilter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE Subprocess (multimedia!) %system "xeyes -geometry %50x20+25+60" Invoke xanim/mpegplay for multimedia presentation! :-) No duplicated subprocess for one declaration. Geometry can be presentation-screen relative. xeyes will vanish if you switch the page. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE Bonne journée. Allez voir %font "typewriter" http://www.mew.org/mgp/ %font "standard" pour de nouvelles aventures. kit/sample/sample-jp-xft.mgp010064400237450000000000000237641027614473100156440ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% This default.mgp is "TrueType fonts" oriented. %% First, you should create "~/.mgprc" whose contents are: %% tfdir "/path/to/truetype/fonts" %% %% To visualize English, install "times.ttf", "arial.ttf", and "cour.ttf" %% into the "tfdir" directory above: %% http://microsoft.com/typography/fontpack/default.htm %% %% To visualize Japanese, install "MSMINCHO.ttf" and %% "watanabenabe-mincho.ttf" into the "tfdir" directory above: %% http://www.mew.org/mgp/xtt-fonts_0.19981020-3.tar.gz %% %deffont "thick" xfont "helvetica-bold-r", xfont "Kochi Gothic" "jisx0208.1983" %deffont "standard" xfont "helvetica-medium-r", xfont "Kochi Gothic" "jisx0208.1983" %deffont "typewriter" xfont "courier-medium-r", xfont "Kochi Gothic" "jisx0208.1983" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings per each line numbers. %% %default 1 area 90 90, leftfill, size 2, fore "gray20", back "white", font "standard", hgap 0 %default 2 size 5, hgap 20, vgap 10, prefix " ", ccolor "black" %default 3 size 2, hgap 10, bar "gray70", vgap 10 %default 4 size 4, hgap 10, fore "gray20", vgap 30, prefix " ", font "standard" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings that are applied to TAB-indented lines. %% %tab 1 size 4, vgap 40, prefix " ", icon box "green" 50 %tab 2 size 3.5, vgap 40, prefix " ", icon arc "yellow" 50 %tab 3 size 3, vgap 40, prefix " ", icon delta3 "white" 40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %nodefault %size 6.5, font "standard", back "white", ccolor "black" %center, fore "Blue", font "standard", hgap 60, size 6.5 MAGIC POINT %bar "skyblue" 6 15 70 %font "standard", hgap 0, size 4.5 %fore "darkblue" $B@>ED2B;K(B Yoshifumi Nishida %size 4 nishida@csl.sony.co.jp %size 3.5, fore "black", hgap 20 SPC $B%-!<$r2!$7$F2<$5$$(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 0 0 "white" "blue" $B;H$$J}(B $B#1%Z!<%8?J$`(B $B:8%\%?%s(B SPC $B#1%Z!<%8La$k(B $B1&%\%?%s(B DEL MagicPoint $B$r=*N;$9$k(B q %size 4.5, fore "yellow" $B$=$l$G$OFCD'$r$_$F$$$-$^$7$g$&(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 0 0 "white" "blue" $B%&%$%s%I%&(B $BDL>o$OA42hLL$r;H$$$^$9(B $B2hLL$NBg$-$5$r<+F0H=Dj$7$FI=<($G$-$^$9(B %size 5, fore "yellow", font "typewriter" mgp -o -g 400x300 sample-jp.mgp %font "standard", fore "gray20", size 5 $B$NMM$KBg$-$5$N;XDj$b$G$-$^$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 0 0 "white" "blue" $BI=<(0LCV@)8f(B %area 40 80 5 20 $BI=<($N0LCV$r@)8f$G$-$^$9(B %fore "red" %center $B%;%s%?%j%s%0(B %left $B:84s$;(B %right $B1&4s$;(B %area 40 80 50 20, leftfill, fore "black" $BI=<(HO0O$r;XDj$9$k$3$H$G!"(B2$B%+%i%`$K$9$k$3$H$b$G$-$^$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "white" "blue" $BJ8;z$NBg$-$5$H?'(B $B$5$^$6$^$JBg$-$5$NJ8;z$rI=<($G$-$^$9(B %SIZE 5 %CENTER %SIZE 10,FORE "orange" $BK\F|$O@2E7$J$j(B %SIZE 7,FORE "gray" $BK\F|$O@2E7$J$j(B %SIZE 5,FORE "blue" $BK\F|$O@2E7$J$j(B %SIZE 4,FORE "yellow" $BK\F|$O@2E7$J$j(B %SIZE 3,FORE "green" $BK\F|$O@2E7$J$j(B %SIZE 2,FORE "red" $BK\F|$O@2E7$J$j(B %SIZE 1,FORE "pink" $BK\F|$O@2E7$J$j(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 90 0 "red" "white" $B%U%)%s%H(B $B$5$^$6$^$J%U%)%s%H$,;XDj$G$-$^$9(B %size 6, fore "blue", center %font "standard" $B$3$l$OL@D+(B %font "thick" $B$3$l$O%4%7%C%/(B %size 6 %font "standard" This is Standard %font "thick" This is Thick %font "typewriter" This is Typewriter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 90 0 "red" "white" $B9TFb$G$NB0@-JQ99(B $B9T$NESCf$G$bB0@-$rJQ$($i$l$^$9(B %size 6, fore "blue", center $B;d$NL>A0$O(B %cont, fore "green", font "thick", size 8 $B@>ED(B %cont, fore "red", font "typewriter", size 4 $B$G$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page $B9T$N@^$j6J$2(B $B$3$s$J$U$&$K$H$F$bD9$$9T$b$-$A$s$H@^$j6J$2$FI=<($7$F$$$^$9!#%=!<%9%3!<%ICf$G$O$3$3$O(B1$B9T$H$7$F=q$+$l$F$$$^$9(B $B$3$3$,fIW!#(B\ UNIX$B$H$$$&$/$i$$$G!"%=!<%9$N9T$O%P%C%/%9%i%C%7%e$GO"7k$G$-$^$9(B A quick brown fox jumps over the lazy dog. A quick brown fox jumps over the lazy dog. $B9TKv6XB'(B($B!V!#!W$H$+$r9TF,$K$@$5$J$$(B)$B$7$F$^$9!#%&%$%s%I%&$NI}$r$+$($F$_$F$M(B $B1Q8l$OC18lC10L$G2~9T$7$^$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B2hA|(B $B%$%a!<%8!&%U%!%$%k$rI=<($G$-$^$9(B %CENTER %IMAGE "cloud.jpg" $B$3$l$OAp4"@i>=$5$s$N:nIJ$G$9(B $B$"$j$,$H$&(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $BBP1~$7$F$$$k2hA|(B ($BB?J,(B)$BI=<(2DG=$J%$%a!<%8!&%U%)!<%^%C%H$O0J2<$NDL$j$G$9(B %CENTER,SIZE 3,FORE "red", xfont "times-medium-r" FBM Image Sun Rasterfile CMU WM Raster Portable Bit Map (PBM, PGM, PPM) Faces Project Utah RLE Image JFIF-style JPEG Image X Window Dump McIDAS areafile G3 FAX Image PC Paintbrush Image GEM Bit Image MacPaint Image X Pixmap, Bitmap %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B2hA|$N3HBg$H=L>.(B $B2#$r(B1.5$BG\!"=D$r(B1/3$B$7$?>l9g(B %center, image "cloud.jpg" 0 150 33 1 %leftfill $B2#$r2hLL$NI}$N(B50%$B!"=D$r2hLL$NI}$N(B30%$B$K$7$?>l9g(B %center, image "cloud.jpg" 0 50 30 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B2hA|$N8:?'(B 256$B?'"*(B16$B?'"*(B4$B?'"*(B2$B?'$K8:?'$7$?>l9g(B %left, image "cloud.jpg" 256 40 40 1, cont %image "cloud.jpg" 16 40 40 1, cont %image "cloud.jpg" 4 40 40 1, cont %image "cloud.jpg" 2 40 40 1, cont %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B$3$s$J$3$H$b(B... %CENTER %SHRINK %FORE "red", size 5 $BK\F|$O@2E7$J$j(B %rcutin, FORE "blue" $BK\F|$O@2E7$J$j(B %lcutin, fore "green" $BK\F|$O@2E7$J$j(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B0l9T$:$DI=<((B SPC $B$r(B 2 $B2s2!$7$F2<$5$$(B %size 5, center, fore "red" $BK\F|$O@2E7$J$j(B %pause, fore "blue" $BK\F|$O@2E7$J$j(B %pause, fore "green" $BK\F|$O@2E7$J$j(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B%"%K%a!<%7%g%s(B SPC $B$r2!$7$F2<$5$$(B %center, fore "white" %mark, image "mgp-old1.jpg" %pause, again, mark, image "mgp-old2.jpg" %again, mark, image "mgp-old3.jpg" %again, mark, image "mgp-old2.jpg" %again, mark, image "mgp-old1.jpg" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B%3%^%s%I$N=PNO(B $B;R%W%m%;%9$N7k2L$rI=<($G$-$^$9(B % ls -l /kernel /bsd %size 3, prefix " " %filter "ls -l /kernel /bsd" %endfilter % echo this is test | rev %filter "rev" this is test %endfilter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B%5%V%W%m%;%9$N5/F0(B %system "xeyes -geometry %50x15+25+80" xanim$B$r8F$s$G%W%l%<%s$KF02h$rE=$m$&(B! $B#19T$NL?Na$OF1;~$K#1%W%m%;%9$7$+5/F0$7$^$;$s(B ($B$=$N%Z!<%8$r:FEYI=<($7$F$b0B?4$G$9(B) $B%W%l%<%s2hLL$KBP$9$kAjBPCM$G(Bgeometry$B$r;XDj$G$-$^$9(B $B%Z!<%8$r0\$k$H(Bxeyes$B$O;`$K$^$9(B ($B;&$5$J$$@_Dj$b$G$-$^$9(B) %leftfill, size 3 MagicPoint $B$r(B "-g" $B%*%W%7%g%sIU$-$G5/F0$7$F$$$k>l9g$O!"l9g$,$"$j$^$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B%5%V%W%m%;%9$ND%$j$D$1(B $B%5%V%W%m%;%9$r%&%$%s%I%&$KD%$j$D$1$i$l$^$9(B %xsystem "xeyes -geometry %50x10+25+60" $B%;%s%?%j%s%0$b0l1~$G$-$^$9(B %center %xsystem "xclock -geometry %30x30+25+60 -update 1 -bg white -fg blue -hands green" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% %PAGE %%% %%% $B%3%^%s%I$N=PNO(B - $B$"$o$;$o$6(B %%% %%% $BF0E*$K%0%i%U$r@8@.$7$^$9(B %%% %%% %filter "gnuplot" %%% set output "/tmp/hoge.pbm" %%% set term pbm %%% plot sin(x) %%% %endfilter %%% %system "xv -geometry %50x50+25+40 /tmp/hoge.pbm" %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "skyblue" "white" $B$=$NB>$N5!G=(B $B2hA|$r(B tab $B%3%^%s%I$K;XDj$G$-$^$9(B $B2U>r=q$-MQ%"%$%3%s(B( %cont %icon box "green" 50 %icon arc "green" 50 %icon delta1 "green" 50 %icon delta2 "green" 50 %icon delta3 "green" 50 %icon delta4 "green" 50 %icon dia "green" 50 )$B$,IA$1$^$9(B $BB0@-$,:.$6$C$?%F%-%9%H$b@5$7$/%;%s%?%j%s%0$G$-$^$9(B %center, size 5 $B;d$NL>A0$O(B %cont, fore "green", font "thick", size 10 $B@>ED(B %cont, fore "red", font "typewriter", size 4 $B$G$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "skyblue" "white" %pcache 1 1 0 0 $B@hFI$_5!G=(B $B#1%Z!<%8@h$NFbMF$r%-%c%C%7%e$7$^$9(B $B#2$D$N;XDjJ}K!$,$"$j$^$9(B %fore "red" -F %cont, fore "gray20" option $B$r;H$&(B " %cont, fore "red" pcache %cont, fore "gray20" " $B%3%^%s%I$r;H$&(B $B%-%c%C%7%e5!G=$K$h$jIA2h=hM}$,9bB.$K$J$j$^$9(B SPC$B%-!<$r2!$7$F2<$5$$(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "skyblue" "white" %pcache 1 1 1 30 $B@hFI$_5!G=$NFCpJs$O(B %font "typewriter" http://member.wide.ad.jp/wg/mgp/ %font "standard" $B$K7G<($5$l$^$9$N$G8fMw$/$@$5$$(B $B%3%a%s%H$,$"$l$P(B %font "typewriter" mgp-users-jp@Mew.org %font "standard" $B$^$GAw$C$F2<$5$$(B kit/sample/sample-jp.mgp010064400237450000000000000240301012160231700150140ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% This default.mgp is "TrueType fonts" oriented. %% First, you should create "~/.mgprc" whose contents are: %% tfdir "/path/to/truetype/fonts" %% %% To visualize English, install "times.ttf", "arial.ttf", and "cour.ttf" %% into the "tfdir" directory above: %% http://microsoft.com/typography/fontpack/default.htm %% %% To visualize Japanese, install "MSMINCHO.ttf" and %% "watanabenabe-mincho.ttf" into the "tfdir" directory above: %% http://www.mew.org/mgp/xtt-fonts_0.19981020-3.tar.gz %% %deffont "thick" xfont "helvetica-bold-r", tfont "thick.ttf", tmfont "goth.ttf" %deffont "standard" xfont "helvetica-medium-r", tfont "standard.ttf", tmfont "kochi-mincho.ttf" %deffont "typewriter" xfont "courier-medium-r", tfont "typewriter.ttf", tmfont "goth.ttf" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings per each line numbers. %% %default 1 area 90 90, leftfill, size 2, fore "gray20", back "white", font "standard", hgap 0 %default 2 size 5, hgap 20, vgap 10, prefix " ", ccolor "black" %default 3 size 2, hgap 10, bar "gray70", vgap 10 %default 4 size 4, hgap 10, fore "gray20", vgap 30, prefix " ", font "standard" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings that are applied to TAB-indented lines. %% %tab 1 size 4, vgap 40, prefix " ", icon box "green" 50 %tab 2 size 3.5, vgap 40, prefix " ", icon arc "yellow" 50 %tab 3 size 3, vgap 40, prefix " ", icon delta3 "white" 40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %nodefault %size 6.5, font "standard", back "white", ccolor "black" %center, fore "Blue", font "standard", hgap 60, size 6.5 MAGIC POINT %bar "skyblue" 6 15 70 %font "standard", hgap 0, size 4.5 %fore "darkblue" $B@>ED2B;K(B Yoshifumi Nishida %size 4 nishida@csl.sony.co.jp %size 3.5, fore "black", hgap 20 SPC $B%-!<$r2!$7$F2<$5$$(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 0 0 "white" "blue" $B;H$$J}(B $B#1%Z!<%8?J$`(B $B:8%\%?%s(B SPC $B#1%Z!<%8La$k(B $B1&%\%?%s(B DEL MagicPoint $B$r=*N;$9$k(B q %size 4.5, fore "yellow" $B$=$l$G$OFCD'$r$_$F$$$-$^$7$g$&(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 0 0 "white" "blue" $B%&%$%s%I%&(B $BDL>o$OA42hLL$r;H$$$^$9(B $B2hLL$NBg$-$5$r<+F0H=Dj$7$FI=<($G$-$^$9(B %size 5, fore "yellow", font "typewriter" mgp -o -g 400x300 sample-jp.mgp %font "standard", fore "gray20", size 5 $B$NMM$KBg$-$5$N;XDj$b$G$-$^$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 0 0 "white" "blue" $BI=<(0LCV@)8f(B %area 40 80 5 20 $BI=<($N0LCV$r@)8f$G$-$^$9(B %fore "red" %center $B%;%s%?%j%s%0(B %left $B:84s$;(B %right $B1&4s$;(B %area 40 80 50 20, leftfill, fore "black" $BI=<(HO0O$r;XDj$9$k$3$H$G!"(B2$B%+%i%`$K$9$k$3$H$b$G$-$^$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "white" "blue" $BJ8;z$NBg$-$5$H?'(B $B$5$^$6$^$JBg$-$5$NJ8;z$rI=<($G$-$^$9(B %SIZE 5 %CENTER %SIZE 10,FORE "orange" $BK\F|$O@2E7$J$j(B %SIZE 7,FORE "gray" $BK\F|$O@2E7$J$j(B %SIZE 5,FORE "blue" $BK\F|$O@2E7$J$j(B %SIZE 4,FORE "yellow" $BK\F|$O@2E7$J$j(B %SIZE 3,FORE "green" $BK\F|$O@2E7$J$j(B %SIZE 2,FORE "red" $BK\F|$O@2E7$J$j(B %SIZE 1,FORE "pink" $BK\F|$O@2E7$J$j(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 90 0 "red" "white" $B%U%)%s%H(B $B$5$^$6$^$J%U%)%s%H$,;XDj$G$-$^$9(B %size 6, fore "blue", center %font "standard" $B$3$l$OL@D+(B %font "thick" $B$3$l$O%4%7%C%/(B %size 6 %font "standard" This is Standard %font "thick" This is Thick %font "typewriter" This is Typewriter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 90 0 "red" "white" $B9TFb$G$NB0@-JQ99(B $B9T$NESCf$G$bB0@-$rJQ$($i$l$^$9(B %size 6, fore "blue", center $B;d$NL>A0$O(B %cont, fore "green", font "thick", size 8 $B@>ED(B %cont, fore "red", font "typewriter", size 4 $B$G$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page $B9T$N@^$j6J$2(B $B$3$s$J$U$&$K$H$F$bD9$$9T$b$-$A$s$H@^$j6J$2$FI=<($7$F$$$^$9!#%=!<%9%3!<%ICf$G$O$3$3$O(B1$B9T$H$7$F=q$+$l$F$$$^$9(B $B$3$3$,fIW!#(B\ UNIX$B$H$$$&$/$i$$$G!"%=!<%9$N9T$O%P%C%/%9%i%C%7%e$GO"7k$G$-$^$9(B A quick brown fox jumps over the lazy dog. A quick brown fox jumps over the lazy dog. $B9TKv6XB'(B($B!V!#!W$H$+$r9TF,$K$@$5$J$$(B)$B$7$F$^$9!#%&%$%s%I%&$NI}$r$+$($F$_$F$M(B $B1Q8l$OC18lC10L$G2~9T$7$^$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B2hA|(B $B%$%a!<%8!&%U%!%$%k$rI=<($G$-$^$9(B %CENTER %IMAGE "cloud.jpg" $B$3$l$OAp4"@i>=$5$s$N:nIJ$G$9(B $B$"$j$,$H$&(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $BBP1~$7$F$$$k2hA|(B ($BB?J,(B)$BI=<(2DG=$J%$%a!<%8!&%U%)!<%^%C%H$O0J2<$NDL$j$G$9(B %CENTER,SIZE 3,FORE "red", xfont "times-medium-r", tfont "times.ttf" FBM Image Sun Rasterfile CMU WM Raster Portable Bit Map (PBM, PGM, PPM) Faces Project Utah RLE Image JFIF-style JPEG Image X Window Dump McIDAS areafile G3 FAX Image PC Paintbrush Image GEM Bit Image MacPaint Image X Pixmap, Bitmap %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B2hA|$N3HBg$H=L>.(B $B2#$r(B1.5$BG\!"=D$r(B1/3$B$7$?>l9g(B %center, image "cloud.jpg" 0 150 33 1 %leftfill $B2#$r2hLL$NI}$N(B50%$B!"=D$r2hLL$NI}$N(B30%$B$K$7$?>l9g(B %center, image "cloud.jpg" 0 50 30 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B2hA|$N8:?'(B 256$B?'"*(B16$B?'"*(B4$B?'"*(B2$B?'$K8:?'$7$?>l9g(B %left, image "cloud.jpg" 256 40 40 1, cont %image "cloud.jpg" 16 40 40 1, cont %image "cloud.jpg" 4 40 40 1, cont %image "cloud.jpg" 2 40 40 1, cont %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B$3$s$J$3$H$b(B... %CENTER %SHRINK %FORE "red", size 5 $BK\F|$O@2E7$J$j(B %rcutin, FORE "blue" $BK\F|$O@2E7$J$j(B %lcutin, fore "green" $BK\F|$O@2E7$J$j(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B0l9T$:$DI=<((B SPC $B$r(B 2 $B2s2!$7$F2<$5$$(B %size 5, center, fore "red" $BK\F|$O@2E7$J$j(B %pause, fore "blue" $BK\F|$O@2E7$J$j(B %pause, fore "green" $BK\F|$O@2E7$J$j(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B%"%K%a!<%7%g%s(B SPC $B$r2!$7$F2<$5$$(B %center, fore "white" %mark, image "mgp-old1.jpg" %pause, again, mark, image "mgp-old2.jpg" %again, mark, image "mgp-old3.jpg" %again, mark, image "mgp-old2.jpg" %again, mark, image "mgp-old1.jpg" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B%3%^%s%I$N=PNO(B $B;R%W%m%;%9$N7k2L$rI=<($G$-$^$9(B % ls -l /kernel /bsd %size 3, prefix " " %filter "ls -l /kernel /bsd" %endfilter % echo this is test | rev %filter "rev" this is test %endfilter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B%5%V%W%m%;%9$N5/F0(B %system "xeyes -geometry %50x15+25+80" xanim$B$r8F$s$G%W%l%<%s$KF02h$rE=$m$&(B! $B#19T$NL?Na$OF1;~$K#1%W%m%;%9$7$+5/F0$7$^$;$s(B ($B$=$N%Z!<%8$r:FEYI=<($7$F$b0B?4$G$9(B) $B%W%l%<%s2hLL$KBP$9$kAjBPCM$G(Bgeometry$B$r;XDj$G$-$^$9(B $B%Z!<%8$r0\$k$H(Bxeyes$B$O;`$K$^$9(B ($B;&$5$J$$@_Dj$b$G$-$^$9(B) %leftfill, size 3 MagicPoint $B$r(B "-g" $B%*%W%7%g%sIU$-$G5/F0$7$F$$$k>l9g$O!"l9g$,$"$j$^$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE $B%5%V%W%m%;%9$ND%$j$D$1(B $B%5%V%W%m%;%9$r%&%$%s%I%&$KD%$j$D$1$i$l$^$9(B %xsystem "xeyes -geometry %50x10+25+60" $B%;%s%?%j%s%0$b0l1~$G$-$^$9(B %center %xsystem "xclock -geometry %30x30+25+60 -update 1 -bg white -fg blue -hands green" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% %PAGE %%% %%% $B%3%^%s%I$N=PNO(B - $B$"$o$;$o$6(B %%% %%% $BF0E*$K%0%i%U$r@8@.$7$^$9(B %%% %%% %filter "gnuplot" %%% set output "/tmp/hoge.pbm" %%% set term pbm %%% plot sin(x) %%% %endfilter %%% %system "xv -geometry %50x50+25+40 /tmp/hoge.pbm" %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "skyblue" "white" $B$=$NB>$N5!G=(B $B2hA|$r(B tab $B%3%^%s%I$K;XDj$G$-$^$9(B $B2U>r=q$-MQ%"%$%3%s(B( %cont %icon box "green" 50 %icon arc "green" 50 %icon delta1 "green" 50 %icon delta2 "green" 50 %icon delta3 "green" 50 %icon delta4 "green" 50 %icon dia "green" 50 )$B$,IA$1$^$9(B $BB0@-$,:.$6$C$?%F%-%9%H$b@5$7$/%;%s%?%j%s%0$G$-$^$9(B %center, size 5 $B;d$NL>A0$O(B %cont, fore "green", font "thick", size 10 $B@>ED(B %cont, fore "red", font "typewriter", size 4 $B$G$9(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "skyblue" "white" %pcache 1 1 0 0 $B@hFI$_5!G=(B $B#1%Z!<%8@h$NFbMF$r%-%c%C%7%e$7$^$9(B $B#2$D$N;XDjJ}K!$,$"$j$^$9(B %fore "red" -F %cont, fore "gray20" option $B$r;H$&(B " %cont, fore "red" pcache %cont, fore "gray20" " $B%3%^%s%I$r;H$&(B $B%-%c%C%7%e5!G=$K$h$jIA2h=hM}$,9bB.$K$J$j$^$9(B SPC$B%-!<$r2!$7$F2<$5$$(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "skyblue" "white" %pcache 1 1 1 30 $B@hFI$_5!G=$NFCpJs$O(B %font "typewriter" http://member.wide.ad.jp/wg/mgp/ %font "standard" $B$K7G<($5$l$^$9$N$G8fMw$/$@$5$$(B $B%3%a%s%H$,$"$l$P(B %font "typewriter" mgp-users-jp@Mew.org %font "standard" $B$^$GAw$C$F2<$5$$(B kit/sample/sample.mgp010064400237450000000000000172421074416247000144300ustar nishidawheel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% This default.mgp is "TrueType fonts" oriented. %% First, you should create "~/.mgprc" whose contents are: %% tfdir "/path/to/truetype/fonts" %% %% To visualize English, install "times.ttf", "arial.ttf", and "cour.ttf" %% into the "tfdir" directory above: %% http://microsoft.com/typography/fontpack/default.htm %% %% To visualize Japanese, install "MSMINCHO.ttf" and %% "watanabenabe-mincho.ttf" into the "tfdir" directory above: %% http://www.mew.org/mgp/xtt-fonts_0.19981020-3.tar.gz %% %deffont "standard" xfont "helvetica-medium-r", tfont "standard.ttf", tmfont "hoso6.ttf" %deffont "thick" xfont "helvetica-bold-r", tfont "thick.ttf", tmfont "hoso6.ttf" %deffont "typewriter" xfont "courier-medium-r", tfont "typewriter.ttf", tmfont "hoso6.ttf" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings per each line numbers. %% %default 1 area 90 90, leftfill, size 2, fore "gray20", back "white", font "standard", hgap 0 %default 2 size 7, vgap 10, prefix " ", ccolor "black" %default 3 size 2, bar "gray70", vgap 10 %default 4 size 5, fore "gray20", vgap 30, prefix " ", font "standard" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings that are applied to TAB-indented lines. %% %tab 1 size 5, vgap 40, prefix " ", icon box "green" 50 %tab 2 size 4, vgap 40, prefix " ", icon arc "yellow" 50 %tab 3 size 3, vgap 40, prefix " ", icon delta3 "white" 40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %nodefault %size 6.5, font "standard", back "white", ccolor "black" %center, fore "Blue", font "standard", hgap 60, size 6.5 MAGIC POINT %bar "skyblue" 6 15 70 %font "standard", hgap 0 %size 5, fore "darkblue" Yoshifumi Nishida %size 4.5 nishida@csl.sony.co.jp %size 3, fore "black", hgap 20 TYPE SPC KEY!! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 0 0 "white" "blue" How to Use forward page -> press mouse1 button backward page -> press mouse3 button quit -> press q key %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 90 0 "red" "white" Command Line Option %prefix " -h:" display usage. %prefix " -g:" geometry. Set the size of window, and placement. %prefix " -o:" Do not override window manager. %prefix " -b:" bgcolor. Set background color to bgcolor. (default: black) %prefix "" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 0 0 256 0 0 "green" "white" Place text whereever you like! %area 40 80 5 20 %fore "red", size 6 %center CENTER %left LEFT %right RIGHT %area 40 80 50 20, leftfill, fore "black" You can make a 2 column page by specifying drawing area. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 25 25 256 45 1 "gray" "gray" "white" "white" "white" "white" "gray" "gray" Use any font size as you like! %CENTER %SIZE 10,FORE "orange" Hello World %SIZE 7,FORE "gray" Hello World %SIZE 5,FORE "blue" Hello World %SIZE 4,FORE "yellow" Hello World %SIZE 3,FORE "green" Hello World %SIZE 2,FORE "red" Hello World %SIZE 1,FORE "pink" Hello World %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 256 45 1 "gray" "gray" "white" "white" "white" "white" "gray" "gray" Fonts are selectable %size 5, fore "red", center %font "standard", hgap 20 This is Times %font "thick" This is Thick %font "typewriter" This is Courier %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %bgrad 25 25 256 45 1 "gray" "gray" "white" "white" "white" "white" "gray" "gray" Control can be mixed %center %fore "green", font "standard", size 6 This is a %cont, fore "orange", font "thick", size 10 Test %cont, fore "red", font "typewriter", size 8 message %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Automatic folding of long line! Hello, this is MagicPoint. I can properly handle the folding opeation of very long line, of course english word-wise. The source code of this line is made up by a single line. This is the next line. Even if the indentation changes, I can handle this! Yey! You can also connect the line using backslash. \ Yes, UNIX tradition. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE Visualize inline images! %CENTER %IMAGE "cloud.jpg" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "white" "blue" Special effects! %fore "red", size 6, center %shrink a test message %lcutin another test message %rcutin yet another test message %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "white" "blue" Pause Type SPC key (twice) to proceed. %center, fore "red", hgap 20 Happy hacking! %pause, fore "blue" Happy hacking! %pause, fore "green" Happy hacking! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "white" "blue" Grab command output into foils ls -l /kernel /bsd %size 3, prefix " " %filter "ls -l /kernel /bsd" %endfilter echo "this is test" | rev %filter "rev" this is test %endfilter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "white" "blue" Subprocess (multimedia!) %system "xeyes -geometry %50x20+25+60" Invoke xanim/mpegplay for multimedia presentation! :-) No duplicated subprocess for one declaration. Geometry can be presentation-screen relative. xeyes will vanish if you switch the page. If you executed MagicPoint with the "-g" option, click to go to the next page. SPC may not work in this case %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE Embed Subprocess You can embed X applications in MagicPoint! An example %center %xsystem "xclock -geometry %30x30+25+60 -update 1 -bg white -fg blue -hands green" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE New Features in Recent Versions Supersript and subscript You can use superscript and subscript like %setsup 65 25 65, cont H %cont, sub 2 %cont O, Ca %cont, sup 2+ %tsystem directive If %xsystem does not work properly on your system, please try to use %tsystem instead %center %tsystem "xclock -geometry %30x30+25+60 -update 1 -bg white -fg blue -hands green" %left Image rotation You can rotate your image with newimage directive %center, newimage -xscrzoom 15 -rotate 90 "cloud.jpg" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "skyblue" "white" %PCACHE 1 1 0 30 Forward page cache (1) The next slide is cached inwardly by using '%pcache' directive -F option Next slide will appear quicker than before! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "skyblue" "white" %PCACHE 1 1 1 50 Forward page cache (2) You can specify 'special effect' for the forward page cache. tap space bar to see the 'special effect'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %back "white" Enlarging Images in Slides You can enlarge images by clicking on them Use -zoomonclk option in %newimage Click the following image to see this feature %center, newimage -xscrzoom 20 -zoomonclk 87 "cloud.jpg" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %PAGE %bgrad 0 0 256 0 0 "skyblue" "white" %PCACHE 0 Have a nice day! Visit %font "typewriter", fore "blue" http://member.wide.ad.jp/wg/mgp/ %fore "gray20", font "standard" for upcoming information. kit/sample/sendmail6-jp.mgp010064400237450000000000000036300725440026500154330ustar nishidawheel%include "default.mgp" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %nodefault %size 7, font "standard", fore "white", center IPv4/v6 $B4D6-$G$N(B SMTP %size 4 $B;3K\OBI'(B WIDE $B%W%m%8%'%/%H(B v6@wide.ad.jp %font "typewriter" http://www.v6.wide.ad.jp/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page IPv4/v6 $B4D6-$N(B SMTP $B$K8~$1$F(B IPv4/v6 MTAs -- $B%Q%C%A$O$9$G$K$"$k(B IPv4/v6 MUAs -- $B$@$$$?$$(B OK (pop6) DNS $B%G!<%?%Y!<%9$N(B %cont, font "typewriter" "IN AAAA" %cont, font "standard" $B%l%3!<%I$O!"8E$-NI$-(B MTAs/DNS $B%5!<%P$K$I$N$h$&$J1F6A$rM?$($k$+!)(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page $B to be done For safety, use "v6" prefix in domain name for experiment v6.wide.ad.jp kit/sample/tutorial-jp.mgp010064400237450000000000000057000676156117700154300ustar nishidawheel%include "default.mgp" %default 1 bgrad %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %nodefault %center, size 7, font "standard", fore "white", vgap 20 $B$h$$;R$N(B %image "mgp-old1.jpg" 800x600 $BA`:n%^%K%e%"%k(B %fore "yellow", size 5 $Bl9g$K$O!"(B g $B$H2!$7$F2<$5$$!#(B $B$O%Z!<%8$NHV9f$G$9!#(B %fore "yellow" "2g" $B$H2!$7$F(B 1 $B%Z!<%8L\$K9T$-!"(B "5g" $B$H2!$7$Fe$K%^%&%9$r;}$C$F$$$/$H!"%?%$%H%k$,I=<($5$l$^$9!#(B($B$J$s$FJXMx(B :) CTL $B$r2!$7$?$^$^:8%\%?%s$G%Z!<%8HV9f$r%/%j%C%/$9$k$H!"$=$N%Z!<%8$K9T$1$^$9!#(B %fore "yellow" CTL $B$r2!$7$F%Z!<%8$N0lMw$rI=<($7!"(B6 $B%Z!<%8$K$"$o$;$F%/%j%C%/$7$^$7$g$&!#(B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page $B0l9T$:$DI=<((B %pause $B%3%^%s%I$r;H$C$F!"0lEY$NI=<($rJ#?t$KJ,3d$G$-$^$9!#(B %fore "yellow" $BC$($^$9!#(B %fore "yellow" G $B$r2!$7$F%,%$%I%i%$%s$rI=<($5$;!"(BSPC $B$GC$9$K$O!"(B l ($B%(%k(B)$B$r2!$7$^$7$g$&!#(B %fore "yellow" $BMn=q$rN}=,$7$?$i!" g Here, means the page number. %fore "yellow" Please type "2g" to jump to the second page, then type "5g" to go forward to the next page. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Displaying a list of pages To display a list of pages, Type CTL When you move your mouse on to one of the pages, you can see its title. (How cool!) Clicking the left button on a page pressing CTL, you can jump to the page %fore "yellow" Type CTL to display a list of pages, and move your mouse on to the page 6. Then click the left. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Displaying lines step by step %pause command splits pages %fore "yellow" Type SPC hoping to go to the next page. %pause %fore "red" Here here here! %fore "yellow" Let's go to the next page. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Displaying guideline To display page number and titles both for the next and the previous, Type G One more typing G makes the guideline disappeared. %fore "yellow" Type G. Then go to the next page with guideline. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Jotting To draw arrow/underline/etc onto the foil, Type x to display a pen Press the left button to draw One more typing x bring you back to the normal mode. To erase your masterpiece Type l (el not one) %fore "yellow" After practice of jotting, please go to the next page. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Good night It is the time for good boys and girls to go to bed %right by Kazu@ZZZzzz... kit/sample/v6-jp.mgp010064400237450000000000000040010725440026500140750ustar nishidawheel%include "default.mgp" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %nodefault %size 7, font "standard", fore "white", vgap 20 %center IPv6 $B$N35MW$H(B 6bone $B$NF08~(B %size 4 IIJ $B5;=Q8&5f=j(B $B;3K\OBI'(B kazu@iijlab.net %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page $B]%"%I%l%9$O!"<+J,$N2>$N%"%I%l%9(B $BBP>]%"%I%l%9$,=EJ#$7$?>l9g(B $B6aNYDLCN$G=EJ#$rCN$i$;$k(B $B=*E@%"%I%l%9$O%j%s%/%m!<%+%kA4%N!<%I!&%^%k%A%-%c%9%H(B kit/sample/v6.mgp010064400237450000000000000034760725440026500135050ustar nishidawheel%include "default.mgp" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %nodefault %size 7, font "standard", fore "white", vgap 20, center Overview of IPv6 and Recent Activities on 6bone %size 4 IIJ Research Laboratory Kazu YAMAMOTO kazu@iijlab.net %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Why IPng? Preventing expansion of routing table One class B for one site Exhaustion of class B Assignment of multiple class Ces Expansion of routing table Inventing CIDR Nonetheless, the Internet is growing Exhaustion of entire IPv4 address space %fore "yellow" Need IP with huge address space %fore "white" IPng or IP next generation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Features of IPv6 Enlarging address 2^32 = 43 million -> 2^128 = 3.4 x 10^38 Simplifying IP header Deleting Header Length, TOS, Offset Header Daiy Chain Kicking out rare options (e.g. fragment) Defining flexible options Plug and Play Obtain default routes and prefixes Security IPsec is a MUST %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page IPv6 header %center, size 2 %image "v6header.eps" 800x600 %%image "v6header.jpg" 800x600 %leftfill 4 times for address length, twice of header length Options are implemented by extension headers Maximum Hop Limit is 255 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Duplicate Address Detection %center, size 2 %image "dad.eps" 800x600 %%image "dad.jpg" 800x600 %leftfill Sending Neighbor Solicitation Message Dst is Solicitation Multicast Address Src is Unspecified Address (::) Target is my tentative address When conflicted Announce the duplication by Neighbor Solicitation Dst is Link-Local All Node Multicast kit/sample/v6header.eps010064400237450000000000000213530643233470500146560ustar nishidawheel%! %%BoundingBox: 29 588 334 790 %%Title: v6header %%CreationDate: Wed Nov 12 17:29:09 1997 %%Creator: Tgif-2.16J-p12 by William Chia-Wei Cheng (william@cs.UCLA.edu) /tgifdict 4 dict def tgifdict begin %%Title: eucfont.ps % old eucfont.ps(OCFeucfont) and new eucfont.ps(CIDeucfont) were combined. % 1996-09, kawamata@sra.co.jp % Sample Usage: % Operands are only font names permitted. Don't put fontdict itself. % /Courier-Ryumin /Courier /Ryumin-Light-EUC-V eucfont %%Title: CIDeucfont.ps %%Creator: yohtaki@cis.ibaraki.ac.jp %%CreationDate: 1996-9-29 %%EndComments % % CIDeucfont /CIDeucfont { dup findfont /WMode get 1 eq 4 1 roll % push direction info. 12 dict begin /CIDInit /ProcSet findresource begin exch [ 3 1 roll ] beginrearrangedfont 3 -1 roll { % pop direction info /WMode 1 def % vertical font 0 beginusematrix [ 0 1 -1 0 0 0.3 ] endusematrix } if 1 usefont 1 beginbfrange <00> <7F> <00> endbfrange endrearrangedfont end end } def %%Title: OCFeucfont.ps %%Creator: shikida@cs.titech.ac.jp, ueno@cs.titech.ac.jp %%CreationDate: 1991-2-27 %%EndComments % OCFcopyfont /OCFcopyfont { dup maxlength 1 add dict begin { 1 index /FID ne 2 index /UniqueID ne and {def} {pop pop} ifelse } forall currentdict end } bind def % OCFeucfont /OCFeucfont { 12 dict begin dup type /nametype eq { findfont } if dup /WMode known { dup /WMode get /WMode exch def WMode 1 eq { [0.0 1.0 -1.0 0.0 0.0 0.30] makefont } if } if OCFcopyfont dup begin /Encoding Encoding FMapType dup 2 eq { pop 128 128 } { 5 eq { 256 256 } { /compositefont errordict /invalidfont get exec } ifelse } ifelse getinterval def end /kanjifont exch definefont exch dup type /nametype eq { findfont } if exch /FDepVector [ 4 2 roll ] def /FontType 0 def /FMapType 4 def /FontMatrix matrix def /Encoding [ 0 1 ] def /FontBBox {0 0 0 0} def dup /FontName exch def currentdict end definefont pop } def % eucfont /eucfont { dup findfont /FMapType get 9 eq { CIDeucfont} { OCFeucfont} ifelse } def /tgifcentertext { dup stringwidth pop 2 div neg 0 rmoveto } def end %%PageBoundingBox: 29 588 334 790 tgifdict begin /tgifsavedpage save def 1 setmiterlimit 1 setlinewidth 0 setgray 72 0 mul 72 11.70 mul translate 72 128 div 100 mul 100 div dup neg scale gsave % TEXT 0 setgray newpath 168 130 moveto 219 130 lineto 219 153 lineto 168 153 lineto closepath 1 setgray fill 0 setgray /Helvetica-GothicBBB-Medium-EUC-H /Helvetica /GothicBBB-Medium-EUC-H eucfont /Helvetica-GothicBBB-Medium-EUC-H findfont [16 0 0 -16 0 0] makefont setfont gsave 194 148 moveto (\245\257\245\351\245\271) tgifcentertext show grestore % TEXT 0 setgray newpath 143 164 moveto 242 164 lineto 242 187 lineto 143 187 lineto closepath 1 setgray fill 0 setgray /Helvetica-GothicBBB-Medium-EUC-H findfont [16 0 0 -16 0 0] makefont setfont gsave 193 182 moveto (\245\332\245\244\245\355\241\274\245\311\304\271) tgifcentertext show grestore % TEXT 0 setgray newpath 335 164 moveto 434 164 lineto 434 187 lineto 335 187 lineto closepath 1 setgray fill 0 setgray /Helvetica-GothicBBB-Medium-EUC-H findfont [16 0 0 -16 0 0] makefont setfont gsave 385 182 moveto (\274\241\245\330\245\303\245\300\310\326\271\346) tgifcentertext show grestore % TEXT 0 setgray newpath 467 164 moveto 550 164 lineto 550 187 lineto 467 187 lineto closepath 1 setgray fill 0 setgray /Helvetica-GothicBBB-Medium-EUC-H findfont [16 0 0 -16 0 0] makefont setfont gsave 509 182 moveto (\303\346\267\321\270\302\263\246\277\364) tgifcentertext show grestore % TEXT 0 setgray newpath 369 130 moveto 484 130 lineto 484 153 lineto 369 153 lineto closepath 1 setgray fill 0 setgray /Helvetica-GothicBBB-Medium-EUC-H findfont [16 0 0 -16 0 0] makefont setfont gsave 427 148 moveto (\245\325\245\355\241\274\241\246\245\351\245\331\245\353) tgifcentertext show grestore % TEXT 0 setgray /Helvetica-GothicBBB-Medium-EUC-H findfont [16 0 0 -16 0 0] makefont setfont gsave 318 264 moveto (\273\317\305\300\245\242\245\311\245\354\245\271) tgifcentertext show grestore % TEXT 0 setgray /Helvetica-GothicBBB-Medium-EUC-H findfont [16 0 0 -16 0 0] makefont setfont gsave 318 389 moveto (\275\252\305\300\245\242\245\311\245\354\245\271) tgifcentertext show grestore % TEXT 0 setgray /Helvetica-Ryumin-Light-EUC-H /Helvetica /Ryumin-Light-EUC-H eucfont /Helvetica-Ryumin-Light-EUC-H findfont [16 0 0 -16 0 0] makefont setfont gsave 97 151 moveto (Ver) tgifcentertext show grestore % BOX 0 setgray gsave 1.415 setmiterlimit newpath 64 128 moveto 128 128 lineto 128 160 lineto 64 160 lineto closepath stroke 1 setmiterlimit grestore % BOX 0 setgray gsave 1.415 setmiterlimit newpath 256 128 moveto 576 128 lineto 576 160 lineto 256 160 lineto closepath stroke 1 setmiterlimit grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 64 120 moveto 64 128 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 192 120 moveto 192 128 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 320 120 moveto 320 128 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 448 120 moveto 448 128 lineto stroke grestore % TEXT 0 setgray /Courier-GothicBBB-Medium-EUC-H /Courier /GothicBBB-Medium-EUC-H eucfont /Courier-GothicBBB-Medium-EUC-H findfont [24 0 0 -24 0 0] makefont setfont gsave 64 116 moveto (0) tgifcentertext show grestore % TEXT 0 setgray /Courier-GothicBBB-Medium-EUC-H findfont [24 0 0 -24 0 0] makefont setfont gsave 192 116 moveto (8) tgifcentertext show grestore % TEXT 0 setgray /Courier-GothicBBB-Medium-EUC-H findfont [24 0 0 -24 0 0] makefont setfont gsave 320 116 moveto (16) tgifcentertext show grestore % TEXT 0 setgray /Courier-GothicBBB-Medium-EUC-H findfont [24 0 0 -24 0 0] makefont setfont gsave 448 116 moveto (24) tgifcentertext show grestore % BOX 0 setgray gsave 1.415 setmiterlimit newpath 128 128 moveto 256 128 lineto 256 160 lineto 128 160 lineto closepath stroke 1 setmiterlimit grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 576 120 moveto 576 128 lineto stroke grestore % TEXT 0 setgray /Courier-GothicBBB-Medium-EUC-H findfont [24 0 0 -24 0 0] makefont setfont gsave 576 116 moveto (32) tgifcentertext show grestore % BOX 0 setgray gsave 1.415 setmiterlimit newpath 320 160 moveto 448 160 lineto 448 192 lineto 320 192 lineto closepath stroke 1 setmiterlimit grestore % BOX 0 setgray gsave 1.415 setmiterlimit newpath 64 192 moveto 576 192 lineto 576 320 lineto 64 320 lineto closepath stroke 1 setmiterlimit grestore % BOX 0 setgray gsave 1.415 setmiterlimit newpath 64 320 moveto 576 320 lineto 576 448 lineto 64 448 lineto closepath stroke 1 setmiterlimit grestore % BOX 0 setgray gsave 1.415 setmiterlimit newpath 448 160 moveto 576 160 lineto 576 192 lineto 448 192 lineto closepath stroke 1 setmiterlimit grestore % BOX 0 setgray gsave 1.415 setmiterlimit newpath 64 160 moveto 320 160 lineto 320 192 lineto 64 192 lineto closepath stroke 1 setmiterlimit grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 72 224 moveto 64 224 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 72 256 moveto 64 256 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 72 288 moveto 64 288 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 72 352 moveto 64 352 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 72 384 moveto 64 384 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 72 416 moveto 64 416 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 576 224 moveto 568 224 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 576 256 moveto 568 256 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 576 288 moveto 568 288 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 576 352 moveto 568 352 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 576 384 moveto 568 384 lineto stroke grestore % POLY/OPEN-SPLINE 0 setgray gsave newpath 576 416 moveto 568 416 lineto stroke grestore grestore tgifsavedpage restore end %MatchingCreationDate: Wed Nov 12 17:29:09 1997 kit/sample/v6header.jpg010064400237450000000000000610710676156120500146520ustar nishidawheelÿØÿàJFIFÿÛC     ÿÛC   ÿÀc"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?üª®ƒÆ¿|Uð×U‹Lñ†u êRÂ.c³Öì%³™â,Ê$ "©*YnÆ2¤v5ßþϵ÷„,~)xÇD½¸Ò¼Oá¿ #T´•£šÊ[JÃOšD ðÆÚöåuS uÚꌧÂýZû[øñ‡Â÷×·Ò´ËOXé­+y6ú¢ê–iU†6×·0û¬ bŒ QEQEQEQEQEQEQEkIÒoµýVËLÓ,®5Jöd¶µ³´‰¥šy]‚¤hŠ ff ’Hµ¼kð÷Å_ uX´ÏøgXð®¥,"æ;=nÂ[9ž"Ì¢@’*’¥‘Æìc*Gc^«û4Û_k~ø¯¢iõ¿ï.¼>'Ô¼]}xÐÚ[èñ΋wc:¦d+u,¶j ,¬ðÇŒÇs3&®©áÖð7ì¹â˜ ñæñ+Áúˆ, ¶±Ð.n¡‡CÖo"ßM Ü0N[Hî­Ð$M¡¤g‘^Ò`h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢º|BñWÃ]V]OÂ&Ö<+©K ¶’óD¿–Îgˆ²±Œ¼l¤©dC·8ʃØPOøO\ð6»u¢x“FÔ¡kçø±|_§üG°¿½e¿ñ&—%ãí¿“|¦;ŸµÃ ë,€<Šî›eÛ.ÇvŠ`œQEQEQEQEQEkIÒoµýVËLÓ,®5Jöd¶µ³´‰¥šy]‚¤hŠ ff ’Hª×Uቚç‚ü+â-DŸû/ûÊŠûQ´w†ñíU&I,¼Äa›i¼àÒÄÀ«´÷9ÊñO„õÏk·Z'‰4mCÃúծߴiÚ¥«Û\C¹C®øÜ\«+ ŽCÐÖUzÿˆõkí öyÓü%â«Û‹­^çS²Ö<7¥\ÊÓ6‰¥˜oႱŪÞÉsk2ƘiVÙfuÖÏ.WÁ&ÇI¹¼ø‡â +}CÃ>šö¨–xµRHç“O²’0ðI%³¼ûŠ/ÙáC‰^%pWÆ¿|Uð×U‹Lñ†u êRÂ.c³Öì%³™â,Ê$ "©*YnÆ2¤v5ÏׯüzÕ¯µÿüÔõ;ÛGR½ð•åÍÕåÜ­,ÓÊþ#Ö™äwbK31$±$’I5äQEQEQEQEQEQEt ñÿˆ¾j²êžÕ®4]á6驨‘ݺ–RÆ €ß » ÆÊÅD$¤Ž¬kÇ_ üqð¿ì?ð™x7Äûvÿ²nésÙ}£fÝþ_š‹»nôÎ3Ëž¢²¼-á=sÇ:í®‰á½Pñµu»ìúv—j÷7mRí²4› ¬Ç€¤ôì~Ó¾|ñ|ö~,Ñþ$i¾&šÛGA Ez¶Ú5ì3Gt—w"îÞŽv…nmíöÆ|ÈçÔ1*ù2G/š[üL×,>Mà› ÿ³t[ËÙ/u/±;Äú®DLWxm³E@d…YvóÌÀåøçõm&û@ÕotÍNÊãNÔ¬¦{k«;¸š) •«ÆèÀe`ARj­zÿÆmZúÓÀðwŠon5ø~kÕ½û\­<ÚVžñY¥–’ò1Ê5»AtæÙr°¢‡lÞ|qùwÿ¼c¡ønóÄÚGŠ_P·ð·Š4YtFëGµK›Ûm³Cwm$1É,hغ´¶Þ¬ÃtFP¥X«/Awwá/…_ü_¢è¾/·ñljüU ¶›=Æ‘as•k¦%Ìwr~òé œÝ›‹;@„ı>ww ®ÿ㇅´¿øÓM°Ò-~Éi7†|=¨<~c>g¹Ñ¬®g|±'æšiìpQEQEQEQEQEQEQEzWÃxvãÁ¾-ð'е+ M×&±Ô¬5{kCp¶º©š(~Ô¡·‹C íç˜bI%V²#íhäÕ»»ð—¯‡~/Ñt_ÛøãÄþ*†ÛMžãH°¹‹JµÓæ;¹?ytNnÍÅ BbXŒŸ;»WñÃÂÚ_ƒüi¦Øi¿d´›Ã>Ô?1Ÿ3ÜèÖW3¾X“óM4Žƒv8 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ è<á;ÅZ¬¶šŸ‹4[¤&U¾Öâ½’2–ó¾âœ” …9`p?E{¯í¤ø?_¾‹ÄzÅ? øì¼? éCH´²Õ⻞[M6ÎÊfC=„qmß Ž H¤ n;+”øaâOÜx7žñV¥q¡iºäÖ:•†¯mhn×Sµ3EÚ”6ñha½¼ó I$ªÂD}­žk]ÿÇ i~ñ¦›a¤Zý’Òo ø{PxüÆ|Ïs£Y\ÎùbOÍ4Ò6: ØÖñF¡ xáf©àm#Äúîõ½jÃZ¸Õ4h.à³³K8/aŽö¨!–Id7Ò3~íQ(ðò™]aòª( Š( Š( Š( Š( Š( ½Wà^™àÆþÛÕüEâŸèzöŸä ÇÅ67·:tò?™¾æUµµ¸ó|‘í·‘V9U.^8¤‚o*¢€=+â?„´+]+PñŸôˆ,¾ÔÑ¥µÓm5Všu‘f’âî{‹ÛXá"Ä07³™™‰]Ÿ5O|tñ_¼*ž°_Þè±ÞͨEm®øcLÕ¼™åH£•ãk»yY7-¼ … -xÍpßüpð¶—àÿi¶E¯Ù-&ðχµÌgÌ÷:5•Ìï–$üÓM#c Ý€Ký¨~'Xø·Á t-;Å^ñSéZdðêrxSÂk¤˜.…ýäɲFÓí\@ÐÝÇû¨þC,r» b$h¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ê¼ §xCYûu‡‰õ}C×rìþÏÕà¶vq?Ì¥.á•b%‘ŒÑyÄà[Îd9Z(×Ýü5ð—Á6Ó´ïhþ>Ô¼]¦C£*h×ðÃawö—¯<Ïym,ZÎ8Ò8ÕÁHÌñùh“[ø)máM#·^ _ˆ¾ð‡ÄAzöÖ¯Újoý•¤l/mM¥ÂµË³º#¹Coå4ˆ­+Ã-¿Š×ñÃÂÚ_ƒüi¦Øi¿d´›Ã>Ô?1Ÿ3ÜèÖW3¾X“óM4Žƒv*øûÁð†•¤É£|CÑüq©]Mp·vú%…ü0ÙD‹’æK»x ´Œó ª„(„Ç~Š¢Š+éO¿ü9áÿxzÂÿá?ƒüMwƒ<+¿TÕ.õ”¸Ÿ:ƒ âßPŠ!´£lkÂŒä䟚ëÕioù(ºGý‰žÿÔ{N þ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòªè<à«ïˆ~&ƒ@Ó%·MJæ‰-b¸fêXàyRÚ ªKÏ3 †(ÀËË$h1»4ÚÿÂäðýŸ‡ÿøâþZÑÿ “Â?ôB~ÿàwˆùk\W€<}ñÆZO‡4ùmín/æµåë2[YÄinnUŒpC¼²I‚8Ý kŸ Uÿ…Éáú!?ÿð;Ä?üµ£þ'„è„ü?ÿÀïÿòÖ¼ªŠõ_ø\žÿ¢ðÿÿ¼CÿËZí~/x¿À~ñ]†™§üð<ÖóøCÕY®u3 o4«[ÉTÕÚ$¸p£ NIùÖ½Wö–ÿ’‹¤Ø™á?ýG´ê?árxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯4Òt›íU²Ó4Ë+GR½™-­lí"ifžW`©"‚Y™ˆ@$’¯­o?g‡þ)ø§ðßàü$> Ó¾&ØÙ[èZçü#¾²Õ,ÿ´¦žk»†šâ-IYþÆ·_f™ö6Õ°s÷T*€x¯ü.OÿÑ øÿÞ!ÿå­jø›öÑ|a¨Ã«üøww •¦ž’}«_LAmo´ …Õùa†5ÏS·$’I+Ez¯ü.OÿÑ øÿÞ!ÿå­ð¹<#ÿD'áÿþx‡ÿ–µåTPªÿÂäðýŸ‡ÿøâþZÑÿ “Â?ôB~ÿàwˆùk^UEz¯ü.OÿÑ øÿÞ!ÿå­ð¹<#ÿD'áÿþx‡ÿ–µåU«ákÓ]µ—Äšv¡ªè«»íz]úXÜIò»&xfTÃm'1¶@#‚w@ÿ…Éáú!?ÿð;Ä?üµ£þ'„è„ü?ÿÀïÿòÖ­i7¿µýVËLÓ>|HÔu+Ù’ÚÖÎÓÆörÍ<®ÁR4EÑIff ’Hµ¼qð#éû`[|ðƳq›?ˆ4ï ͨ\±½k;Ù 0^€Æo=a¹iÑ[Ë‹zƧ٠þ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZ?áø!ÿEâþv?ü¹®âgÂûï|Køƒá[Cq®Ûø;S»±¼Ô¡µdQe(,"V‘£^X€Ò¢ä’2ÐÂäðýŸ‡ÿøâþZÑÿ “Â?ôB~ÿàwˆùk^UEz¯ü.OÿÑ øÿÞ!ÿå­ð¹<#ÿD'áÿþx‡ÿ–µåUÐxÂ÷Þ3ñ–“¤iþÖYþËúÂêÞ(ÒtÿŒ~ kÔÑ.5 Q¸±ƒOÖm/ }KNœ…G)Š ¸#.ª$†á.cå6'Ítê¿ð¹<#ÿD'áÿþx‡ÿ–´ÂäðýŸ‡ÿøâþZ×Aâ?„>ð¯?iÇÅý¿€á¹‹E¹»˜ùÑ´^"°±YfÕv0M*Wn\ …Ç…PªÿÂäðýŸ‡ÿøâþZÑÿ “Â?ôB~ÿàwˆùk^UEz¯ü.OÿÑ øÿÞ!ÿå­ð¹<#ÿD'áÿþx‡ÿ–µåTPªÿÂäðýŸ‡ÿøâþZÑÿ “Â?ôB~ÿàwˆùk^UEz¯ü.OÿÑ øÿÞ!ÿå­ð¹<#ÿD'áÿþx‡ÿ–µåTPªÿÂäðýŸ‡ÿøâþZÑÿ “Â?ôB~ÿàwˆùk^UEz¯ü.OÿÑ øÿÞ!ÿå­Zý«/aÔ~-Z]ÛØ[évóøKÂÒÇchÒ46ÊÞÓÈ ŽîUAÀ.ìØ,NIò õ_Ú[þJ.‘ÿbg„ÿõÓ¨ʨ¢Š+Õioù(ºGý‰žÿÔ{N¯*¯Uý¥¿ä¢éö&xOÿQí:€<ªµ|'âSÀÞ*ѼI¢]}‹ZÑïaÔ,n|µ“Éž'Fû\l2ƒ†r¬ª(éOx[KøE£øÛâ/‡­~Á¦xªÊ×OðtFx­àÕlä“TKyä,/~Á¥LH%d¼YÃ*"ƒÀ:ž“á…_ í¼=ã?xoRñT7PêºOƒ<-o­[kÚŠê7­¥è’þ´°¶k!ö #’1ʸOôÉ7üÁ¨ø³\Ö4-#D¿Öu ÝGó¿³të‹§’ÞÇÍ`óy1’V=ì6Ð7““Vü7ñ Å^Òµ­3@ñ6±¡éºÜ?fÕ,ôÛùmá¿‹k¯—:#*í’AµvÍ{ÿÅÍào‚÷:OÃË« øOVøã+$¶²¼ŽY›Lû6Ž±Ù½äRHe€Æà:$ÏÅ#f2l‡ÌjMZúm*ßL’öáôÛi¥¹‚Í¥c Rȱ¬’*g ΰĀɠ9Ú1V€ õ_Ú[þJ.‘ÿbg„ÿõÓ«Ê«Õioù(ºGý‰žÿÔ{N *¢Š(¢Š(ªø[ÿ Çü'zgü+øH?á3ýïØ?áóÿ´Õ?›åy¼ÿUænÛü;³ÆkÚ¯t ?öGð'ŠìuKOÕ>6ø–ÊïçGÒç³Ô ðƒKäÞ½Ìê%O·N‘Ín°ÂÁ¡†YYÝYÑÍtP­'I¾×õ[-3L²¸Ôu+Ù’ÚÖÎÒ&–iåv ‘¢(%™˜€I ú+áçÀ»€·–?>6Ÿ/û %Æ¡£xL´1ÈoeŸo‘{|†M‘G–^7‘ÝÙQ•~Ï^)Òü ñ÷ᧉ5»¯±hº?‰´ÍBúçËi<˜"ºŽIjÍ…Rp “Ž5ÀQ@«ÿ oÂ?ô]¾ÿàˆùUGÅÏŠ·ðÓ_|àêgÛ¼MªêV·¥Í5•Ç‘qq1WF$MñI‚‚:Šòª(Õá¬~7ÿÑdøÿ…E÷ÿ®+Æ¿¼Uñ+U‹Sñ‰µjQB-£¼Öïå¼™" Ì##1 ÜíÎ2Ä÷5ÏÑ@Wü-/ÿ¬ÿ…qý§ÿgö×ü$?ÙŸg‹þ?ü#ÎóvùŸê¾]»¶÷Æy®VŠ(ßüû(êžÙâoŽ ¨|)ð ¯$Ñêq-¶»«˜|­Öºe„Åe–W3ľqO" Ìîÿ!S•uûPêþÐZßÅ3ÇU“rx~ÊúÉf·ðâ$k ‹[EŠ–ÒâHšHÙ2ÌeÀ#Åh Jø!ñ¾ûàî«©ÛÜi–þ*ðN¿ Ùx—Â:‹²Újö¡·(,9ŠxÛç†á>xŸ‘Y[«Ò~ü.ñ?Ç›-;Gø“oÂC kzޱ¯?ön¥¦éãqdÈñ‘q¨"æ4[U™ebŒ .ñ…Q@Oü.ñ‡~=üRý¡µx£Gø]¦øßLºÕïY¸3-ª¶¿§ßË *¡^êq Syq"†•$5øéñgCñÇö'…¼ Â3ðÛÂþzh¶wJ¨ÞI7–./ïæQûË™ü˜²ª|¸–8ãŒmMÍåTPEPEPEPEPEP^«ûKÉEÒ?ìLðŸþ£ÚuyUz¯í-ÿ%Hÿ±3ÂúiÔåTQEô§Æß‰~ðÿŠ<=aðŸÁþ&»‡Ážߪj—zÊ\OÁ†ño¨EÚQ¶5áFrrOÍuê¿´·ü”]#þÄÏ ÿê=§Pÿ “Â?ôB~ÿàwˆùkGü.OÿÑ øÿÞ!ÿå­yUê¿ð¹<#ÿD'áÿþx‡ÿ–´ÂäðýŸ‡ÿøâþZוQ@«ÿ “Â?ôB~ÿàwˆùkGü.OÿÑ øÿÞ!ÿå­yUê¿ð¹<#ÿD'áÿþx‡ÿ–µ«âoÚ7Eñ†£ þ¯ðOáýÝÜ6VšzIö­}1µ¼vÐ&Tå†×=NÜ’I$ø­ê¿ð¹<#ÿD'áÿþx‡ÿ–´ÂäðýŸ‡ÿøâþZוWAàx‹âŸŒ´Ÿ øOI¸×¸¶Mk‹kÛkÇK{±-ºîºŽ;ie™­Ð‡bF0!.Å ×@«ÿ “Â?ôB~ÿàwˆùkGü.OÿÑ øÿÞ!ÿå­Tø!ðBûã«©Ü\jvþðN Þø—ÅÚŠ3Zi¥¶©*9–yä†Ý>y_€—Ÿø{ðÇ_ø¡yª[è1éÿñ+²þн¸Õ5kM6ÞÞ:(¼×RÇ̳ĀnÉ.0 uð¹<#ÿD'áÿþx‡ÿ–´ÂäðýŸ‡ÿøâþZÐÿ³7¾ÇqoqàýOì6W:„Öú_ŽtKÛ"ÞžgHa¼ydQ»ŠNñ^U@«ÿ “Â?ôB~ÿàwˆùkGü.OÿÑ øÿÞ!ÿå­yUê¿ð¹<#ÿD'áÿþx‡ÿ–´ÂäðýŸ‡ÿøâþZÖOŒþi~øËãêþ%û=§†ïu=5°3}®{A:ÀžJ±)ö‰¢Ž<î"?7q$)ÏWðŸà7†þ(üBøƒ¤Ã㿳ø[ÂöSêÞ!ûµ·ö” oi ì¾¼µŠßÌ)&%œ€3Wü.OÿÑ øÿÞ!ÿå­ð¹<#ÿD'áÿþx‡ÿ–µéZ·ì³ðãEÒ¯u Š÷[ÚB÷%£xRæfURÄ$Qø™žFÀáK1À’|Á@«ÿ “Â?ôB~ÿàwˆùkZ¾&ý£t_j0ßêÿþÝÝÃei§¤Ÿj×Ó[[Çmau@>XasÔíÉ$’OŠÑ@«ÿ “Â?ôB~ÿàwˆùkGü.OÿÑ øÿÞ!ÿå­yUê¿ð¹<#ÿD'áÿþx‡ÿ–´ÂäðýŸ‡ÿøâþZוQ@«ÿ “Â?ôB~ÿàwˆùkGü.OÿÑ øÿÞ!ÿå­yUê¿ð¹<#ÿD'áÿþx‡ÿ–µÚü^ñ€üâ» 3Oøày­çðþ‡ª³\ê fÞiV·’¨+ª´IpáF2($œ“ó­z¯í-ÿ%Hÿ±3ÂúiÔÂäðýŸ‡ÿøâþZÑÿ “Â?ôB~ÿàwˆùk^U]®…ðªûÄ¿ üMã];WÑçO ÍÔô6¹hõ(­ft‰/V6P’ÁçI-å»:4‰¹X1è?árxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ®«â_ì‡â? xŽÎÂÎëÃúfýI½¹±ñOŒ´m3Q¶º¸Ó­ç¹Š[[‹˜f‡dÒʪ²Fj®K}ãæºgÁë_ᆟáû‹ÿ¦§6ŽÚ=³¤Œ·Q;$ª]X T(å¤Ý±UY‹ÐAÿ “Â?ôB~ÿàwˆùkGü.OÿÑ øÿÞ!ÿå­y¦­¤ßh­î™©Ù\iÚ•”ÏmugwE4£xݬ¬*@ ‚ U Uÿ…Éáú!?ÿð;Ä?üµ£þ'„è„ü?ÿÀïÿòÖ¼ªµ|'ámSÇ>*Ѽ7¢Zý·ZÖ/aÓìm¼ÅΞWÆ›œ…\³– ò@ @ÿ…Éáú!?ÿð;Ä?üµ£þ'„è„ü?ÿÀïÿòÖ»]köYƒNø¹®&Ÿ«èþ'ø_¥jw—m>ã}ïZ¹ÐmžIežu¹Üó‹8žM¾Pä¨Åx/á&ñ[QÖG‡¼c§øZÓGÑmu áñj]Éutën‡Q{d±µœ¼QL&“[p$`Ds2ð¹<#ÿD'áÿþx‡ÿ–´ÂäðýŸ‡ÿøâþZ×kâ?€ÿ¼‰4¶ñЦÛiZ¹¹µµºŽâ[멚WRåQbkXežW†%1¼Šš|$øy¡øæ/ßø“^Ôè€8ø\žÿ¢ðÿÿ¼CÿËZ?árxGþˆOÃÿüñÿ-kÕ|/ûxoÇ>Òõïx¿Æå¥þ‹­Ã£iþ ¶º×f‚ÛQ²°Y#±‡Trby®®~wt XNB°Á¯?øùû;–ð¯„õ¼øÂ×ûv÷P²þÎñ¯…?°/#û*Z?š‘ý¦2'û^ÐÙ\4N0h+þ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZ÷ýOþ Ùý™¬xÛOÝñ‚ïþ3ý*×áNø5}—‘Zÿ 7ö—ï÷y¾pás r?ðàùÿ‰ÿc›]øcan> ZÿÂc­^i“Yø‡À3Yj–pZ­¤“^Ec ÅÄ—Q®°›Oú4ƒÜpð¹<#ÿD'áÿþx‡ÿ–´ÂäðýŸ‡ÿøâþZ×µxçþ Çãø].ZßPMj²é?f{ÚßUÖnuûÍ:­§h£Ž cmo þtìn-ÇK˜öùWÇÙ²ÿá½ç‰õýTðþ³ðÚ jòÇDÕàñv‘{qs"ÆD0Nd’QöÏ"¤` ”3*)à+þ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-j×íY{£ñjÒîÞÂßK·ŸÂ^–;F‘¡¶VðþžDhdwrªwfÀbrOWªþÒßòQtû<'ÿ¨ö@UEP^«ûKÉEÒ?ìLðŸþ£ÚuyUz¯í-ÿ%Hÿ±3ÂúiÔåTQEQEQEQEê¿ >$xoá—ÃMoo¨^|Iñ“ø~Âi--šÃKÓg /gW“|s,Aí@DdsÊÞc3_*¢€>ÊðWÆgö¯ð ¿/¼Ao£|jhM®¯ß$x¶&‰`}>{©}¦¡,( ¤t±$v×EöÄÕóÿƒu_|8¹Õlü{ðÓXñ/‹,&º¶~¡®¾™co(ŒÆ±ÝÚÇn.Y¢›s²¥Ì$ívá‹y­ôWíGñ{Ä_|ð~)ä·Ðü=¨x~ëWÐ!:-­Çöî±¼6qâ5eˆü Œ,ìKÏþÎ^×¥Ú½ÍÄÛuýÛdh 6YŽIè+ʵŸêž Ó´+ û¯´ZhvM§éñùj¾D q5ÉL€ ~úæfËdüøÎ*€>”ø%û=|Sð7ŠÔW,Äá@<+µøcñÒûá/†|G¦è¾ð½æ¥®Â-.5½oOmFeµÛÏä iÝìÙ|ËXÛt–îà“†] jÅycãxoVÕ>)üX“à׉tÇ]wůÆ%6Úl«nPÒn,ßLß5Ø ë²‚n£e‘>C!‹ó×Å7:Þ»u/†ôíCJÑ[oÙìõKô¾¸å·Ì¯–ÜF#\$n>à¿Ú[Æ~ñV³«ÚGáû› {ì«­øbçÃöCBÕ#·tx£›OH–ƒÃÆ© /!WVvcçþ)ÖlüA®Ý_ØhZ†m&Û³KÒä¸{x0¡NÃq,²Ä;¤nXãeQEQEQEQEWªþÒßòQtû<'ÿ¨ö^U^«ûKÉEÒ?ìLðŸþ£ÚuyUz¯Ã¿‡_gøOãŠú”¿c´ðýø}nl~Ño©ë2N“wI ’bŽÎ©$G*2Öà†mo*¯JðOÇKï ÛxbÃUð·…üm¡xjk›½/E×ôöÑÝO$,ó}™á{¦"Ú$Ûrò§–¡6í Ð;Ó|K¦|ð×ÄTñ}½ÇÅÿx€|WÖlÕ, ZE­Ín¶·Af Ë&Ÿa3Åä««Û‚ªçÅ< ñ{Ið‡ƒ~#ë7rkïÅ¿Ã6§ ¼ÖÖVWDBí¦—Ì–K¹ÓÌ·ácÛó?šÌÁV®ûNüCÑ~2ê_®µ¯íÿkdZÔzÌBâÏXµ”–Êêí™SÊ**¦Í…¯Ÿø§Y³ñ»ua¡iþ´›nÍ/K’áíàÂ…; IJÊwXcŒ ôV“«XþÚúU—‡¼C{o§|²…-tO^ʱCã8‘BŧßJÄÔ@H.œ8 §—!ñ_ Åáß ê¾0Ѿ!øoX7ÃL¼ÓíÞCkw¤jñ°h^XœaÔI‚XßRixˆ+Š«ZMì:v«ewqaoª[Á2K%ÛH°Üª°&71º8V£«`œ08 è ;Ã>ø¥ÅZׂíüðúÇL’ÖÓIÒ­•׉®-VmìÃÍ*¬òI¨41ù¢aòʲ”ÝæŸ ¾5ëŸ?·ï<-k§Úx“S²6Þ&’7mGGò&keBc3liI´e˜“âÏÆ½sâçöÝ®Ÿ øoöBÃDð·ŧi±œZ4wwiepd–i䑎YˆU Wá—ÆOü¹Ô.ü¨[èÚ•ì-nuDÓ­¥¾¶VŽH˜ÚÜÉKjÅ%u/£ŒŸ•pô¯ÆßCðcá}Õµç‡ôütñï‡ìthÞŠK!¦é í4’ÜÁ ‘Ãgw~‰§‰,Ö6 2»ˆÙŒoþÁ>6ÖN–ËÂþ4ø¬ø§ÂöRk6¾ š÷R¶ðµ¢} Å½­ôÑuu¨f{«IšÝ ·BÇ™#.w|A«j×Úþ«{©êw·Ž¥{3ÜÝ^]ÊÒÍ<®ÅžGv$³3KI$“]_ÉÍðÖOÇ'‡4iºþ˜4«ý7[7K Ä.­î•ƒ[O ŠÂ[XŽCãÐ餖<=Šâ‹¼a/„‡†tNæ÷Ãz§Š´ýOLþÌÒÑîn­o.4´³ónb[—–Òá“tòF"MêùWà§íá/ã-Ö£«øtfÉþÛñÅ7þ'Ó¼E®¢ˆÙ,¥:^£p±e–8–M®‰ !IDO溷íR5ëÝNßá_ô½v¿†cÕ­%Ökk&ÓN˜$šƒÄYmNÀÏr¶IðªûþÚÿt}H³ñÿÃÿÿÄ—Q½¹Ð?á)ø‘þŸkog5ÅÌX¸¸H[0Å/Ë#n„ó_ ø§Y³ñ»ua¡iþ´›nÍ/K’áíàÂ…; IJÊwXcŒ ÚøOãß~øƒÃ>ðÖ¤êZþ˜ú6§â«kAu;‹'¹Žy #í_gU%"m° ÑîSÌOšÐ^«ûKÉEÒ?ìLðŸþ£ÚuyUz¯í-ÿ%Hÿ±3ÂúiÔåUßþÏ^)Òü ñ÷ᧉ5»¯±hº?‰´ÍBúçËi<˜"ºŽIjÍ…Rp “Ž5ÀQ@Oü'øOá{_ügŠ/Œþ¼KŸ [Å,ÐÙë¡mTkºKù’oÓ•,‹;n‘С™O†z´/Zx ëš?Æ­KÄþ9ðü°xKÃ7ZŽ×‹ ¾§—%åíŒI¼×ÖÊJ’ÅKá£ûëàñ­÷…t_i–‘[Éoâ]14«Æ™X´q-íµàhÈ`y–‘ŒFÖqŒAà?ø‹á‡‰ ñ…uk ]‚‹x5 BhVx 62Œc•ÀuÃ)!”†€¿þ2k+â½Äþ-𞟬xO]½ð–˜4ÝJ÷_µ‚ÇK‰ï|c§Ø2 t±‚Äê ´h?yæ´ÎÅÄ[ú¯ÅÄñç‹?eý+Aøƒâ Èlµ­ïµ«¤6™9ŸYtŸÉX|×"µ¶‚ÊËlašÒäžœ¦¿ûkxãÇZŽ›7Žt¯üC°Òµ¨õ3LñU¼÷‘Xì·0 D”Ì'{f nòG,¯çImÊ]žc/+âÏÚSÅÿü ¬ø_ÆOñTwÚÔÚýž¥¨Û‘y£Þ\Je¼6O"ÇÃ6d€«E¸TGùèʨ¢Š+Õioù(ºGý‰žÿÔ{N¯*¯Uý¥¿ä¢éö&xOÿQí:€<ªŠ( ¾”øÛñ/ÞñG‡¬/þø?Ä×pø3»õMRïYK‰ó X0Þ-õ¢A 6Ƽ(ÎNIù®½Wö–ÿ’‹¤Ø™á?ýG´ê?árxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖµ|MûFè¾0Ôa¿Õþ ü?»»†ÊÓOI>Õ¯¦ ¶·ŽÚÂê€|°Ãç©Û’I$Ÿ¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-kWÄß´n‹ã Fý_àŸÃû»¸l­4ô“íZúb kxí L.¨Ë 1®z¹$’IñZ(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖø\žÿ¢ðÿÿ¼CÿËZòª(ÕárxGþˆOÃÿüñÿ-hÿ…Éáú!?ÿð;Ä?üµ¯*¢€=Wþ'„è„ü?ÿÀïÿòÖ­~Õ—°ê?­.íì-ô»yü%áic±´ieoéäF†Gw* àvl–'$ùz¯í-ÿ%Hÿ±3ÂúiÔåTQEê¿´·ü”]#þÄÏ ÿê=§W•WªþÒßòQtû<'ÿ¨ö@UEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^«ûKÉEÒ?ìLðŸþ£ÚuyUz¯í-ÿ%Hÿ±3ÂúiÔåTQEô§Æß‰~ðÿŠ<=aðŸÁþ&»‡Ážߪj—zÊ\OÁ†ño¨EÚQ¶5áFrrOÍuê¿´·ü”]#þÄÏ ÿê=§Pšj×°ê:­íݽ…¾—o<Ï,v6#Cl¬ÄˆÐÈîåTîÍ€2Ääš´Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@•¤üXð¾¥YZ\|ð>©q)—×wšêÍrÊ G©¢b2B"®I€5jËØu‹V—vöú]¼þð´±ØÚ4 ²·‡ôò#C#»•Pp »6Ë’|‚½Wö–ÿ’‹¤Ø™á?ýG´êòª(¢€ õ_Ú[þJ.‘ÿbg„ÿõÓ«Ê«Õioù(ºGý‰žÿÔ{N *¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šèx¾O x’²kPÙY^ÜZ²:=¿Úm!ºX¤WUe•uGR>WV dÕð?‚¯¼­\éš|¶ðÜA¦j:«5Ë2©ŠÎÊkÉTRwíÜ(Æ ’9ú(¯Uÿ†NøßÿDoâþ÷ßüj€<ªŠïüSû=|Sð6…u­ø“á§Œq€HÊ¢º­?áo‰õ_^øÊ×Ló|7gçù÷¿hˆlòe±Š_¶óµõ;Âóçdd#•çäÒo¡Ò­õ9,®M¹š[h/&Ë,kI¾0Ì‹4E”"à h¢½+Iý™>0ëúU–§¦|(ñÆ£¦Þ—6·–ž¼–âu ’#¬d2²CA@kEt5ø{⯆º¬Zg‹ü3¬xWR–sž·a-œÏfQ IIRÈãv1•#±®~€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ õ_Ú[þJ.‘ÿbg„ÿõÓ«Ê«Õioù(ºGý‰žÿÔ{N *¢Š(¯¥>6üKðç‡üQáë ÿ„þñ5Ü> ð®ýST»ÖRâ|è 7‹}B(†ÐB±¯ 3“’~k¯Uý¥¿ä¢éö&xOÿQí:€<ÓV½‡QÕoníì-ô»yæyc±´ief$F†Gw* àvl–'$Õ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šµ¤êshº­–¡n–ò\ZL—¥Ý´w0³+â‘Y$\ŽQÔ« ‚$Wßÿí4JûOм{¤hþ ð÷†|sáßZØø Ö6ú–£ui¦ÜÉâ->Æ–Òå —Sºƒ-ò¢µÚ¼@’üá=KûÅZ5ÿö®¡¡}–öÿµ4•ÝygµÃyÐ2<ʘܣÌO˜™z§ü[ûnÃâ¯o®,uCá÷¼A£ßé×^ ½“Tñ–öw2Ëq+Ï,»÷f}òÆ›cÿF³Œ¶êHkñe-ü=á‹×ž$ø=ñƒì<óu½kÅ:÷†áÑì4ÍsíwXImk$7 AîÙœßîhîîÒÞX¯5Ñ|cðëöXñæ‡}§øgLJ‹?á³¹mbËÆVÖ º¶…Ë%º.šïD/ßËo5ˆhÑŽyÊèßÁïxSÇfŸâßj—)Ó-tfkŸYÛ-¤KªØ^K8+ªHda›… ™At5Õk_µëXi^5Ðü⟋Ñí¡Ó-¼ G®‰²ŠÕV ã»…\G¶æ"óí‡ cŽ8ój>&üa¾ø¯û<ø›S´ñÅ³ØøƒIÒ¯4ŸøùµËØ®a¿¸ b°ÑɧÆA%‡Íœ¯5ý›ü'ÿ _ ^xÁþþƿ׼âj—©¨^jÂb–;[lA³¶ûD^s ß#²ÄVXÀ ¿ñÓoÁ­7ᧃôOøD´ü»¿Ü‹¿´^x–ý 1½Ä¡m´YýͨQ‹;4²ãWör¹Ðídsc(ýÊa±oÄòk?ìsñ/þèUåUê¾ý .<à›o·‚<â°ÞꆛâK¯^Â{Ëh-æu€Ì-eÂÛBÊ'†P®»±Ú€*Y|¾ƒà•ÿÄßjvþÒ'˜YxjÎí®|Gt³"Ü‹dˆ Œ»Ipß $C.çfW„>"øÛã(ü;áØíÑÒ/oõ=BaŽ—eÌ×—s"‚5åœú…PÌʦ§ÄÏŠ¾/øÉâ©üIãoê&Ö¦Ü>Ó¨L_ÊBï'•ýØ¢ #•¢î;T í|kñâÆ_…ñ|8øyáËx>æa{¯­Ioõ/]#±€Ýܬ0 @ŠÝ#TVÝ#ov  ß¶MŒ> ø¹Ãk=2ãNÓ~éøZÞKËI-§¿dy.n/š7–\-ÅÍÕÌñí`¾L°à ðªõ]ã§ü'´ßøÃDþÞ×¼;åÛøcÅ¢ïʼÓì&M>àoµ[ æ, æ61וPEPEPEPEPEPEPEPEPEPEPEPEP¥i? xT¸‚ŠKë»Íuf¹eP Ž#ÔÑ1!W$á@À¿µeì:Å«K»{ }.Þ xZXìmF†Ù[Ãúy¡‘Ýʨ8Ý›e‰É>A^«ûKÉEÒ?ìLðŸþ£ÚuyUQ@z¯í-ÿ%Hÿ±3ÂúiÕåUê¿´·ü”]#þÄÏ ÿê=§P•QEQEQEQEQEQEQEQEQEQEQEQEQV´›(uVÊÒâþßK·ždŠK뵑¡¶V` Ž#GrªHDfÀ8RpØ,ý†Wľ2ðý§%·´øwi2iÞ<¾Õ­nWYŠ$ú¯ˆ¢Ž9Œ1éö¨ñBGœ·Ùâf7* Æ´WÑ_´'Ào øWÁº—Äo ·Š<1¤j>-¹Ñô¯øÃD‹N¹Ž$3´ëéælÝ!·’G™(·‡Qçÿ³Ç‚´oˆ?eÑuùmí´Öðþ½vnîÚq ¬¶úEåÄ3¿­!XåŠ9 ª±`„m|í kEwþ)øiáÏèWWö<âk¸vìÒô»Me.'Ë; ÆŸCh%Žé…8ÉÀ=_†¾ü$ñ†£5†‘㟈wpÙ]êü úzb ky.g|¶´Ë 26:¸’ñZ+ßüSû=xJýŸn¾(ØxóÄñÜ^­‡‡´¿øZ =üC"Èé­LZ…ÃyVêIy™{öƹ y¯€<c⯠|JÔî帎ãÃ^‡U³XYBÉ+jº}™YRJùwråCœEuZü ÿð‚^ý»þøLÿö_³ùÙßël|ùýçú¯í=øþ/²c2KÀ¿Ùÿ <=ã/·yŸÚúÖ§¤}‹ÊÇ•öH,%ó7îù·ý¿v¾Vrwa@9Z(¯JÒtƒÓiVRj~:ñÅž¤ð£][Úx.Îxb”¨Þ‰#jÈ]Cd(„€ UΚÑ^•ñ»á5ÂÉ<>™©kŽ›âŸÇâ S¯hË¥]ÇÝ\À›¡Yç]m„¨áÈd•¾k@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@z¯í-ÿ%Hÿ±3ÂúiÕåUê¿´·ü”]#þÄÏ ÿê=§P•QEWÒŸ~%øsÃþ(ðõ…ÿÂøšîxW~©ª]ë)q>t ž¡Ch!FØ×…ÉÉ?5תþÒßòQtû<'ÿ¨ö@i«^è귷vöú]¼ó<±ØÚ4 ²³#C#»•Pp »6Ë’jÑEQEQEQEQEQEQEQEQEQEQEQEjøNÖâ÷ÅZ5½¦‰ÿ 5Üװlj²gþÐrà-¾ØYe>aÂb6W;¾R ~…|w³o]ØMㄞñ†¥áØl`Õ¼?à}nëM½ÚëÚ®‡mk¦E0¸+¥î‚å·´ŠZkËy7áüêÒukíU²ÔôËÛ;R²™.mo-%h¦‚T`É":U•€!«zÏŠuOiÚ…ý×Ú-4;&Óôøüµ_"¸šä¦@¿}s3e²~|gõ¯íwñcþ"Ò­4h·Ç‹,¡‘4xçÁ¿ƒ!Ú *êÈÇs ÖŸ±íç· 7œªeDó9µâßxæM3@¾Ð?iMCáφôÿ øcO}y¼SfštçE· ÛØ< ç.&Œ£‘*fE$d×ÍWßüw«øWÃÕõßøH4_ Þ¥öm®ÙÁ¨ý„ª$bÚtvÅbŒ\ù ±s"|~ø‡âËÏ]k,Ô5t ž¡Ch!FØ×…ÉÉ?5תþÒßòQtû<'ÿ¨ö@i«^è귷vöú]¼ó<±ØÚ4 ²³#C#»•Pp »6Ë’jÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEzV“ñcÂúv•eiqðcÀú¥Ä¤R_]Þk«5Ë*€dq¦ˆˆÉй' Õý«/aÔ~-Z]ÛØ[évóøKÂÒÇchÒ46ÊÞÓÈ ŽîUAÀ.ìØ,NIò õ_Ú[þJ.‘ÿbg„ÿõÓ¨ʨ¢Š+Õioù(ºGý‰žÿÔ{N¯*¯Uý¥¿ä¢éö&xOÿQí:€<ªŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ½Wö–ÿ’‹¤Ø™á?ýG´êòªõ_Ú[þJ.‘ÿbg„ÿõÓ¨ʨ¢Š+÷Oáìð'ãOÁ?…Þ2ñ—¿¶|I©x3Aû]ïö½üg—¦[DŸ$Sª $h8QœdòI¢Šêÿá׳ý/ü¯êŸü“Gü:ãöbÿ¢eÿ•ýSÿ’h¢€øuÇìÅÿDËÿ+ú§ÿ$Ñÿ¸ý˜¿è™åTÿäš( þqû1Ñ2ÿÊþ©ÿÉ4î?f/ú&_ù_Õ?ù&Š(ÿ‡\~Ì_ôL¿ò¿ªòMðëÙ‹þ‰—þWõOþI¢Š?á׳ý/ü¯êŸü“Gü:ãöbÿ¢eÿ•ýSÿ’h¢€øuÇìÅÿDËÿ+ú§ÿ$Ñÿ¸ý˜¿è™åTÿäš( þqû1Ñ2ÿÊþ©ÿÉ4î?f/ú&_ù_Õ?ù&Š(ÿ‡\~Ì_ôL¿ò¿ªòMðëÙ‹þ‰—þWõOþI¢Š?á׳ý/ü¯êŸü“Gü:ãöbÿ¢eÿ•ýSÿ’h¢€øuÇìÅÿDËÿ+ú§ÿ$Ñÿ¸ý˜¿è™åTÿäš( þqû1Ñ2ÿÊþ©ÿÉ4î?f/ú&_ù_Õ?ù&Š(ÿ‡\~Ì_ôL¿ò¿ªòMðëÙ‹þ‰—þWõOþI¢Š?á׳ý/ü¯êŸü“Gü:ãöbÿ¢eÿ•ýSÿ’h¢€øuÇìÅÿDËÿ+ú§ÿ$Ñÿ¸ý˜¿è™åTÿäš( þqû1Ñ2ÿÊþ©ÿÉ4î?f/ú&_ù_Õ?ù&Š(ÿ‡\~Ì_ôL¿ò¿ªòMðëÙ‹þ‰—þWõOþI¢Š?á׳ý/ü¯êŸü“Gü:ãöbÿ¢eÿ•ýSÿ’h¢€øuÇìÅÿDËÿ+ú§ÿ$Ñÿ¸ý˜¿è™åTÿäš( þqû1Ñ2ÿÊþ©ÿÉ4î?f/ú&_ù_Õ?ù&Š(ÿ‡\~Ì_ôL¿ò¿ªòMðëÙ‹þ‰—þWõOþI¢Š?á׳ý/ü¯êŸü“Gü:ãöbÿ¢eÿ•ýSÿ’h¢€øuÇìÅÿDËÿ+ú§ÿ$Ñÿ¸ý˜¿è™åTÿäš( þqû1Ñ2ÿÊþ©ÿÉ4î?f/ú&_ù_Õ?ù&Š(ÿ‡\~Ì_ôL¿ò¿ªòMðëÙ‹þ‰—þWõOþI¢Š?á׳ý/ü¯êŸü“Gü:ãöbÿ¢eÿ•ýSÿ’h¢€øuÇìÅÿDËÿ+ú§ÿ$Ñÿ¸ý˜¿è™åTÿäš( þqû1Ñ2ÿÊþ©ÿÉ4î?f/ú&_ù_Õ?ù&Š(ÿ‡\~Ì_ôL¿ò¿ªòMðëÙ‹þ‰—þWõOþI¢Š?á׳ý/ü¯êŸü“Gü:ãöbÿ¢eÿ•ýSÿ’h¢€øuÇìÅÿDËÿ+ú§ÿ$Ñÿ¸ý˜¿è™åTÿäš( þqû1Ñ2ÿÊþ©ÿÉ4î?f/ú&_ù_Õ?ù&Š(ÿ‡\~Ì_ôL¿ò¿ªòM~JÿÁFü-¥øöÂñ§†ôK_±hº=–§ØÛy'“ZEœq¦ç%›  e‰'’h¢€>k¢Š(ÿÙkit/draw.c010064400237450000000000004055461114577676700123120ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: draw.c,v 1.246 2009/02/15 11:35:19 nishida Exp $ */ #include "mgp.h" #ifdef USE_IMLIB #include #endif /* state associated with the window - how should we treat this? */ static struct ctrl *bg_ctl, *bg_ctl_last, *bg_ctl_cache; static int bgindex = 0; struct render_state cache_state; static u_short kinsokutable[] = { 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x2126, 0x2127, 0x2128, 0x2129, 0x212a, 0x212b, 0x212c, 0x212d, 0x212e, 0x212f, 0x2130, 0x2133, 0x2134, 0x2135, 0x2136, 0x213c, 0x2147, 0x2149, 0x214b, 0x214d, 0x214f, 0x2151, 0x2153, 0x2155, 0x2157, 0x2159, 0x216b, 0x2242, 0x2244, 0 }; static struct pcache { u_int flag; u_int page; u_int mgpflag; u_int mode; u_int effect; u_int value; } pcache; #define COMPLEX_BGIMAGE \ (bg_ctl \ && ((bg_ctl->ct_op == CTL_BIMAGE) \ || bg_ctl->ct_op == CTL_BGRAD)) #define COMPLEX_BGIMAGE2 (0) #define POSY(size) (-(int)((size)/2)) static void process_direc __P((struct render_state *, int *)); static int set_position __P((struct render_state *)); static void draw_line_output __P((struct render_state *, char *)); static void cutin __P((struct render_state *, int, int, int)); #if 0 static void shrink __P((char *, u_int)); #endif static void draw_string __P((struct render_state *, char *)); static char *draw_fragment __P((struct render_state *, u_char *, u_int, char *, int)); static int iskinsokuchar __P((u_int)); static struct render_object *obj_alloc __P((struct render_state *state)); static void obj_free __P((struct render_state *, struct render_object *)); static int obj_new_xfont __P((struct render_state *, int, int, int, u_int, char *)); static int obj_new_image __P((struct render_state *, int, int, Image *, int, int)); #ifdef USE_IMLIB Imlib_Image *search_imdata __P((char *)); static int obj_new_image2 __P((struct render_state *, int, int, Image *, int, int, Imlib_Image *, int)); #endif static int obj_new_icon __P((struct render_state *, int, int, u_int, u_int, u_long, u_int, XPoint *)); static Pixel obj_image_color __P((Image *, Image *, Pixel, int *)); static Image *obj_image_trans __P((Image *, u_int, u_int)); static void obj_draw_image __P((Drawable, u_int, u_int, struct render_object *, int)); static void obj_draw __P((struct render_state *, Drawable, u_int, u_int)); #ifdef VFLIB static int obj_new_vfont __P((struct render_state *, int, int, struct vfont *, int)); static u_int draw_onechar_vf __P((struct render_state *, u_int, int, int, u_int, u_int)); #endif #ifdef FREETYPE static u_int draw_onechar_tf __P((struct render_state *, u_int, int, int, u_int, char *, int, int)); #endif static char *x_fontname __P((char *, int, char *, int, char *)); static int x_parsefont __P((char *, int *, int*)); static XFontStruct *x_setfont __P((char *, u_int, char *, int *)); static u_int draw_onechar_x __P((struct render_state *, u_int, int, int, int, char *, int)); static void back_gradation __P((struct render_state *, struct ctrl_grad *)); #if 1 /* by h.kakugawa@computer.org */ static void image_load __P((struct render_state *, char *, int, int, int, int, int, int, int, int, int)); static void image_load_ps __P((struct render_state *, char *, int, int, int, int, int, int, int, int, int)); #else static void image_load __P((struct render_state *, char *, int, int, int, int, int, int)); static void image_load_ps __P((struct render_state *, char *, int, int, int, int, int, int)); #endif static void process_icon __P((struct render_state *, struct ctrl *)); static void draw_bar __P((struct render_state *, struct ctrl *)); static void process_system __P((struct render_state *, struct ctrl *)); static void process_xsystem __P((struct render_state *, struct ctrl *)); static void process_tsystem __P((struct render_state *, struct ctrl *)); static Window search_child_window __P(()); static Window tsearch_child_window __P((const char *name)); static Window getNamedWindow __P((const char *name, Window top)); static void reparent_child_window __P((Window, int, int)); static char *epstoimage __P((struct render_state *, char *, int, int, int, int, int, int)); static void image_setcolor __P((struct render_state *)); static void x_registerseed __P((struct render_state *, char *, char *)); static char *x_findseed __P((struct render_state *, char *)); static void XClearPixmap __P((Display *, Drawable)); static void cache_page __P((struct render_state *, int)); static void cache_effect1 __P((void)); static void cache_effect2 __P((void)); static void set_from_cache __P((struct render_state *)); static void pcache_process __P((int)); static void predraw __P((struct render_state *)); static void set_background_pixmap __P((struct ctrl *)); static void get_background_pixmap __P((struct ctrl *, struct render_state *)); static void regist_background_pixmap __P((XImageInfo *, Image *)); #ifdef MNG static void process_anim __P((struct render_state *, struct ctrl *)); static void obj_draw_anim __P((struct render_state *, u_int, u_int, struct render_object *)); #endif static int valign = VL_BOTTOM; #define CHECK_CACHE do {if (caching) {caching = -1; return; }} while (0) #ifdef USE_XFT2 static void set_xrender_color __P((long, int)); static XftDraw * xft_getdraw __P((Drawable)); static char *xft_draw_fragment __P((struct render_state *, u_char *, u_int, char *, int)); static int obj_new_xftfont __P((struct render_state *, int, int, char *, int, char *, char *, int, int, XftFont *)); static XftFont * xft_setfont __P((char *, int, char *)); XftFont *xft_font; XftDraw *xft_draw[2]; Drawable xft_xdraw[2]; XftColor xft_forecolor; XRenderColor xft_render_color; #endif #ifdef USE_IMLIB static void regist_zimage_position __P((struct render_object *, int, int, int, int, int)); static void clear_zimage __P((int)); static void clear_region __P((int, int, int, int)); #define ZIMAGENUM 100 static Imlib_Image *zimage[ZIMAGENUM]; static int zonzoom[ZIMAGENUM]; static int zpage[ZIMAGENUM]; static int zx[ZIMAGENUM]; static int zx[ZIMAGENUM]; static int zy[ZIMAGENUM]; static int zwidth[ZIMAGENUM]; static int zheight[ZIMAGENUM]; #endif extern int zoomin; static int ispsfilename(p0) char *p0; { char *p; p = p0; while (*p) p++; if (4 < p - p0 && strcasecmp(p - 4, ".eps") == 0) return 1; if (3 < p - p0 && strcasecmp(p - 3, ".ps") == 0) return 1; if (6 < p - p0 && strcasecmp(p - 6, ".idraw") == 0) return 1; return 0; } /* * state management. */ void state_goto(state, page, repaint) struct render_state *state; u_int page; int repaint; { if (!repaint) { purgechild(state->page); #ifdef USE_IMLIB clear_zimage(state->page); #endif } state->page = page; state->line = 0; state->cp = NULL; state->phase = P_NONE; free_alloc_colors(&image_clr); free_alloc_colors(&font_clr); #ifdef COLOR_BUGFIX colormap = XCopyColormapAndFree(display, colormap); #endif predraw(state); } void state_next(state) struct render_state *state; { switch (state->phase) { case P_NONE: fprintf(stderr, "internal error\n"); break; case P_DEFAULT: if (state->cp) state->cp = state->cp->ct_next; if (!state->cp) { state->cp = page_control[state->page][state->line]; state->phase = P_PAGE; } break; case P_PAGE: if (state->cp) state->cp = state->cp->ct_next; if (!state->cp) { state->line++; state->cp = NULL; state->phase = P_NONE; state_init(state); } break; case P_END: /*nothing*/ break; } /* next page */ if (page_attribute[state->page].pg_linenum < state->line) { if (state->page < maxpage) { purgechild(state->page); #ifdef USE_IMLIB clear_zimage(state->page); #endif if (mgp_flag & FL_FRDCACHE && cached_page == state->page + 1) { /* Hit cache */ set_from_cache(state); pcache_process(state->page); cache_hit = 1; } else { state->phase = P_NONE; state->page++; state->line = 0; state_newpage(state); state_init(state); } } else state->phase = P_END; } } void state_init(state) struct render_state *state; { assert(state); if (state->phase == P_NONE || !state->cp) { #if 0 if (!(page_attribute[state->page].pg_flag & PGFLAG_NODEF)) { state->cp = default_control[state->line]; state->phase = P_DEFAULT; } else #endif { state->cp = page_control[state->page][state->line]; state->phase = P_PAGE; } } } void state_newpage(state) struct render_state *state; { state->ypos = 0; state->have_mark = 0; state->charoff = 0; char_size[caching] = nonscaled_size[caching]; free_alloc_colors(&image_clr); free_alloc_colors(&font_clr); #ifdef COLOR_BUGFIX colormap = XCopyColormapAndFree(display, colormap); #endif predraw(state); } /* * page management. */ void draw_page(state, lastcp) struct render_state *state; struct ctrl *lastcp; { u_int end_line; int pause; assert(state); /* initialize the state, if required. */ if (state->phase != P_END && (state->phase == P_NONE || !state->cp)) { state_newpage(state); state_init(state); } end_line = page_attribute[state->page].pg_linenum; while (1) { switch (state->phase) { case P_NONE: fprintf(stderr, "internal error\n"); cleanup(-1); case P_DEFAULT: case P_PAGE: pause = 0; if (state->cp) process_direc(state, &pause); if (caching == -1) { /* caching failed */ caching = 0; return; } if (lastcp && state->cp == lastcp) goto done; if (pause) { if (state->cp && state->cp->ct_op == CTL_PAUSE && state->cp->cti_value) { goto done; } } break; case P_END: goto done; } #if 0 XFlush(display); #endif state_next(state); } done: XFlush(display); } Bool draw_one(state, e) struct render_state *state; XEvent *e; { u_int end_line; int pause; fd_set fds; int xfd; struct timeval tout; long emask; #ifdef TTY_KEYINPUT KeySym ks; char c; extern volatile int ttykey_enable; #endif assert(state); /* initialize the state, if required. */ if (state->phase != P_END && (state->phase == P_NONE || !state->cp)) { state_newpage(state); state_init(state); } end_line = page_attribute[state->page].pg_linenum; switch (state->phase) { case P_DEFAULT: case P_PAGE: pause = 0; if (state->cp) process_direc(state, &pause); break; case P_END: break; case P_NONE: default: fprintf(stderr, "internal error\n"); cleanup(-1); } xfd = ConnectionNumber(display); if (state->phase != P_END && !pause) emask = xeventmask; else emask = ~NoEventMask; for (;;) { if (XCheckMaskEvent(display, emask, e) == True) { /* we got some event in the queue*/ if (2 <= parse_debug) { fprintf(stderr, "interrupted and " "got X11 event type=%d\n", e->type); } got_event: if (state->phase == P_END) XFlush(display); else if (!pause) state_next(state); return True; } #ifdef TTY_KEYINPUT if (ttykey_enable) { FD_ZERO(&fds); FD_SET(0, &fds); tout.tv_sec = tout.tv_usec = 0; if (select(1, &fds, NULL, NULL, &tout) > 0 && read(0, &c, sizeof(c)) == sizeof(c)) { if (c > 0 && c < ' ') ks = 0xff00 | c; else if (c >= ' ' && c < '\177') ks = c; else if (c == '\177') ks = XK_Delete; else continue; e->xkey.display = display; e->xkey.type = KeyPress; e->xkey.keycode = XKeysymToKeycode(display, ks); if (e->xkey.keycode == 0) continue; goto got_event; } } #endif if (state->phase != P_END && !pause) { state_next(state); return False; } FD_ZERO(&fds); FD_SET(xfd, &fds); #ifdef TTY_KEYINPUT if (ttykey_enable) FD_SET(0, &fds); #endif remapchild(); /* always cache next page */ if ((mgp_flag & FL_FRDCACHE) && cache_mode) { #if 1/*ONOE*/ if (XCheckMaskEvent(display, emask, e) == True) goto got_event; #endif cache_page(&cache_state, state->page +1); /* check if we got some events during caching */ if (XCheckMaskEvent(display, emask, e) == True) goto got_event; } /* wait for something */ tout.tv_sec = 2; tout.tv_usec = 0; (void)select(xfd + 1, &fds, NULL, NULL, &tout); #ifdef TTY_KEYINPUT if (!(mgp_flag & FL_NOSTDIN) && !ttykey_enable) try_enable_ttykey(); #endif /* we have no event in 2sec, so..*/ if (!FD_ISSET(xfd, &fds)) { if ((mgp_flag & FL_FRDCACHE) && !cache_mode) cache_page(&cache_state, state->page +1); timebar(state); e->type = 0; return True; } } /*NOTREACHED*/ } static void process_direc(state, seenpause) struct render_state *state; int *seenpause; { struct ctrl *cp; if (seenpause) *seenpause = 0; cp = state->cp; if (2 <= parse_debug) { fprintf(stderr, "p%d/l%d: ", state->page, state->line); debug0(cp); } switch(cp->ct_op) { case CTL_SUP: if (sup_scale > 1.0 || sup_scale < 0.1) { sup_scale = DEFAULT_SUPSCALE; } if (sup_off > 1.0 || sup_scale < 0.1) { sup_off = DEFAULT_SUPOFF; } state->charoff = -sup_off * nonscaled_size[caching]; char_size[caching] = (int)(nonscaled_size[caching] * sup_scale); break; case CTL_SUB: if (sup_scale > 1.0 || sup_scale < 0.1) { sup_scale = DEFAULT_SUPSCALE; } if (sub_off > 1.0 || sub_off < 0.1){ sub_off = DEFAULT_SUBOFF; } state->charoff = sub_off * nonscaled_size[caching]; char_size[caching] = (int)(nonscaled_size[caching] * sup_scale); break; case CTL_SETSUP: if (cp->cti3_value1 > 100 || cp->cti3_value1 < 10){ sup_off = DEFAULT_SUPOFF; } else { sup_off = cp->cti3_value1 / 100.; } if (cp->cti3_value2 > 100 || cp->cti3_value2 < 10){ sub_off = DEFAULT_SUBOFF; } else { sub_off = cp->cti3_value2 / 100.; } if (cp->cti3_value3 > 100 || cp->cti3_value3 < 10){ sup_scale = DEFAULT_SUPSCALE; } else { sup_scale = cp->cti3_value3 / 100.; } break; case CTL_SIZE: nonscaled_size[caching] = state->height * cp->ctf_value / 100; char_size[caching] = nonscaled_size[caching]; #ifdef FREETYPE tfc_setsize(char_size[caching]); #endif break; case CTL_VGAP: vert_gap[caching] = cp->cti_value; break; case CTL_HGAP: horiz_gap[caching] = cp->cti_value; break; case CTL_GAP: vert_gap[caching] = horiz_gap[caching] = cp->cti_value; break; case CTL_QUALITY: if (!quality_flag) b_quality[caching] = cp->cti_value; break; case CTL_PAUSE: CHECK_CACHE; if (seenpause) *seenpause = 1; break; case CTL_AGAIN: CHECK_CACHE; if (state->have_mark) state->ypos = state->mark_ypos; state->have_mark = 0; break; case CTL_FORE: fore_color[caching] = cp->ctl_value; #ifdef USE_M17N if (! (mgp_flag & FL_NOM17N)) { M17N_set_color (cp->ctl_value); break; } #endif XSetForeground(display, gcfore, fore_color[caching]); break; case CTL_BACK: if (state->line){ fprintf(stderr, "warning: %%back directive should be put in the first line of the page. ignored.\n"); break; } back_color[caching] = cp->ctl_value; bg_ctl = cp; /*update later*/ break; case CTL_CCOLOR: ctrl_color[caching] = cp->ctl_value; break; case CTL_CENTER: state->align = AL_CENTER; break; case CTL_LEFT: state->align = AL_LEFT; break; case CTL_LEFTFILL: state->align = AL_LEFTFILL0; break; case CTL_RIGHT: state->align = AL_RIGHT; break; case CTL_CONT: state->charoff = 0; char_size[caching] = nonscaled_size[caching]; break; #ifdef VFLIB case CTL_VFONT: vfc_setfont(cp->ctc_value); break; #endif /*VFLIB*/ #ifdef FREETYPE case CTL_TFONT: tfc_setfont(cp->ctc2_value1, 0, cp->ctc2_value2); break; case CTL_TMFONT: tfc_setfont(cp->ctc_value, 1, NULL); break; #endif /*FREETYPE*/ case CTL_XFONT2: #ifdef USE_M17N if (! (mgp_flag & FL_NOM17N)) { M17N_set_font (cp->ctc2_value1, cp->ctc2_value2); break; } #endif x_registerseed(state, cp->ctc2_value1, cp->ctc2_value2); break; case CTL_BAR: draw_bar(state, cp); break; case CTL_IMAGE: { if (state->align == AL_LEFTFILL0) { state->align = AL_LEFTFILL1; state->leftfillpos = state->linewidth; } /* quickhack for postscript */ if (ispsfilename(cp->ctm_fname)) { #if 1 /* by h.kakugawa@computer.org */ image_load_ps(state, cp->ctm_fname, cp->ctm_numcolor, cp->ctm_ximagesize, cp->ctm_yimagesize, 0, cp->ctm_zoomflag, 0, cp->ctm_raise, cp->ctm_rotate, cp->ctm_zoomonclk); #else image_load_ps(state, cp->ctm_fname, cp->ctm_numcolor, cp->ctm_ximagesize, cp->ctm_yimagesize, 0, cp->ctm_zoomflag, 0); #endif } else { #if 1 /* by h.kakugawa@computer.org */ image_load(state, cp->ctm_fname, cp->ctm_numcolor, cp->ctm_ximagesize, cp->ctm_yimagesize, 0, cp->ctm_zoomflag, 0, cp->ctm_raise, cp->ctm_rotate, cp->ctm_zoomonclk); #else image_load(state, cp->ctm_fname, cp->ctm_numcolor, cp->ctm_ximagesize, cp->ctm_yimagesize, 0, cp->ctm_zoomflag, 0); #endif } state->brankline = 0; } break; case CTL_BIMAGE: if (mgp_flag & FL_BIMAGE) break; bg_ctl = cp; /*update later*/ break; case CTL_BGRAD: if (mgp_flag & FL_BIMAGE) break; bg_ctl = cp; /*update later*/ break; case CTL_LCUTIN: CHECK_CACHE; state->special = SP_LCUTIN; break; case CTL_RCUTIN: CHECK_CACHE; state->special = SP_RCUTIN; break; case CTL_SHRINK: CHECK_CACHE; state->special = SP_SHRINK; break; case CTL_PREFIX: state->curprefix = cp->ctc_value; break; case CTL_PREFIXN: state->xprefix = state->width * cp->ctf_value / 100; break; case CTL_TABPREFIX: state->tabprefix = cp->ctc_value; break; case CTL_TABPREFIXN: state->tabxprefix = state->width * cp->ctf_value / 100; break; case CTL_PREFIXPOS: { char *p; p = (state->tabprefix) ? state->tabprefix : state->curprefix; if (!p) break; #ifdef USE_M17N if (! (mgp_flag & FL_NOM17N)) { cp->ct_op = CTL_TEXT; cp->ctc_value = p; M17N_draw_string (state, cp); break; } #endif draw_line_output(state, p); break; } case CTL_TEXT: if (!cp->ctc_value) break; if (state->align == AL_LEFTFILL0) { state->align = AL_LEFTFILL1; state->leftfillpos = state->linewidth; } #ifdef USE_M17N if (! (mgp_flag & FL_NOM17N)) { M17N_draw_string (state, cp); break; } #endif draw_line_output(state, cp->ctc_value); break; case CTL_LINESTART: state->charoff = 0; char_size[caching] = nonscaled_size[caching]; if (state->line == 0) { /* * set background of target */ if (bg_ctl) { if (!caching){ /* target is window, so we need care bg_ctl_last */ if (bg_ctl_last && !ctlcmp(bg_ctl, bg_ctl_last)){ /* same as last time, we do nothing */ ; } else { /* we have to change background */ get_background_pixmap(bg_ctl, state); /* set window background */ set_background_pixmap(bg_ctl); bg_ctl_last = bg_ctl; } XClearWindow(display, state->target); } else { get_background_pixmap(bg_ctl, state); bg_ctl_cache = bg_ctl; XClearPixmap(display, state->target); } } else { if (!caching) XClearWindow(display, state->target); else XClearPixmap(display, state->target); } if (t_fin) timebar(state); } draw_line_start(state); break; case CTL_LINEEND: /* blank lines */ if (state->brankline) { /*XXX*/ state->max_lineascent = char_size[caching]; state->maxascent = char_size[caching]; state->maxdescent = VERT_GAP(char_size[caching]); } draw_line_end(state); /* reset single-line oriented state */ state->tabprefix = NULL; state->tabxprefix = 0; state->special = 0; if (state->align == AL_LEFTFILL1) { state->align = AL_LEFTFILL0; state->leftfillpos = 0; } break; case CTL_MARK: state->have_mark = 1; state->mark_ypos = state->ypos; break; case CTL_SYSTEM: CHECK_CACHE; process_system(state, cp); break; case CTL_XSYSTEM: CHECK_CACHE; process_xsystem(state, cp); break; case CTL_TSYSTEM: CHECK_CACHE; process_tsystem(state, cp); break; case CTL_ICON: process_icon(state, cp); break; #ifdef VFLIB case CTL_VFCAP: vfcap_name = cp->ctc_value; break; #endif #ifdef FREETYPE case CTL_TFDIR: freetypefontdir = cp->ctc_value; break; case CTL_TFONT0: freetypefont0 = cp->ctc_value; break; case CTL_TMFONT0: freetypemfont0 = cp->ctc_value; break; #endif case CTL_NOOP: case CTL_NODEF: break; case CTL_XFONT: /* obsolete directives */ fprintf(stderr, "internal error: obsolete directive " "\"%s\"\n", ctl_words[cp->ct_op].ctl_string); exit(1); /*NOTREACHED*/ case CTL_PCACHE: if (!caching) { if (cp->ctch_flag) mgp_flag |= FL_FRDCACHE; else mgp_flag ^= FL_FRDCACHE; cache_mode = cp->ctch_mode; cache_effect = cp->ctch_effect; cache_value = cp->ctch_value; } else { pcache.flag = 1; pcache.page = state->page; pcache.mgpflag = cp->ctch_flag; pcache.mode = cp->ctch_mode; pcache.effect = cp->ctch_effect; pcache.value = cp->ctch_value; } break; case CTL_CHARSET: if (get_regid(cp->ctc_value) < 0){ fprintf(stderr, "invalid charset \"%s\". ignored\n", cp->ctc_value); break; } strcpy(mgp_charset, cp->ctc_value); break; #ifdef MNG case CTL_ANIM: if (state->align == AL_LEFTFILL0) { state->align = AL_LEFTFILL1; state->leftfillpos = state->linewidth; } process_anim(state, cp); break; #endif case CTL_VALIGN: valign = cp->cti_value; break; case CTL_AREA: state->width = window_width * cp->ctar_width / 100; state->height = window_height * cp->ctar_height / 100; state->xoff = window_width * cp->ctar_xoff / 100; state->yoff = window_height * cp->ctar_yoff / 100; state->ypos = 0; break; case CTL_OPAQUE: #ifdef USE_XFT2 if (cp->cti_value > 100){ fprintf(stderr, "%%opaque: value should be 0-100\n"); cp->cti_value = 100; } state->opaque = cp->cti_value; if (mgp_flag & FL_NOXFT && verbose){ fprintf(stderr, "ignored %%opaque.\n"); } #else printf("this mgp cannot use %%opaque, needs to be built with xft2\n"); #endif break; case CTL_M17N: #ifdef USE_M17N M17N_process_direc(cp->ctc2_value1, cp->ctc2_value2); #else fprintf(stderr, "this mgp cannot use %%m17n, needs to be built with m17n-lib\n"); #endif break; case CTL_PSFONT: break; default: fprintf(stderr, "undefined directive %d at page %d line %d:\n\t", cp->ct_op, state->page, state->line); debug0(cp); break; } } /* * line management. */ static int set_position(state) struct render_state *state; { int x; x = 0; switch (state->align) { case AL_CENTER: x = (state->width - state->linewidth)/ 2; break; case AL_LEFT: case AL_LEFTFILL0: case AL_LEFTFILL1: x = 0; break; case AL_RIGHT: x = state->width - state->linewidth; break; } return x; } void draw_line_start(state) struct render_state *state; { struct render_object *obj; state->max_lineascent = 0; state->max_linedescent = 0; state->maxascent = 0; state->maxdescent = 0; state->linewidth = 0; state->brankline = 1; while ((obj = state->obj)) obj_free(state, obj); } void draw_line_itemsize(state, ascent, descent, flheight) struct render_state *state; int ascent; int descent; int flheight; { ascent -= state->charoff; descent += state->charoff; if (ascent > state->maxascent) state->maxascent = ascent; if (descent > state->maxdescent) state->maxdescent = descent; /* * calculation for the height of a line should ignore * character offset */ if (state->charoff == 0) { if (ascent > state->max_lineascent) state->max_lineascent = ascent; if (descent > state->max_linedescent) state->max_linedescent = descent; } if (flheight > state->maxflheight) state->maxflheight = flheight; } static void draw_line_output(state, data) struct render_state *state; char *data; { draw_string(state, data); } void draw_line_end(state) struct render_state *state; { int xpos; xpos = set_position(state); /* process the special attribute. */ switch (state->special) { #if 0 case SP_SHRINK: shrink(data, page, xpos); break; #endif case SP_LCUTIN: cutin(state, xpos, state->ypos, 1); break; case SP_RCUTIN: cutin(state, xpos, state->ypos, -1); break; default: break; } if (state->obj) { obj_draw(state, state->target, xpos, state->ypos); while (state->obj) obj_free(state, state->obj); } state->ypos += state->max_lineascent; /* * we should ignore height of images to calculate line gap. * suggested by Toru Terao */ if (VERT_GAP(char_size[caching]) < state->max_linedescent) state->ypos += state->max_linedescent; else state->ypos += VERT_GAP(char_size[caching]); state->ypos += 2; } #define min(x, y) (x < y ? x: y) static void cutin(state, lx, ly, dir) struct render_state *state; int lx; int ly; int dir; { u_int step, x, xoff, yoff; int i, sx, round; int root_x, root_y, use_copy; Window cutinWin, junkwin; XImage *copywin; static XWindowAttributes xa; XWindowAttributes wa; Pixmap ghostWin; GC saveGC = gc_cache; XGetWindowAttributes(display, window, &wa); ghostWin = XCreatePixmap(display, window, wa.width, wa.height, wa.depth); /* all drawing should be done on the image */ gc_cache = XCreateGC(display, ghostWin, 0, 0); XCopyArea(display, state->target, ghostWin, gc_cache, 0, 0, wa.width, wa.height, 0, 0); if (state->repaint) return; if (!state->linewidth) return; if (!xa.width) XGetWindowAttributes(display, DefaultRootWindow(display), &xa); XTranslateCoordinates(display, window, DefaultRootWindow(display), 0, 0, &root_x ,&root_y, &junkwin); use_copy = 1; if ((root_x + window_width > xa.width) || (root_y + window_height > xa.height) || (root_x < 0 || root_y < 0)) use_copy = 1; sx = (0 < dir) ? 0 : state->width - state->linewidth; round = 20; /*XXX*/ #ifndef abs #define abs(a) (((a) < 0) ? -(a) : (a)) #endif if (abs(lx - sx) < round){ round = abs(lx - sx); if (!round) round = 1; } step = (lx - sx) / round; if (!use_copy){ cutinWin = XCreateSimpleWindow(display, state->target, sx, ly, state->linewidth, state->maxascent + state->maxdescent, 0, fore_color[caching], back_color[caching]); XSetWindowBackgroundPixmap(display, cutinWin, None); XMapSubwindows(display, state->target); } else { copywin = XGetImage(display, window, state->xoff + min(sx, lx), ly + state->yoff, state->linewidth + abs(lx - sx), state->maxascent + state->maxdescent, AllPlanes, ZPixmap); } xoff = state->xoff; yoff = state->yoff; state->xoff = state->yoff = 0; if (state->obj && !use_copy) { obj_draw(state, cutinWin, 0, 0); } XFlush(display); x = sx; for (i = 0; i < round; i++) { if (use_copy && state->obj) { obj_draw(state, ghostWin, x + xoff, ly + yoff); XCopyArea(display, ghostWin, state->target, saveGC, xoff + min(sx, lx), ly + yoff, state->linewidth + abs(lx - sx), state->maxascent + state->maxdescent, xoff + min(sx, lx), ly + yoff); } else XMoveWindow(display, cutinWin, x + xoff, ly + yoff); XFlush(display); usleep(CUTIN_DELAY); if (use_copy && state->obj) { XPutImage(display, ghostWin, gc_cache, copywin, x - min(sx, lx) , 0, x + xoff, ly + yoff, state->linewidth, state->maxascent + state->maxdescent); } x = sx + ((i+1)*(lx - sx)) / round; } XCopyArea(display, ghostWin, state->target, saveGC, 0, 0, wa.width, wa.height, 0, 0); if (!use_copy) XDestroyWindow(display, cutinWin); state->xoff = xoff; state->yoff = yoff; /* freeing images */ if(use_copy) XFree(copywin); /* restoring tho old GC */ XFreeGC(display, gc_cache); XFreePixmap(display, ghostWin); gc_cache = saveGC; } #if 0 static void shrink(data, page) char *data; u_int page; { u_int min_csize = char_size; u_int max_csize = state->height / 4; u_int csize, i, x; u_int step = (max_csize - min_csize) / 3; if (!step) step = 1; if (state->align != AL_CENTER) { fprintf(stderr, "align is not center: \n"); return; } csize = char_size; for (i = max_csize; i > min_csize; i -= step) { char_size = i; draw_string(state, data); x = (state->width - state->linewidth) / 2; XCopyArea(display, maskpix, state->target, gc, 0, 0, state->linewidth, char_size, x, state->ypos); XCopyArea(display, pixmap, state->target, gcor, 0, 0, state->linewidth, char_size, x, state->ypos); XFlush(display); usleep(SHRINK_DELAY); XFillRectangle(display, pixmap, gcall, 0, 0, state->width, char_size); XFillRectangle(display, maskpix, gcall, 0, 0, state->width, char_size); XClearArea(display, state->target, x, state->ypos, state->linewidth, char_size, 0); } char_size = csize; } #endif /* * render characters. */ static void draw_string(state, data) struct render_state *state; char *data; { u_char *p, *q; char *registry = NULL; u_int code2; static char *rtab96[] = { NULL, /* ESC - @ */ "iso8859-1", /* ESC - A */ "iso8859-2", /* ESC - B */ "iso8859-3", /* ESC - C */ "iso8859-4", /* ESC - D */ }; #define RTAB96_MAX (sizeof(rtab96)/sizeof(rtab96[0])) static char *rtab9494[] = { "jisx0208.1978-*", /* ESC $ @ or ESC $ ( @ */ "gb2312.1980-*", /* ESC $ A or ESC $ ( A */ "jisx0208.1983-*", /* ESC $ B or ESC $ ( B */ "ksc5601.1987-*", /* ESC $ ( C */ NULL, /* D */ NULL, /* E */ NULL, /* F */ NULL, /* G */ NULL, /* H */ NULL, /* I */ NULL, /* J */ NULL, /* K */ NULL, /* L */ NULL, /* M */ NULL, /* N */ "jisx0213.2000-1", /* ESC $ ( O */ "jisx0213.2000-2", /* ESC $ ( P */ }; #define RTAB9494_MAX (sizeof(rtab9494)/sizeof(rtab9494[0])) int charset16 = 0; p = (u_char *)data; while (*p && *p != '\n') { /* 94x94 charset */ if (p[0] == 0x1b && p[1] == '$' && '@' <= p[2] && p[2] < 'C' && rtab9494[p[2] - '@']) { registry = rtab9494[p[2] - '@']; charset16 = 1; p += 3; continue; } if (p[0] == 0x1b && p[1] == '$' && p[2] == '(' && '@' <= p[3] && p[3] < '@' + RTAB9494_MAX && rtab9494[p[3] - '@']) { registry = rtab9494[p[3] - '@']; charset16 = 1; p += 4; continue; } /* ascii (or JIS roman) */ if (p[0] == 0x1b && p[1] == '(' && (p[2] == 'B' || p[2] == 'J')) { registry = NULL; charset16 = 0; p += 3; continue; } /* 96 charset */ if (p[0] == 0x1b && p[1] == '-' && '@' < p[2] && p[2] < '@' + RTAB96_MAX && rtab96[p[2] - '@']) { registry = rtab96[p[2] - '@']; charset16 = 0; p += 3; continue; } if (!registry && isspace(p[0])) { draw_fragment(state, p, 1, registry, 0); p++; continue; } if (charset16) { for (q = p + 2; 0x21 <= *q && *q <= 0x7e; q += 2) { code2 = q[0] * 256 + q[1]; if (strncmp(registry, "jisx0208", 8) == 0 && !iskinsokuchar(code2)) { break; } } } else { q = p; while (*q && isprint(*q) && !isspace(*q)) q++; if (q == p) q++; else { /* * append spaces to the end of the word. * fragments in the following line: * "this is test" * are: * "this_" "is_" "test" */ while (*q && isspace(*q)) q++; } } q = draw_fragment(state, p, q - p, registry, charset16); p = q; } } static char * draw_fragment(state, p, len, registry, charset16) struct render_state *state; u_char *p; u_int len; char *registry; int charset16; /*2-octet charset?*/ { u_int char_len, i; u_short code; struct render_object *tail; struct render_object *thisline; struct render_object *thislineend; u_int startwidth; struct render_state backup0, backup; enum { MODE_UNKNOWN, MODE_X, MODE_VFLIB, MODE_FREETYPE } mode = MODE_UNKNOWN; char *p0; #ifdef USE_XFT2 if (!(mgp_flag & FL_NOXFT)){ p0 = xft_draw_fragment(state, p, len, registry, charset16); if (p0) return p0; } #endif if (state->obj) tail = state->objlast; else tail = NULL; startwidth = state->linewidth; while (len) { code = charset16 ? p[0] * 256 + p[1] : p[0]; if (code != ' ') state->brankline = 0; /* This isn't brankline */ #if 0 if (code == ' ') { char_len = char_size[caching] / 2; p++; len--; state->linewidth += HORIZ_STEP(char_size[caching], char_len); continue; } #endif if (code == '\t') { char_len = char_size[caching] / 2; p++; len--; char_len = HORIZ_STEP(char_size[caching], char_len) * 8;/*XXX*/ state->linewidth = (state->linewidth + char_len) / char_len * char_len; continue; } /* * decide which font to use. * Japanese font: * VFlib - optional * then X. * Western font: * If possible, freetype. (in the future) - optional * X if truely scalable. * VFlib if it is larger than some size - optional * otherwise, X. */ mode = MODE_UNKNOWN; if (charset16) { #ifdef VFLIB if (!(mgp_flag & FL_NOVFLIB) && strncmp(registry, "jisx0208.1983-", 14) == 0) mode = MODE_VFLIB; #endif #ifdef FREETYPE_CHARSET16 if (!(mgp_flag & FL_NOFREETYPE) && (strncmp(registry, "jisx0208.1983-", 14) == 0 || strncmp(registry, "jisx0213.2000-", 14) == 0)) { if (tfc_get(code, char_size[caching], 1, registry, charset16)){ mode = MODE_FREETYPE; } } #endif if (mode == MODE_UNKNOWN) mode = MODE_X; } else { #ifdef FREETYPE if (!(mgp_flag & FL_NOFREETYPE)) { if (tfc_get(code, char_size[caching], 1, registry, charset16)) { mode = MODE_FREETYPE; } } #endif if (mode == MODE_UNKNOWN) { /* * if we can have X font that is exactly * matches the required size, we use that. */ XFontStruct *xfontstruct; int ts; xfontstruct = x_setfont( x_findseed(state, registry), char_size[caching], registry, &ts); if (ts) mode = MODE_X; } #ifdef VFLIB # ifdef USE_XDRAWSTRING_ONLY_SMALL if (!(mgp_flag & FL_NOVFLIB) && mode == MODE_UNKNOWN) { if (25 < char_size) mode = MODE_VFLIB; } # endif /* USE_XDRAWSTRING_ONLY_SMALL */ #endif /* last resort: use X font. */ if (mode == MODE_UNKNOWN) mode = MODE_X; } /* back it up before drawing anything */ memcpy(&backup0, state, sizeof(struct render_state)); switch (mode) { #ifdef VFLIB case MODE_VFLIB: char_len = draw_onechar_vf(state, code, state->linewidth, state->charoff, registry ? char_size[caching] : (char_size[caching] * 4 / 5), /*XXX*/ char_size[caching]); break; #endif #ifdef FREETYPE case MODE_FREETYPE: /* * NOTE: width and height parameter (4th and 5th) * are meaningless for FreeType, since we use * metric info derived from TrueType font file. */ char_len = draw_onechar_tf(state, code, state->linewidth, state->charoff, char_size[caching], registry, (len == (charset16 ? 2 : 1)) ? 1 : 0, charset16); break; #endif default: fprintf(stderr, "invalid drawing mode %d for %04x " "- fallback to X11\n", mode, code); /* fall through */ case MODE_UNKNOWN: case MODE_X: char_len = draw_onechar_x(state, code, state->linewidth, state->charoff, char_size[caching], registry, (len == (charset16 ? 2 : 1)) ? 1 : 0); if (char_len == 0) { fprintf(stderr, "can't load font size %d " "(nor font in similar size) for " "font <%s:%d:%s>, glyph 0x%04x\n", char_size[caching], x_findseed(state, registry), char_size[caching], registry?registry:"NULL", code); } break; } p += (charset16 ? 2 : 1); len -= (charset16 ? 2 : 1); state->linewidth += HORIZ_STEP(char_size[caching], char_len); /* ukai */ if (!charset16 && state->linewidth + HORIZ_STEP(char_size[caching], char_len) > state->width) { if (len >= 20) break; /* too long word */ for (i = 0; i < len; i ++){ if (isspace(*(p +i))) break; } if (i == len) break; } } if (state->width - state->leftfillpos / 2 < state->linewidth #if 0 && state->align == AL_LEFTFILL1 #endif ) { memcpy(&backup, state, sizeof(struct render_state)); /* strip off the last fragment we wrote. */ if (tail) { thisline = tail->next; thislineend = state->objlast; tail->next = NULL; state->objlast = tail; state->maxascent = backup0.maxascent; state->maxdescent = backup0.maxdescent; } else { thisline = state->obj; thislineend = state->objlast; state->obj = state->objlast = NULL; state->maxascent = backup0.maxascent; state->maxdescent = backup0.maxdescent; } #if 0 state->align = AL_LEFT; #endif state->linewidth = startwidth; draw_line_end(state); /* flush the line. */ /* start the new line with the last fragment we wrote. */ draw_line_start(state); state->linewidth = state->leftfillpos; state->linewidth += (backup.linewidth - startwidth); if (state->obj && state->objlast) state->objlast->next = thisline; else state->obj = thisline; state->objlast = thislineend; state->align = backup.align; /* fix up x position and maxascent. */ for (tail = state->obj; tail; tail = tail->next) { tail->x -= startwidth; tail->x += state->leftfillpos; draw_line_itemsize(state, tail->ascent, tail->descent, 0); } } return p; } static int iskinsokuchar(code) u_int code; { u_short *kinsoku; for (kinsoku = kinsokutable; *kinsoku; kinsoku++) { if (code == *kinsoku) return 1; } return 0; } static struct render_object * obj_alloc(state) struct render_state *state; { struct render_object *obj; obj = malloc(sizeof(*obj)); if (obj == NULL) return NULL; obj->next = NULL; if (state->obj == NULL) state->obj = obj; else state->objlast->next = obj; state->objlast = obj; return obj; } static void obj_free(state, obj) struct render_state *state; struct render_object *obj; { struct render_object *o; if (state->obj == obj) state->obj = obj->next; else { for (o = state->obj; o; o = o->next) if (o->next == obj) break; /* ASSERT(o != NULL); */ o->next = obj->next; } if (state->objlast == obj) state->objlast = obj->next; switch (obj->type) { #ifdef VFLIB case O_VFONT: obj->data.vfc->ref--; break; #endif /* VFLIB */ #ifdef FREETYPE case O_TFONT: obj->data.tfc->ref--; break; #endif /* FREETYPE */ case O_IMAGE: freeImage(obj->data.image.image); break; case O_XFONT: free(obj->data.xfont.xfont); break; case O_ICON: if (obj->data.icon.xpoint) free(obj->data.icon.xpoint); break; #ifdef USE_XFT2 case O_XTFONT: if (obj->data.xftfont.data) free(obj->data.xftfont.data); if (obj->data.xftfont.fontname) free(obj->data.xftfont.fontname); if (obj->data.xftfont.registry) free(obj->data.xftfont.registry); break; #endif #ifdef USE_M17N case O_M17NTEXT: /* XXX we need to add free function for mtext data here! */ m17n_object_unref(obj->data.m17ntext.mt); break; #endif #ifdef MNG case O_ANIM: break; #endif /* MNG */ } free(obj); } #ifdef VFLIB static int obj_new_vfont(state, x, y, vfc, size) struct render_state *state; int x, y; struct vfont *vfc; int size; { struct render_object *obj; obj = obj_alloc(state); if (obj == NULL) return 0; obj->x = x; obj->y = y; obj->fore = fore_color[caching]; obj->type = O_VFONT; obj->data.vfc = vfc; obj->data.vfc->size = size; obj->ascent = obj->data.vfc->ascent - y; obj->descent = obj->data.vfc->descent + y; obj->vertloc = VL_BASE; vfc->ref++; return 1; } #endif /* VFLIB */ #ifdef FREETYPE static int obj_new_tfont(state, x, y, tfc) struct render_state *state; int x, y; struct tfont *tfc; { struct render_object *obj; obj = obj_alloc(state); if (obj == NULL) return 0; obj->x = x; obj->y = y; obj->fore = fore_color[caching]; obj->type = O_TFONT; obj->data.tfc = tfc; obj->ascent = obj->data.tfc->ascent - y; obj->descent = obj->data.tfc->descent + y; obj->vertloc = VL_BASE; tfc->ref++; return 1; } #endif /* FREETYPE */ static int obj_new_xfont(state, x, y, size, code, registry) struct render_state *state; int x, y; int size; u_int code; char *registry; { struct render_object *obj; obj = obj_alloc(state); if (obj == NULL) return 0; obj->x = x; obj->y = y; obj->fore = fore_color[caching]; obj->type = O_XFONT; obj->data.xfont.xfont = strdup(x_findseed(state, registry)); obj->data.xfont.csize = size; obj->data.xfont.code = code; obj->data.xfont.registry = registry; obj->ascent = size - y; /*XXX*/ obj->descent = -y; /*XXX*/ obj->vertloc = VL_BASE; return 1; } static int obj_new_image(state, x, y, image, xzoom, yzoom) struct render_state *state; int x, y; Image *image; int xzoom, yzoom; { struct render_object *obj; obj = obj_alloc(state); if (obj == NULL) return 0; obj->x = x; obj->y = y; obj->type = O_IMAGE; obj->data.image.image = image; obj->data.image.xzoom = xzoom; obj->data.image.yzoom = yzoom; obj->ascent = 0; /*XXX*/ obj->descent = image->height * yzoom / 100; /*XXX*/ obj->vertloc = VL_TOP; return 1; } #ifdef USE_IMLIB static int obj_new_image2(state, x, y, image, xzoom, yzoom, imimage, zoomonclk) struct render_state *state; int x, y; Image *image; int xzoom, yzoom; Imlib_Image *imimage; int zoomonclk; { struct render_object *obj; obj = obj_alloc(state); if (obj == NULL) return 0; obj->x = x; obj->y = y; obj->type = O_IMAGE; obj->data.image.image = image; obj->data.image.xzoom = xzoom; obj->data.image.yzoom = yzoom; obj->ascent = 0; /*XXX*/ obj->descent = image->height * yzoom / 100; /*XXX*/ obj->vertloc = VL_TOP; obj->data.image.imimage = imimage; obj->data.image.zoomonclk = zoomonclk; return 1; } #endif static int obj_new_icon(state, x, y, itype, isize, color, npoint, xpoint) struct render_state *state; int x, y; u_int itype, isize; u_long color; u_int npoint; XPoint *xpoint; { struct render_object *obj; int i; obj = obj_alloc(state); if (obj == NULL) return 0; obj->x = x; obj->y = y; obj->fore = color; obj->type = O_ICON; obj->data.icon.itype = itype; obj->data.icon.isize = isize; obj->data.icon.npoint = npoint; if (npoint) { obj->data.icon.xpoint = malloc(sizeof(XPoint) * npoint); if (obj->data.icon.xpoint == NULL) { obj_free(state, obj); return 0; } for (i = 0; i < npoint; i++) obj->data.icon.xpoint[i] = xpoint[i]; } else obj->data.icon.xpoint = NULL; obj->ascent = 0; /*XXX*/ obj->descent = isize; /*XXX*/ obj->vertloc = VL_CENTER; #ifdef USE_M17N // Adjust icon position for line folding function if (mgp_flag & FL_NOM17N) obj->vertloc = VL_CENTER; else obj->vertloc = VL_ICENTER; #endif return 1; } static Pixel obj_image_color(image, bimage, d, inithist) Image *image, *bimage; Pixel d; int *inithist; { int i, j; RGBMap rgb; int r, g, b; static char hist[256]; byte *p; switch (bimage->type) { case IBITMAP: r = g = b = d ? 0xffff : 0; break; case IRGB: r = bimage->rgb.red[d]; g = bimage->rgb.green[d]; b = bimage->rgb.blue[d]; break; case ITRUE: r = TRUE_RED(d) << 8; g = TRUE_GREEN(d) << 8; b = TRUE_BLUE(d) << 8; break; default: return 0; } if (image->type == ITRUE) return RGB_TO_TRUE(r, g, b); for (i = 0; i < image->rgb.used; i++) { if (image->rgb.red[i] == r && image->rgb.green[i] == g && image->rgb.blue[i] == b) return i; } if (i >= image->rgb.size) { if (i >= 256) { /* search a free slot */ if (image->rgb.size == 256) { if (!*inithist) { *inithist = 1; memset(hist, 0, sizeof(hist)); p = image->data; for (j = 0; j < image->height; j++) for (i = 0; i < image->width; i++) hist[*p++] = 1; } for (i = 0; i < 256; i++) { if (hist[i] == 0) { hist[i] = 1; goto freeslot; } } } return -1; } image->depth = 8; newRGBMapData(&rgb, depthToColors(image->depth)); for (i = 0; i < image->rgb.used; i++) { rgb.red[i] = image->rgb.red[i]; rgb.green[i] = image->rgb.green[i]; rgb.blue[i] = image->rgb.blue[i]; } rgb.used = i; freeRGBMapData(&image->rgb); image->rgb = rgb; } freeslot: image->rgb.red[i] = r; image->rgb.green[i] = g; image->rgb.blue[i] = b; if (image->rgb.used < i + 1) image->rgb.used = i + 1; return i; } static Image * obj_image_trans(image, x, y) Image *image; u_int x, y; { Image *timage; int i, j; byte *p, *b; Pixel d, n, pd; static XColor xcol; int pl, bpl; int trans; u_int bw, bh, bx, by; int inithist; if (!COMPLEX_BGIMAGE) { if (back_color[caching] != xcol.pixel) { xcol.pixel = back_color[caching]; xcol.flags = DoRed|DoGreen|DoBlue; XQueryColor(display, colormap, &xcol); } switch (image->type) { case IBITMAP: case IRGB: image->rgb.red[image->trans] = xcol.red; image->rgb.green[image->trans] = xcol.green; image->rgb.blue[image->trans] = xcol.blue; break; case ITRUE: d = image->trans; n = RGB_TO_TRUE(xcol.red, xcol.green, xcol.blue); pl = image->pixlen; p = image->data; for (j = 0; j < image->height; j++) { for (i = 0; i < image->width; i++, p += pl) { if (memToVal(p, pl) == d) valToMem(n, p, pl); } } break; } bw = bh = 0; /* for lint */ goto end; } bh = bgpixmap[bgindex].image->height; bw = bgpixmap[bgindex].image->width; j = 0; if (image->type == IBITMAP) { expand: timage = image; if (verbose) fprintf(stderr, "obj_image_trans: expanding image\n"); image = expand(image); if (image != timage) freeImage(timage); } pl = image->pixlen; p = image->data + image->width * j * pl; bpl = bgpixmap[bgindex].image->pixlen; pd = -1; n = 0; /* for lint */ trans = image->trans; inithist = 0; for ( ; j < image->height; j++) { by = (y + j) % bh; bx = x % bw; b = bgpixmap[bgindex].image->data + (bgpixmap[bgindex].image->width * by + bx) * bpl; for (i = 0; i < image->width; i++, p += pl, b += bpl, bx++) { if (bx == bw) { bx = 0; b = bgpixmap[bgindex].image->data + bgpixmap[bgindex].image->width * by * bpl; } if (memToVal(p, pl) != trans) continue; d = memToVal(b, bpl); if (d != pd) { pd = d; n = obj_image_color(image, bgpixmap[bgindex].image, d, &inithist); if (n == -1) goto expand; } valToMem(n, p, pl); } } end: if (verbose) { char *p; switch (image->type) { case IBITMAP: p = "bitmap"; break; case IRGB: p = "rgb"; break; default: p = "true"; break; } fprintf(stderr, "obj_image_trans: %s: " "trans=%d, rgb_used=%d, rgb_size=%d\n", p, image->trans, image->rgb.used, image->rgb.size); fprintf(stderr, " image=%dx%d+%d+%d", image->width, image->height, x, y); if (COMPLEX_BGIMAGE) fprintf(stderr, " bgpixmap[bgindex].image=%dx%d", bw, bh); fprintf(stderr, "\n"); } image->trans = -1; /* XXX: need recalculation to redraw? */ return image; } static void obj_draw_image(target, x, y, obj, page) Drawable target; u_int x, y; struct render_object *obj; int page; { Image *image, *timage; XImageInfo *ximageinfo; XImage *xim; int private = mgp_flag & FL_PRIVATE; image = obj->data.image.image; if (obj->data.image.xzoom != 100.0 || obj->data.image.yzoom != 100.0) { timage = image; image = zoom(image, obj->data.image.xzoom, obj->data.image.yzoom, verbose); if (!image) { fprintf(stderr, "image zoom (%0.2fx%0.2f) failed in obj_draw_image\n", obj->data.image.xzoom, obj->data.image.yzoom); exit(1); } freeImage(timage); } if (image->trans >= 0) image = obj_image_trans(image, x, y); obj->data.image.image = image; /* to free later */ ximageinfo= imageToXImage(display, screen, visual, depth, image, private, 0,0, verbose); if (ximageinfo == NULL) { fprintf(stderr, "Cannot convert Image to XImage\n"); cleanup(-1); } xim = ximageinfo->ximage; if (xim->format == XYBitmap) XSetBackground(display, gcfore, back_color[caching]); XPutImage(display, target, gcfore, xim, 0, 0, x, y, xim->width, xim->height); #ifdef USE_IMLIB if (obj->data.image.zoomonclk) { regist_zimage_position(obj, x, y, xim->width, xim->height, page); } #endif freeXImage(image, ximageinfo); } static void obj_draw(state, target, xpos, ypos) struct render_state *state; Drawable target; u_int xpos, ypos; { struct render_object *obj; int x = 0, y = 0; int width, height, xwidth, xheight; u_long fore; u_int code; char *registry; XChar2b kch[2]; #define MAXDRAWAREA 1024 struct { int x, y, width, height; } drawarea[MAXDRAWAREA]; int areaindex = 0; #define addarea(X) \ {\ if (areaindex == MAXDRAWAREA){\ fprintf(stderr, "too many drawarea (increase MAXDRAWAREA)\n");\ exit(1);\ }\ drawarea[areaindex].x = x;\ drawarea[areaindex].y = y - obj->data.X->ascent;\ drawarea[areaindex].width = obj->data.X->xmax+1;\ drawarea[areaindex].height = obj->data.X->height+1;\ areaindex ++;\ } #if 0 char ch[2]; #endif u_int isize; int i; int lineoff; /* ypos correction for lines with superscripts */ #ifdef RASTERLIB XImage *bim, *xim; u_long bcolor; #endif /* RASTERLIB */ /* * very complicated... * * xpos, ypos x/y position of the target, * leftmost and uppermost dot. * state->ypos absolute y position in main window. */ xpos += state->tabxprefix ? state->tabxprefix : state->xprefix; width = (state->linewidth <= state->width - xpos) ? state->linewidth : state->width - xpos; height = state->maxascent + state->maxdescent + 1; xpos += state->xoff; ypos += state->yoff; fore = fore_color[caching]; /* * only used with superscript offset for calculating the * exact line position (ypos correction) */ lineoff = state->maxascent - state->max_lineascent; #ifdef RASTERLIB bcolor = back_color[caching]; for (obj = state->obj; obj; obj = obj->next) { #ifdef VFLIB if (obj->type == O_VFONT){ xwidth = obj->data.vfc->width; xheight = obj->data.vfc->height; break; } #endif /* VFLIB */ #ifdef FREETYPE if (obj->type == O_TFONT){ xwidth = obj->data.tfc->width; xheight = obj->data.tfc->height; break; } #endif /* FREETYPE */ } if (obj != NULL) { /* VFONT exist */ xim = XCreateImage(display, visual, depth, ZPixmap, 0, NULL, width, height, (depth <= 8) ? 8 : (depth <= 16) ? 16 : 32, 0); xim->data = malloc(xim->bytes_per_line * height); if (COMPLEX_BGIMAGE) { u_int bw, bh, bx, by, ox, oy; u_long p; u_long r, g, b; byte *bp; int bpl; XColor col; bim = bgpixmap[bgindex].ximageinfo->ximage; bw = bim->width; bh = bim->height; ox = xpos; oy = state->ypos + state->yoff; bcolor = (u_long)-1; /* tell vfc_image() to calculate */ by = oy % bh; if (bw == 1) { r = g = b = 0; bpl = bgpixmap[bgindex].image->pixlen; bp = bgpixmap[bgindex].image->data + by * bpl; for (y = 0; y < height; y++, by++, bp += bpl) { if (by == bh) by = 0; p = memToVal(bp, bpl); if (TRUEP(bgpixmap[bgindex].image)) { r += TRUE_RED(p) << 8; g += TRUE_GREEN(p) << 8; b += TRUE_BLUE(p) << 8; } else { r += bgpixmap[bgindex].image->rgb.red[p]; g += bgpixmap[bgindex].image->rgb.green[p]; b += bgpixmap[bgindex].image->rgb.blue[p]; } p = XGetPixel(bim, 0, by); for (x = 0; x < width; x++) XPutPixel(xim, x, y, p); } col.red = r / height; col.green = g / height; col.blue = b / height; col.flags = DoRed|DoGreen|DoBlue; /* XXX:actually we don't need to allocate. */ if (XAllocColor(display, colormap, &col)) { regist_alloc_colors(&font_clr, &col.pixel, 1); bcolor = col.pixel; } #if 0 fprintf(stderr, "bim=%dx%d, r=%x, g=%x, b=%x, " "bcolor=%x\n", bgpixmap[bgindex].image->width, bgpixmap[bgindex].image->height, col.red, col.green, col.blue, bcolor); #endif } else { for (y = 0; y < height; y++, by++) { if (by == bh) by = 0; for (x = 0, bx = ox % bw; x < width; x++, bx++) { if (bx == bw) bx = 0; p = XGetPixel(bim, bx, by); XPutPixel(xim, x, y, p); } } } } else { memset(xim->data, 0, xim->bytes_per_line * height); XAddPixel(xim, bcolor); } for ( ; obj; obj = obj->next) { x = obj->x; switch (obj->vertloc) { case VL_BASE: y = state->maxascent; break; case VL_CENTER: y = (state->maxascent + state->maxdescent) / 2; y += (obj->ascent - obj->descent) / 2; break; case VL_TOP: y = obj->ascent; break; case VL_BOTTOM: y = state->maxascent + state->maxdescent; y -= obj->descent; break; } y += obj->y; #ifdef VFLIB if (obj->type == O_VFONT) { (void)vfc_image(obj->data.vfc, obj->fore, bcolor, xim, x, y); addarea(vfc); } #endif /* VFLIB */ #ifdef FREETYPE if (obj->type == O_TFONT) { (void)tfc_image(obj->data.tfc, obj->fore, bcolor, xim, x, y); addarea(tfc); } #endif /* FREETYPE */ } #if 0 XPutImage(display, target, gcfore, xim, 0, 0, xpos, ypos, width, height); #else for (i = 0; i < areaindex; i ++) XPutImage(display, target, gcfore, xim, drawarea[i].x, drawarea[i].y, drawarea[i].x + xpos, ypos + drawarea[i].y - lineoff, drawarea[i].width, drawarea[i].height); #endif XDestroyImage(xim); if (mgp_flag & FL_GLYPHEDGE) { XDrawLine(display, target, gcfore, state->xoff, ypos, state->xoff + state->width - 1, ypos); XDrawLine(display, target, gcfore, state->xoff, ypos + state->maxascent, state->xoff + state->width - 1, ypos + state->maxascent); XDrawLine(display, target, gcgreen, state->xoff, ypos + state->maxascent + state->maxdescent, state->xoff + state->width - 1, ypos + state->maxascent + state->maxdescent); XDrawLine(display, target, gcred, state->xoff, ypos + height, state->xoff + state->width - 1, ypos + height); } } #endif /* RASTERLIB */ for (obj = state->obj; obj; obj = obj->next) { #if 0 x = obj->x + offx; y = obj->y + offy; #else x = obj->x; switch (obj->vertloc) { case VL_BASE: y = state->maxascent; break; case VL_ICENTER: if (state->maxflheight){ y = (state->maxascent + state->maxflheight) / 2; } else y = (state->maxascent + state->maxdescent) / 2; y += (obj->ascent - obj->descent) / 2; break; case VL_CENTER: y = (state->maxascent + state->maxdescent) / 2; y += (obj->ascent - obj->descent) / 2; break; case VL_TOP: y = obj->ascent; break; case VL_BOTTOM: y = state->maxascent + state->maxdescent; y -= obj->descent; break; } x += xpos; y += ypos; #endif switch (obj->type) { #ifdef MNG case O_ANIM: obj_draw_anim(state, x, y, obj); break; #endif /* MNG */ case O_IMAGE: obj_draw_image(target, x, y, obj, state->page); break; #ifdef USE_XFT2 case O_XTFONT: y += obj->y; set_xrender_color(obj->fore, state->opaque); xft_font = xft_setfont(obj->data.xftfont.fontname, obj->data.xftfont.size, obj->data.xftfont.registry); XftDraw *dummy = xft_getdraw(target); if (obj->data.xftfont.charset16){ XftDrawStringUtf8(dummy, &xft_forecolor, xft_font, x, y - lineoff, obj->data.xftfont.data, obj->data.xftfont.len); } else XftDrawString8(dummy, &xft_forecolor, xft_font, x, y - lineoff, obj->data.xftfont.data, obj->data.xftfont.len); XftDrawDestroy(dummy); break; #endif #ifdef USE_M17N case O_M17NTEXT: y += obj->y; M17N_draw_object(obj, target, x, y); break; #endif case O_XFONT: y += obj->y; code = obj->data.xfont.code; registry = obj->data.xfont.registry; (void)x_setfont(obj->data.xfont.xfont, obj->data.xfont.csize, registry, NULL); if (obj->fore != fore) { fore = obj->fore; XSetForeground(display, gcfore, fore); } #if 1 /* is it always okay? */ kch[0].byte1 = (code >> 8) & 0xff; kch[0].byte2 = code & 0xff; XDrawString16(display, target, gcfore, x, y - lineoff, kch, 1); #else if (registry) { kch[0].byte1 = (code >> 8) & 0xff; kch[0].byte2 = code & 0xff; XDrawString16(display, target, gcfore, x, y - lineoff, kch, 1); } else { ch[0] = code & 0xff; XDrawString(display, target, gcfore, x, y - lineoff, ch, 1); } #endif break; case O_ICON: if (obj->fore != fore) { fore = obj->fore; XSetForeground(display, gcfore, fore); } isize = obj->data.icon.isize; switch (obj->data.icon.itype) { case 1: /* this is box */ XFillRectangle(display, target, gcfore, x, y, isize, isize); break; case 2: /* this is arc */ XFillArc(display, target, gcfore, x, y, isize, isize, 0, 360 * 64); break; case 3: case 4: case 5: case 6: case 7: for (i = 0; i < obj->data.icon.npoint; i++) { obj->data.icon.xpoint[i].x += x; obj->data.icon.xpoint[i].y += y; } XFillPolygon(display, target, gcfore, obj->data.icon.xpoint, obj->data.icon.npoint, Convex, CoordModeOrigin); break; } break; default: break; } } if (fore != fore_color[caching]){ XSetForeground(display, gcfore, fore_color[caching]); } /* ASSERT(state->obj == NULL); */ /* ASSERT(state->objlast == NULL); */ } #ifdef VFLIB static u_int draw_onechar_vf(state, code, x, y, width, height) struct render_state *state; u_int code; int x, y; u_int width, height; { struct vfont *vfc; vfc = vfc_get(code, width, height, 1); draw_line_itemsize(state, vfc->ascent, vfc->descent, 0); obj_new_vfont(state, x, y, vfc, height); return vfc->charlen; } #endif /* VFLIB */ static char * x_fontname(buf, bufsiz, seed, siz, registry) char *buf; int bufsiz; char *seed; int siz; char *registry; /* already canonicalized */ { int hyphen; char *p; char tmp[BUFSIZ]; char tmp2[BUFSIZ]; char **fontlist; int count; if (!registry) registry = "iso8859-1"; if (siz < 0) strcpy(tmp2, "*"); else sprintf(tmp2, "%d", siz); hyphen = 0; for (p = seed; *p; p++) { if (*p == '-') hyphen++; } switch (hyphen) { case 0: /* for "a14", "5x8", or such an short names */ if ((fontlist = XListFonts(display, seed, 1, &count))) { XFreeFontNames(fontlist); strcpy(buf, seed); break; } sprintf(tmp, "%s-*-*", seed); sprintf(buf, FONT_FORMAT, tmp, tmp2, registry); break; case 2: sprintf(buf, FONT_FORMAT, seed, tmp2, registry); break; case XLFD_HYPHEN: /* as is */ strcpy(buf, seed); break; case 1: /* should not happen */ fprintf(stderr, "internal error: invalid seed <%s>\n", seed); exit(1); } if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "fontname: seed=<%s> siz=<%d> reg=<%s> " "result=<%s>\n", seed, siz, registry, buf); } return buf; } static int x_parsefont(xfont, pixel, truescalable) char *xfont; int *pixel; int *truescalable; { char *p; int fsize; int i; /* go toward pixel size */ p = xfont; for (i = 0; *p && i < 7; i++) { /* go toward minus sign */ while (*p && *p != '-') p++; /* skip minus sign */ if (*p) p++; } if (!*p) return -1; fsize = atoi(p); if (pixel) *pixel = fsize; /* skip pixel size */ while (*p && (isdigit(*p) || *p == '*')) p++; if (*p == '-') p++; else return -1; /* skip point size */ while (*p && (isdigit(*p) || *p == '*')) p++; if (*p == '-') p++; else return -1; if (truescalable) { if (fsize == 0 && (p[0] == '0' || p[0] == '*') && p[1] == '-') *truescalable = 1; else *truescalable = 0; } return 0; } static XFontStruct * x_setfont(xfont, csize, registry, truescalable) char *xfont; u_int csize; char *registry; int *truescalable; { static XFontStruct *xfontstruct; int i, fsize; char fontstring[BUFSIZ]; #define FONTTYPEMAX 10 /* number of used fontlist type (in cache) */ #define FONTLISTMAX 20 /* number of list for specified font type */ #define FONTALLOWMAX 105 /* % of desired font */ #define FONTALLOWMIN 90 /* % of desired font */ char **fontlist, **font; u_int error; int best, freeindex, count; int maxsize, minsize; int scalable, tscalable, tsflag; static struct { char *xlfd; char **list; int count; } fontnames[FONTTYPEMAX]; #define FONTCACHEMAX 200 /* number of used font type (in cache) */ static struct { char *xfont; u_int csize; char *registry; char *xlfd; XFontStruct *xfontstruct; } fonts[FONTCACHEMAX]; /* * Check font cache first. */ for (i = 0; i < FONTCACHEMAX; i++) { if (!fonts[i].xfontstruct) continue; if (fonts[i].csize != csize || fonts[i].registry != registry || strcmp(fonts[i].xfont, xfont) != 0) { continue; } #if 0 if (verbose) { fprintf(stderr, "font cache hit: entry %d <%s>\n", i, fonts[i].xlfd); } #endif XSetFont(display, gcfore, fonts[i].xfontstruct->fid); return fonts[i].xfontstruct; } /* * load new font. */ if (csize < 5) { xfontstruct = XLoadQueryFont(display, "nil2"); goto gotfont; } if (verbose) { fprintf(stderr, "need font <%s:%d:%s>\n", xfont, csize, registry?registry:"NULL"); } /* * Look for the best font possible. * 1. Check for a font that is smaller than the required one. * By using smaller font, we won't make the screen garbled. * 2. If 1. is impossible, look for slightly larger font than * the required one. */ fontlist = NULL; freeindex = -1; x_fontname(fontstring, sizeof(fontstring), xfont, -1, registry); if (verbose) fprintf(stderr, "fontstring <%s>\n", fontstring); for (i = 0; i < FONTTYPEMAX; i++) { if (fontnames[i].xlfd == NULL) { if (freeindex < 0) freeindex = i; continue; } if (strcmp(fontnames[i].xlfd, fontstring) == 0) { fontlist = fontnames[i].list; count = fontnames[i].count; freeindex = i; break; } } if (fontlist == NULL) { fontlist = XListFonts(display, fontstring, FONTLISTMAX, &count); if (fontlist == NULL) return NULL; if (freeindex >= 0) { if (fontnames[freeindex].xlfd) free(fontnames[freeindex].xlfd); fontnames[freeindex].xlfd = strdup(fontstring); fontnames[freeindex].list = fontlist; fontnames[freeindex].count = count; } } error = (u_int)-1; best = -1; maxsize = csize * FONTALLOWMAX / 100; /* truncate */ minsize = (csize * FONTALLOWMIN + 99) / 100; /* roundup */ if (verbose) fprintf(stderr, "checking %d to %d\n", minsize, maxsize); scalable = tscalable = -1; if (truescalable) *truescalable = 0; for (i = 0, font = fontlist; i < count; i++, font++) { if (x_parsefont(*font, &fsize, &tsflag) < 0) { #if 1 if (verbose) { fprintf(stderr, " [%d] <%s>: nosize\n", i, *font); } #endif continue; } if (fsize == 0) { if (scalable < 0) scalable = i; if (tsflag) { tscalable = i; if (truescalable) *truescalable = 1; } if (verbose) { fprintf(stderr, " [%d] <%s>: scalable (%d)\n", i, *font, tsflag); } continue; } else if (fsize > maxsize || fsize < minsize) { #if 0 if (verbose) { fprintf(stderr, " [%d] <%s>: reject\n", i, *font); } #endif continue; } if (fsize > csize) { fsize = fsize - csize + 100; /* penalty for larger font */ } else fsize = csize - fsize; if (error > fsize) { error = fsize; best = i; if (verbose) { fprintf(stderr, " [%d] <%s>: score %d best\n", i, *font, error); } } else { if (verbose) { fprintf(stderr, " [%d] <%s>: score %d\n", i, *font, error); } } } if (best >= 0) { if (verbose) { fprintf(stderr, "using best [%d] <%s>\n", best, fontlist[best]); } strlcpy(fontstring, fontlist[best], sizeof(fontstring)); } else if (scalable >= 0 || tscalable >= 0) { x_fontname(fontstring, sizeof(fontstring), xfont, csize, registry); if (verbose) { fprintf(stderr, "using %sscalable <%s>\n", tscalable >= 0 ? "true" : "", fontstring); } } xfontstruct = XLoadQueryFont(display, fontstring); if (freeindex < 0) XFreeFontNames(fontlist); /* * Fill font cache. */ for (i = 0; i < FONTCACHEMAX; i++) { if (!fonts[i].xfontstruct) break; } if (FONTTYPEMAX <= i) { /* last resort. always cache the font recently used */ i = FONTTYPEMAX - 1; XFreeFont(display, fonts[i].xfontstruct); free(fonts[i].xfont); free(fonts[i].xlfd); } #if 0 if (verbose) { fprintf(stderr, "fill font cache: entry %d <%s>\n", i, fontstring); } #endif fonts[i].csize = csize; fonts[i].registry = registry; fonts[i].xfont = strdup(xfont); fonts[i].xlfd = strdup(fontstring); fonts[i].xfontstruct = xfontstruct; gotfont: if (xfontstruct == NULL) return NULL; XSetFont(display, gcfore, xfontstruct->fid); return xfontstruct; } static u_int draw_onechar_x(state, code, x, y, size, argregistry, lastchar) struct render_state *state; u_int code; int x, y; int size; char *argregistry; int lastchar; { u_int charlen; static XFontStruct *xfontstruct; int coffset; XCharStruct *cs; char *metricsource; char *seed; char *registry; if (code >= 0xa0 && ((!argregistry || !argregistry[0]) && mgp_charset)) registry = mgp_charset; else registry = argregistry; seed = x_findseed(state, registry); xfontstruct = x_setfont(seed, char_size[caching], registry, NULL); if (xfontstruct == NULL) return 0; if (!xfontstruct->per_char) { metricsource = "max_bounds"; coffset = 0; cs = &xfontstruct->max_bounds; } else if (!xfontstruct->min_byte1 && !xfontstruct->max_byte1) { metricsource = "bytewise offset"; coffset = (code & 0xff) - xfontstruct->min_char_or_byte2; cs = &xfontstruct->per_char[coffset]; } else { metricsource = "wordwise offset"; coffset = (code & 0xff) - xfontstruct->min_char_or_byte2; coffset += (((code >> 8) & 0xff) - xfontstruct->min_byte1) * (xfontstruct->max_char_or_byte2 - xfontstruct->min_char_or_byte2); cs = &xfontstruct->per_char[coffset]; } /* * It looks that there are some Japanese X11 fonts with bogus * font metric (cs->width == 0). This is a workaround for that. * (or is there any mistake in above "coffset" computation?) * * TODO: report the X/Open group, or some other guys, about this. */ if (!cs->width) { if (verbose) { fprintf(stderr, "X11 font %s:%d:%s has bogus " "font metric for glyph 0x%04x\n" "\tcs->width=%d, source=%s, coffset=0x%04x\n", seed, char_size, registry?registry:"NULL", code, cs->width, metricsource, coffset); } cs = &xfontstruct->max_bounds; } draw_line_itemsize(state, cs->ascent, cs->descent, 0); /* usually */ charlen = cs->width; /* * for the very first char on the line, the char may goes over the * edge at the lefthand side. offset the image to the right so that * whole part of the bitmap appears on the screen. * beware the sign-ness of cs->lbearing. */ if (x + cs->lbearing < 0) { x -= cs->lbearing; charlen -= cs->lbearing; } /* * For the last char, make sure that the whole part of the bitmap * appears on the screen. */ if (lastchar && cs->width < cs->rbearing) charlen += cs->rbearing - cs->width; obj_new_xfont(state, x, y, size, code, registry); return charlen; } /* * render misc items. */ static void back_gradation(state, cg0) struct render_state *state; struct ctrl_grad *cg0; { struct ctrl_grad cg1; struct ctrl_grad *cg; int srcwidth, srcheight; int dstwidth, dstheight; int dir, numcolor; float xzoomrate, yzoomrate; int hquality, vquality; Image *myimage, *image; Pixmap mypixmap; XImageInfo *ximageinfo; byte *pic; int private = mgp_flag & FL_PRIVATE; static Cursor curs; /* okay, please wait for a while... */ if (!curs) curs = XCreateFontCursor(display, XC_watch); XDefineCursor(display, window, curs); XFlush(display); /* just for safety */ memcpy(&cg1, cg0, sizeof(struct ctrl_grad)); cg = &cg1; /* grab parameters */ dir = cg->ct_direction; numcolor = cg->ct_numcolor; hquality = b_quality[caching]; vquality = b_quality[caching]; /* * XXX zoomflag is too complex to understand. */ if (!cg->ct_zoomflag) { int t; int i; dstwidth = window_width * cg->ct_width / 100; dstheight = window_height * cg->ct_height / 100; srcwidth = dstwidth; srcheight = dstheight; /* * apply quality factor if srcwidth/height are large enough. */ #define TOOSMALLFACTOR 8 t = srcwidth; for (i = 100; hquality < i; i--) { t = srcwidth * i / 100; if (t < cg->ct_g_colors * TOOSMALLFACTOR) break; } srcwidth = t; t = srcheight; for (i = 100; vquality < i; i--) { t = srcheight * i / 100; if (t < cg->ct_g_colors * TOOSMALLFACTOR) break; } srcheight = t; #undef TOOSMALLFACTOR } else { dstwidth = window_width; dstheight = window_height; srcwidth = state->width * cg->ct_width / 100; srcheight = state->height * cg->ct_height / 100; /* * we don't apply quality factor here, since srcwidth/height * is already smaller than dstwidth/height. */ } #if 0 if (srcwidth * hquality / 100 < cg->ct_g_colors * TOOSMALLFACTOR || srcheight * vquality / 100 < cg->ct_g_colors * TOOSMALLFACTOR) { srcwidth = srcwidth * hquality / 100; srcheight = srcheight * vquality / 100; } #endif xzoomrate = 100.0 * dstwidth / srcwidth; yzoomrate = 100.0 * dstheight / srcheight; /* performace enhance hack for special case */ if (dir % 90 == 0) { float *q; int *p, *r; /* * 0 or 180: reduce width * 90 or 270: reduce height */ p = (dir % 180 == 0) ? &srcwidth : &srcheight; q = (dir % 180 == 0) ? &xzoomrate : &yzoomrate; r = (dir % 180 == 0) ? &dstwidth : &dstheight; /* rely upon use X11 background image tiling. */ *q = (float) 100.0; #ifndef DITHERED_BGRAD *p = 1; *r = 1; #else *p = 3; *r = 3; #endif } if (verbose) { fprintf(stderr, "raw: %d,%d qu: %d,%d " "dst: %d,%d src: %d,%d zoom: %0.2f,%0.2f\n", cg->ct_width, cg->ct_height, hquality, vquality, dstwidth, dstheight, srcwidth, srcheight, xzoomrate, yzoomrate); } screen = DefaultScreen(display); /* make gradation image */ pic = draw_gradation(srcwidth, srcheight, cg); myimage = make_XImage(pic, srcwidth, srcheight); if (numcolor < 64) myimage = reduce(myimage, numcolor, verbose); if (verbose) { fprintf(stderr, "background zoomrate: (%0.2f,%0.2f)\n", xzoomrate, yzoomrate); fprintf(stderr, "background zoom mode %d: " "(%d, %d)->(%d, %d)[%d]\n", cg->ct_zoomflag, srcwidth, srcheight, dstwidth, dstheight, b_quality); } if (xzoomrate != 100.0 || yzoomrate != 100.0) { image = myimage; myimage = zoom(image, xzoomrate, yzoomrate, verbose); if (!image) { fprintf(stderr, "image zoom (%0.2fx%0.2f) failed in back_gradataion\n", xzoomrate, yzoomrate); exit(1); } freeImage(image); } #ifndef COLOR_BUGFIX if (private) free_alloc_colors(&back_clr); #endif ximageinfo = imageToXImage(display, screen, visual, depth, myimage, private, 0, 1, verbose); if (!ximageinfo) { fprintf(stderr, "Cannot convert Image to XImage\n"); cleanup(-1); } regist_background_pixmap(ximageinfo, myimage); XUndefineCursor(display, window); XFlush(display); } /* !TODO: move rotation code into some library */ /* rotate image by 90 degrees (counter clockwise) */ static void rotate_image_p90(image) Image *image; { unsigned int row, column, pl = image->pixlen; unsigned int new_height = image->width, new_width = image->height, new_linelen = new_width * pl; byte *src, *tgt, *col_head; Pixel d; /* allocate buffer for new image */ byte *rot_data = lmalloc(new_linelen * new_height); /* do the rotation */ for (row = 0, src = image->data, col_head = rot_data + (new_height - 1) * new_linelen; row < image->height; row++, col_head += pl) { for (column = 0, tgt = col_head; column < image->width; column++, src += pl, tgt -= new_linelen) { d = memToVal(src, pl); valToMem(d, tgt, pl); } } /* swap to rotated image, exchange height and width and point to rotated data */ image->height = new_height; image->width = new_width; lfree(image->data); image->data = rot_data; } /* rotate image by -90 degrees (clockwise) */ static void rotate_image_m90(image) Image *image; { unsigned int row, column, pl = image->pixlen; unsigned int new_height = image->width, new_width = image->height, new_linelen = new_width * pl; byte *src, *tgt; Pixel d; /* allocate buffer for new image */ byte *rot_data = lmalloc(new_linelen * new_height); /* do the rotation */ for (row = 0, src = image->data; row < image->height; row++) { for (column = 0, tgt = rot_data + new_linelen - (row + 1) * pl; column < image->width; column++, src += pl, tgt += new_linelen) { d = memToVal(src, pl); valToMem(d, tgt, pl); } } /* swap to rotated image, exchange height and width and point to rotated data */ image->height = new_height; image->width = new_width; lfree(image->data); image->data = rot_data; return; } /* rotate image by 180 degrees */ static void rotate_image_180(image) Image *image; { unsigned int row, column, pl = image->pixlen; unsigned int new_height = image->height, new_width = image->width, new_linelen = new_width * pl; byte *src, *tgt; Pixel d; /* allocate buffer for new image */ byte *rot_data = lmalloc(new_linelen * new_height); /* do the rotation */ for (row = 0, src = image->data; row < image->height; row++) { for (column = 0, tgt = rot_data + (new_height - row) * new_linelen - pl; column < image->width; column++, src += pl, tgt -= pl) { d = memToVal(src, pl); valToMem(d, tgt, pl); } } /* swap to rotated image, exchange height and width and point to rotated data */ image->height = new_height; image->width = new_width; lfree(image->data); image->data = rot_data; return; } static void image_load(state, filename, numcolor, ximagesize, yimagesize, backflag, zoomflag, centerflag, raise, rotate, zoomonclk) struct render_state *state; char *filename; int numcolor; int ximagesize; int yimagesize; int backflag; int zoomflag; int centerflag; int raise; int rotate; int zoomonclk; { Image *image, *myimage; Pixmap mypixmap; XImageInfo *ximageinfo; u_int image_posx; int width, height, yoffset; float xzoomrate, yzoomrate; int private = mgp_flag & FL_PRIVATE; static Cursor curs; static char backfile[MAXPATHLEN]; static int backzoom, backnumcolor, backx, backy; #ifdef USE_IMLIB Imlib_Image *imimage; #endif if (!caching){ if (!curs) curs = XCreateFontCursor(display, XC_watch); XDefineCursor(display, state->target, curs); XFlush(display); } if ((myimage = loadImage(filename, verbose)) == NULL) { fprintf(stderr, "failed to load image file\n"); cleanup(-1); } switch (rotate) { case 0: /* Do nothing */ break; case -90: case 270: rotate_image_m90(myimage); break; case 90: rotate_image_p90(myimage); break; case -180: case 180: rotate_image_180(myimage); break; default: fprintf(stderr, "rotation by %d degrees not supported.\n", rotate); cleanup(-1); } width = myimage->width; height = myimage->height; if (myimage->depth == 1 && myimage->trans < 0) { XColor xc; xc.flags = DoRed | DoGreen | DoBlue; xc.pixel = fore_color[caching]; XQueryColor(display, colormap, &xc); *(myimage->rgb.red + 1) = xc.red; *(myimage->rgb.green + 1) = xc.green; *(myimage->rgb.blue + 1) = xc.blue; myimage->trans = 0; /* call obj_image_trans() later */ } if (numcolor) myimage = reduce(myimage, numcolor, verbose); #if 0 if (zoomflag == 2) { /* * auto resize according to physical and desired screen size. * allow 5% error for '-o' option. */ if (ximagesize == 0 || ximagesize == state->width) ximagesize = 100; else ximagesize = state->width * 100 / ximagesize; if (yimagesize == 0 || yimagesize == state->height) yimagesize = 100; else yimagesize = state->height * 100 / yimagesize; if (ximagesize > 95 && ximagesize < 105 && yimagesize > 95 && yimagesize < 105) ximagesize = yimagesize = 0; } if (ximagesize != 0) { if (!zoomflag) xzoomrate = state->width * ximagesize / width; else xzoomrate = ximagesize; } else xzoomrate = 100.0; if (yimagesize != 0) { if (!zoomflag) yzoomrate = state->height * yimagesize / height; else yzoomrate = yimagesize; } else yzoomrate = 100.0; #else if (!ximagesize) ximagesize = 100; if (!yimagesize) yimagesize = 100; xzoomrate = (float) ximagesize; yzoomrate = (float) yimagesize; image_zoomratio(state, &xzoomrate, &yzoomrate, zoomflag, width, height); #endif if (backflag) { if (xzoomrate != 100 || yzoomrate != 100) { image = myimage; myimage = zoom(image, xzoomrate, yzoomrate, verbose); if (!image) { fprintf(stderr, "image zoom (%dx%d) failed in image_load\n", xzoomrate, yzoomrate); exit(1); } freeImage(image); } #ifndef COLOR_BUGFIX if (private) free_alloc_colors(&back_clr); #endif ximageinfo= imageToXImage(display, screen, visual, depth, myimage, private, 0, 1, verbose); if (ximageinfo == NULL) { fprintf(stderr, "Cannot convert Image to XImage\n"); cleanup(-1); } regist_background_pixmap(ximageinfo, myimage); goto end; } #if 1 /* by h.kakugawa@computer.org */ switch(valign){ case VL_TOP: draw_line_itemsize(state, (height * raise) * yzoomrate / 10000, height * (100 + raise) * yzoomrate / 10000, 0); break; case VL_BOTTOM: draw_line_itemsize(state, height * (100 + raise) * yzoomrate / 10000, (height * raise) * yzoomrate / 10000, 0); break; case VL_CENTER: draw_line_itemsize(state, height * (100 + raise) * yzoomrate / 20000, height * (100 + raise) * yzoomrate / 20000, 0); break; } #else switch(valign){ case VL_TOP: draw_line_itemsize(state, 0, height * yzoomrate / 100, 0); break; case VL_BOTTOM: draw_line_itemsize(state, height * yzoomrate / 100, 0, 0); break; case VL_CENTER: draw_line_itemsize(state, height * yzoomrate / 200, height * yzoomrate / 200, 0); break; } #endif if (centerflag) image_posx = char_size[caching] / 2 - (width * xzoomrate / 100) / 2; else image_posx = 0; #ifdef USE_IMLIB imimage = search_imdata(filename); obj_new_image2(state, state->linewidth + image_posx, - height * yzoomrate / 100 / 2, myimage, xzoomrate, yzoomrate, imimage, zoomonclk); #else obj_new_image(state, state->linewidth + image_posx, - height * yzoomrate / 100 / 2, myimage, xzoomrate, yzoomrate); #endif state->linewidth += (width * xzoomrate / 100); end: if (!caching){ XUndefineCursor(display, state->target); XFlush(display); } } static void image_load_ps(state, filename, numcolor, ximagesize, yimagesize, backflag, zoomflag, centerflag, raise, rotate,zoomonclk) struct render_state *state; char *filename; int numcolor; int ximagesize; int yimagesize; int backflag; int zoomflag; int centerflag; int raise; int rotate; int zoomonclk; { int x1, y1, x2, y2; static Cursor curs; char fullname[MAXPATHLEN]; char *imagefile; int width, height; float xzoom, yzoom, zratio; char *p; /* wait for a while, please. */ if (!curs) curs = XCreateFontCursor(display, XC_watch); XDefineCursor(display, window, curs); XFlush(display); if (findImage(filename, fullname) < 0) { fprintf(stderr, "image file %s not found in path\n", filename); cleanup(-1); } if (ps_boundingbox(fullname, &x1, &y1, &x2, &y2) < 0) { /* error message generated in ps_boundingbox() */ cleanup(-1); } width = x2 - x1 + 1; height = y2 - y1 + 1; #if 0 if (zoomflag == 2) { /* screen relative */ if (ximagesize == 0 || ximagesize == state->width) ximagesize = 100; else ximagesize = state->width * 100 / ximagesize; if (yimagesize == 0 || yimagesize == state->height) yimagesize = 100; else yimagesize = state->height * 100 / yimagesize; if (ximagesize > 95 && ximagesize < 105 && yimagesize > 95 && yimagesize < 105) ximagesize = yimagesize = 0; } if (ximagesize != 0) { if (!zoomflag) xzoom = ((float) state->width * ximagesize) / width; else xzoom = (float) ximagesize; width = width * xzoom / 100; } else xzoom = 100.0; if (yimagesize != 0) { if (!zoomflag) yzoom = ((float) state->height * yimagesize) / height; else yzoom = yimagesize; height = height * yzoom / 100; } else yzoom = 100.0; #else xzoom = (float) ximagesize; yzoom = (float) yimagesize; image_zoomratio(state, &xzoom, &yzoom, zoomflag, width, height); width = width * xzoom / 100; height = height * yzoom / 100; #endif #ifndef USE_IMLIB imagefile = epstoimage(state, fullname, x1, y1, width, height, xzoom, yzoom); #else if (zoomonclk) zratio = (float) zoomonclk / 100.0 * window_width / width; else zratio = 1.0; imagefile = epstoimage(state, fullname, x1, y1, width * zratio, height * zratio, xzoom * zratio, yzoom * zratio); #endif if (imagefile == NULL) { fprintf(stderr, "WARN: cannot generate %s file from %s\n", gsdevice, filename); XUndefineCursor(display, window); XFlush(display); return; } if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "image_load_ps: %s: %s file = %s\n", filename, gsdevice, imagefile); } #ifndef USE_IMLIB image_load(state, imagefile, numcolor, 100, 100, backflag, Z_NORMAL | (Z_NORMAL << Z_YSHIFT), centerflag, raise, rotate, zoomonclk); #else image_load(state, imagefile, numcolor, 100.0 /zratio, 100.0/zratio, backflag, Z_NORMAL | (Z_NORMAL << Z_YSHIFT), centerflag, raise, rotate, zoomonclk); #endif /* XXX: unlink imagefile in /tmp */ if ((p = strrchr(imagefile, '/')) != NULL) p++; else p = imagefile; if (strncmp(p, ".gscache", sizeof(".gscache") - 1) != 0) unlink(imagefile); if (!backflag) image_setcolor(state); } void timebar(state) struct render_state *state; { int pos, n, p, barlen; GC pgc; if (t_start == 0 || tbar_mode == 0 || caching) return; pos = (window_width - 2) * (state->page - 1) / (maxpage - 1); p = time(NULL) - t_start; barlen = window_width - window_width * p / t_fin / 60; if (window_width / 2 < barlen) pgc = gcgreen; else if (window_width / 3 < barlen) pgc = gcyellow; else pgc = gcred; if (barlen > 0) { XClearArea(display, state->target, 0, window_height - 2, window_width, 2, 0); XFillRectangle(display, state->target, pgc, window_width - barlen, window_height - 1, barlen, 1); XFillRectangle(display, state->target, pgc, pos, window_height - 5, 2, 5); } else if (barlen < 0) { barlen = - barlen; n = p / t_fin / 60; if (n > window_height - 1) n = window_height - 1; if (n) XFillRectangle(display, state->target, gcred, 0, window_height - n, barlen, n); XClearArea(display, state->target, 0, window_height - (n + 2), window_width, n + 2, 0); XFillRectangle(display, state->target, gcred, 0, window_height - (n + 1), barlen % window_width, n + 1); XFillRectangle(display, state->target, gcred, pos, window_height - (n + 1 + 4), 2, 5); } } static void process_icon(state, cp) struct render_state *state; struct ctrl *cp; { u_int i, icon_type, icon_size, icon_x, icon_y, index; u_long tmp_color; static struct ctl_words icon_words[] = { { 1, 'x', "box", 3 }, { 2, 'x', "arc", 3 }, { 3, 'x', "delta1", 6 }, { 4, 'x', "delta2", 6 }, { 5, 'x', "delta3", 6 }, { 6, 'x', "delta4", 6 }, { 7, 'x', "dia", 3 }, { 0, 'x', NULL, 0 } }; XPoint xpoint[4]; static struct icon_point { int point_num; XPoint xpoint[4]; } icon_point[] = {{ 3, {{1, 0}, {0, 2}, {2, 2}, {0, 0}}}, { 3, {{0, 0}, {2, 0}, {1, 2}, {0, 0}}}, { 3, {{0, 0}, {0, 2}, {2, 1}, {0, 0}}}, { 3, {{2, 0}, {2, 2}, {0, 1}, {0, 0}}}, { 4, {{1, 0}, {0, 1}, {1, 2}, {2, 1}}}}; for (i = 0; icon_words[i].ctl_strlen != 0; i++) { if (!strncasecmp(cp->ctic_value, icon_words[i].ctl_string, strlen(cp->ctic_value))) { break; } } icon_type = icon_words[i].ctl_type; /* may be 0 */ icon_size = char_size[caching] * cp->ctic_size / 100; switch(icon_type){ case 0: /* this is image */ icon_x = icon_size * 100 / state->width; icon_y = icon_size * 100 / state->height; if (icon_x == 0) icon_x = 1; if (icon_y == 0) icon_y = 1; tmp_color = fore_color[caching]; fore_color[caching] = cp->ctic_color; image_load(state, cp->ctic_value, 0, icon_x, icon_y, 0, 0, 1, 0, 0, 0); fore_color[caching] = tmp_color; break; case 1: /* this is box */ obj_new_icon(state, state->linewidth + char_size[caching]/2 - icon_size/2, POSY(icon_size), icon_type, icon_size, cp->ctic_color, 0, NULL); state->linewidth += char_size[caching]; break; case 2: /* this is arc */ obj_new_icon(state, state->linewidth + char_size[caching]/2 - icon_size/2, POSY(icon_size), icon_type, icon_size, cp->ctic_color, 0, NULL); state->linewidth += char_size[caching]; break; case 3: case 4: case 5: case 6: case 7: index = icon_type - 3; icon_x = state->linewidth + (char_size[caching] - icon_size) / 2; #if 0 icon_y = POSY(icon_size); #else icon_y = 0; #endif for (i = 0; i < icon_point[index].point_num; i ++){ xpoint[i].x = icon_x + icon_point[index].xpoint[i].x * icon_size / 2; xpoint[i].y = icon_y + icon_point[index].xpoint[i].y * icon_size / 2; } obj_new_icon(state, 0, 0, icon_type, icon_size, cp->ctic_color, icon_point[index].point_num, xpoint); state->linewidth += char_size[caching]; break; default: break; } cp = NULL; state->brankline = 0; } static void draw_bar(state, cp) struct render_state *state; struct ctrl *cp; { u_int width, swidth, st, len; XColor col, scol; static GC gcbar, gcsbar; static u_long prevcolor = -1; if (!gcbar) { gcbar = XCreateGC(display, state->target, 0, 0); XSetFunction(display, gcbar, GXcopy); gcsbar = XCreateGC(display, state->target, 0, 0); XSetFunction(display, gcsbar, GXcopy); } col.pixel = cp->ctb_color; if (col.pixel == -1) col.pixel = fore_color[caching]; if (col.pixel != prevcolor) { prevcolor = col.pixel; col.flags = DoRed|DoGreen|DoBlue; XQueryColor(display, colormap, &col); scol.red = col.red / 2; scol.green = col.green / 2; scol.blue = col.blue / 2; if (!XAllocColor(display, colormap, &scol)) scol.pixel = col.pixel; XSetForeground(display, gcbar, col.pixel); XSetForeground(display, gcsbar, scol.pixel); } width = cp->ctb_width * state->height / 1000; swidth = width / 2; width -= swidth; st = cp->ctb_start * state->width / 100 + state->xoff; len = cp->ctb_length * state->width / 100; XFillRectangle(display, state->target, gcbar, st, state->ypos + state->yoff, len, width); XFillRectangle(display, state->target, gcsbar, st, state->ypos + state->yoff + width, len, swidth); state->ypos += width + swidth + VERT_GAP(char_size[caching]) / 2; if (state->maxascent < width + swidth) state->maxascent = width + swidth; state->brankline = 0; } static void process_system(state, cp) struct render_state *state; struct ctrl *cp; { pid_t pid; int i; char **argv; char buf[BUFSIZ]; if (state->repaint) { if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "WARN: %%system directive skipping during repaint of same page\n"); } return; /* don't relaunch on repaint */ } if (mgp_flag & FL_NOFORK) { if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "WARN: %%system "); for (i = 0; i < cp->cta_argc; i++) { fprintf(stderr, "%c%s", (i == 0) ? '"' : ' ', cp->cta_argv[i]); } fprintf(stderr, "\": directive skipped\n"); } return; } if (checkchild(cp) != (pid_t)-1) return; /*already running*/ /* * edit argument. * if we have X11 geometry string */ argv = (char **)cp->cta_argv; for (i = 0; i < cp->cta_argc; i++) { if (*(argv[i]) == '%') break; } if (i < cp->cta_argc) { char *p; char *q; int myxpos, myypos; int rootxsiz, rootysiz; int xsiz, ysiz; int xloc, yloc; int mode; { XWindowAttributes wa; Window junkwin; int junk; XGetWindowAttributes(display, window, &wa); XTranslateCoordinates(display, window, wa.root, -wa.border_width, -wa.border_width, &myxpos, &myypos, &junkwin); XGetGeometry(display, wa.root, &junkwin, &junk, &junk, &rootxsiz, &rootysiz, &junk, &junk); } argv = (char **)malloc((cp->cta_argc + 1) * sizeof(char *)); memcpy(argv, cp->cta_argv, (cp->cta_argc + 1) * sizeof(char *)); p = argv[i]; p++; /*drop percent char*/ q = buf; *q = '\0'; mode = XParseGeometry(p, &xloc, &yloc, &xsiz, &ysiz); if (mode == 0) goto fail; if ((mode & WidthValue) && (mode & HeightValue)) { sprintf(q, "%dx%d", xsiz * state->width / 100, ysiz * state->height / 100); q += strlen(q); } if ((mode & XValue) && (mode & YValue)) { xloc = xloc * state->width / 100; yloc = yloc * state->height / 100; if (mode & XNegative) xloc = rootxsiz - myxpos + state->width - xloc; else xloc += myxpos; if (mode & YNegative) yloc = rootysiz - myypos + state->height - yloc; else yloc += myypos; sprintf(q, "+%d+%d", xloc + state->xoff, yloc + state->yoff); } if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "relative geometry: " "%s (presentation %dx%d+%d+%d)\n", argv[i], state->width, state->height, myxpos, myypos); fprintf(stderr, "\t-> %s\n", buf); } argv[i] = buf; if (0) { fail: if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "relative geometry: %s failed\n", argv[i]); } } } pid = fork(); if (pid < 0) { perror("fork"); cleanup(-1); } else if (pid == 0) { execvp(argv[0], argv); perror(argv[0]); _exit(1); } if (!cp->cta_flag) /*will be purged at the end of page*/ regchild(pid, cp, -1, state->page); else regchild(pid, cp, -1, cp->cta_flag); } static void process_xsystem(state, cp) struct render_state *state; struct ctrl *cp; { pid_t pid; int i, dumint; int xloc, yloc; int xsiz, ysiz; char **argv; char buf[BUFSIZ]; Window window_id, dumwin; if (state->repaint) { if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "WARN: %%system directive skipping during repaint of same page\n"); } return; /* don't relaunch on repaint */ } if (mgp_flag & FL_NOFORK) { if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "WARN: %%system "); for (i = 0; i < cp->cta_argc; i++) { fprintf(stderr, "%c%s", (i == 0) ? '"' : ' ', cp->cta_argv[i]); } fprintf(stderr, "\": directive skipped\n"); } return; } /* * edit argument. * if we have X11 geometry string */ argv = (char **)cp->cta_argv; for (i = 0; i < cp->cta_argc; i++) { if (!strncmp(argv[i], "-geom", 5)) break; } i ++; if (i < cp->cta_argc) { char *p; char *q; int mode; argv = (char **)malloc((cp->cta_argc + 1) * sizeof(char *)); /* XXX seems to be never freed */ memcpy(argv, cp->cta_argv, (cp->cta_argc + 1) * sizeof(char *)); p = argv[i]; if (*p == '%') p++; /*drop percent char*/ q = buf; *q = '\0'; mode = XParseGeometry(p, &xloc, &yloc, &xsiz, &ysiz); if (mode == 0) goto fail; if ((mode & WidthValue) && (mode & HeightValue)) { xsiz = xsiz * state->width / 100; ysiz = ysiz * state->height / 100; sprintf(q, "%dx%d", xsiz, ysiz); q += strlen(q); } /* make window raise outside of display */ sprintf(q, "+%d+%d", DisplayWidth(display, DefaultScreen(display)), DisplayHeight(display, DefaultScreen(display))); if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "relative geometry: " "%s (presentation %dx%d+%d+%d)\n", argv[i], state->width, state->height, xloc, yloc); fprintf(stderr, "\t-> %s\n", buf); } argv[i] = buf; if (0) { fail: if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "relative geometry: %s failed\n", argv[i]); } } } else { char geom_arg1[] = {"-geometry"}; char geom_arg2[512]; sprintf(geom_arg2, "+%d+%d", DisplayWidth(display, DefaultScreen(display)), DisplayHeight(display, DefaultScreen(display))); argv[cp->cta_argc] = geom_arg1; argv[cp->cta_argc+1] = geom_arg2; /* ** XXX argv is now not generally NULL-terminated ** the maximal allowed size of argv is ganatied to be ** argc+2 so no NULL can appended */ } if ((window_id = checkchildwin(cp)) != (Window)-1) goto finish; /*already running*/ if (checkchild(cp) != (pid_t)-1) return; /*already running*/ pid = fork(); if (pid < 0) { perror("fork"); cleanup(-1); } else if (pid == 0){ usleep(EXEC_DELAY); execvp(argv[0], argv); perror(argv[0]); _exit(1); } window_id = search_child_window(); if (!cp->cta_flag) /*will be purged at the end of page*/ regchild(pid, cp, window_id, state->page); else regchild(pid, cp, window_id, cp->cta_flag); if (window_id != -1) reparent_child_window(window_id, window_width, window_height); else { if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "WARN: %%xsystem cannot find child window:"); for (i = 0; i < cp->cta_argc; i++) { fprintf(stderr, "%c%s", (i == 0) ? '"' : ' ', cp->cta_argv[i]); } fprintf(stderr, "\"\n"); } return; } finish: XGetGeometry(display, window_id, &dumwin, &xloc, &yloc, &xsiz, &ysiz, &dumint, &dumint); state->linewidth = xsiz; xloc = set_position(state) + state->xoff + (state->tabxprefix ? state->tabxprefix : state->xprefix); yloc = state->ypos + state->yoff; XMoveWindow(display, window_id, xloc, yloc); state->ypos += ysiz; #if 0 /* not implemented yet */ state->linewidth += xsiz; state->maxascent += ysiz; #endif } /* * tsystem does mostly the same like xsystem, but identifies the created * window by its name * * this hack is done because at some windowmanagers occures additional * xreparentevents, which cause xsystem to fail * * it is possible, that the title of some applications is reseted, than * tsystem will fail */ static void process_tsystem(state, cp) struct render_state *state; struct ctrl *cp; { pid_t pid; int i, dumint, argc; int xloc, yloc; int xsiz, ysiz; char **argv; char buf[BUFSIZ]; char title_arg1[] = "-title"; char title_arg2[BUFSIZ]; static unsigned int magicCnt=0; Window window_id, dumwin; if (mgp_flag & FL_NOFORK) { if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "WARN: %%system "); for (i = 0; i < cp->cta_argc; i++) { fprintf(stderr, "%c%s", (i == 0) ? '"' : ' ', cp->cta_argv[i]); } fprintf(stderr, "\": directive skipped\n"); } return; } /* * edit argument. * allways copy the argument vector, for adding -title magictitle * it's assumed, that there is not -title in the argument vector */ argc=cp->cta_argc; argv = (char **)malloc((argc + 5) * sizeof(char *)); /* +5 for NULL, title and potentally geometry */ memcpy(argv, cp->cta_argv, (argc + 1) * sizeof(char *)); /* * search for X11 geometry string */ for (i = 0; i < argc; i++) { if (!strncmp(argv[i], "-geom", 5)) break; } i ++; if (i < argc) { /* * we have X11 geometry string */ char *p; char *q; int mode; p = argv[i]; if (*p == '%') p++; /*drop percent char*/ q = buf; *q = '\0'; mode = XParseGeometry(p, &xloc, &yloc, &xsiz, &ysiz); if (mode == 0) goto fail; if ((mode & WidthValue) && (mode & HeightValue)) { xsiz = xsiz * state->width / 100; ysiz = ysiz * state->height / 100; sprintf(q, "%dx%d", xsiz, ysiz); q += strlen(q); } /* make window raise outside of display */ /* XXX potentially overflow, but BUFSIZ should be alway large enough*/ sprintf(q, "+%d+%d", DisplayWidth(display, DefaultScreen(display)), DisplayHeight(display, DefaultScreen(display))); if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "relative geometry: " "%s (presentation %dx%d+%d+%d)\n", argv[i], state->width, state->height, xloc, yloc); fprintf(stderr, "\t-> %s\n", buf); } argv[i] = buf; if (0) { fail: if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "relative geometry: %s failed\n", argv[i]); } } } else { /* * we do not have X11 geometry string */ char geom_arg1[] = "-geometry"; char geom_arg2[512]; sprintf(geom_arg2, "+%d+%d", DisplayWidth(display, DefaultScreen(display)), DisplayHeight(display, DefaultScreen(display))); argv[argc] = geom_arg1; argv[argc+1] = geom_arg2; argc += 2; } /* * adding magic title and incrementing magicCnt * guaranteeing the NULL-termination of argv */ snprintf(title_arg2, BUFSIZ, "magictitle %u", magicCnt++); argv[argc] = title_arg1; argv[argc+1] = title_arg2; argv[argc+2] = NULL; argc += 2; /* seems not to be nessesary */ if ((window_id = checkchildwin(cp)) != (Window)-1) goto finish; /*already running*/ if (checkchild(cp) != (pid_t)-1) { free(argv); return; /*already running*/ } /* * using vfork() to first run the child */ pid = vfork(); if (pid < 0) { perror("fork"); cleanup(-1); } else if (pid == 0){ execvp(argv[0], argv); perror(argv[0]); _exit(1); } window_id = tsearch_child_window(title_arg2); if (!cp->cta_flag) /*will be purged at the end of page*/ regchild(pid, cp, window_id, state->page); else regchild(pid, cp, window_id, cp->cta_flag); if (0 == window_id) { if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "WARN: %%tsystem can not find child window:"); for (i = 0; i < cp->cta_argc; i++) { fprintf(stderr, "%c%s", (i == 0) ? '"' : ' ', cp->cta_argv[i]); } fprintf(stderr, "\"\n"); } return; } finish: { Window root, par, *child; int newxloc, newyloc; unsigned int nchild; XGetGeometry(display, window_id, &dumwin, &xloc, &yloc, &xsiz, &ysiz, &dumint, &dumint); XQueryTree(display, window_id, &root, &par, &child, &nchild); if(child) XFree(child); state->linewidth = xsiz; newxloc = set_position(state) + state->xoff + (state->tabxprefix ? state->tabxprefix : state->xprefix); newyloc = state->ypos + state->yoff; while((par!=window) || (xloc != newxloc)) { /* * this hack should correct not moved windows * if found, that XMoveWindow, XReparentWindow returns success, * but the window is sometimes not moved etc in ion */ XReparentWindow(display, window_id, window, newxloc, newyloc); XGetGeometry(display, window_id, &dumwin, &xloc, &yloc, &xsiz, &ysiz, &dumint, &dumint); XQueryTree(display, window_id, &root, &par, &child, &nchild); if(child) XFree(child); } } state->ypos += ysiz; free(argv); #if 0 /* not implemented yet */ state->linewidth += xsiz; state->maxascent += ysiz; #endif } Window search_child_window() { XEvent e; int fd, found = 0; fd_set fdset, dumfdset; struct timeval timeout; fd = ConnectionNumber(display); /* waiting for 2 second */ timeout.tv_sec = 2; timeout.tv_usec = 0; /* get all client's ReparentNotify event */ XSelectInput(display, DefaultRootWindow(display), SubstructureNotifyMask); while (!found) { while (XEventsQueued(display, QueuedAfterFlush) > 0) { XNextEvent(display, &e); if (e.type == ReparentNotify){ found = 1; break; } } if (found) break; FD_ZERO(&fdset); FD_SET(fd, &fdset); FD_ZERO(&dumfdset); if (!select(fd+1, &fdset, &dumfdset, &dumfdset, &timeout)) break; } XSelectInput(display, DefaultRootWindow(display), NoEventMask); if (found == 1) return e.xreparent.window; else return (Window)-1; } /* ** looks for a window with the specified name ** return (Window)0 if not found */ Window tsearch_child_window(const char *name) { /* 100 ms between two searches for the specified window */ #define WAITTIME 100000 /* maximal wait time = 1 minute */ #define WAITCYCLES 60000000 / WAITTIME int maxWait=WAITCYCLES; Window w=0; while(maxWait--) { if((w = getNamedWindow(name, DefaultRootWindow(display)))) break; usleep(WAITTIME); } return w; #undef WAITCYCLES #undef WAITTIME } Window getNamedWindow(const char *name, Window top) { Window w=0; Window *child; Window dum; unsigned int nchild,i; char *w_name; if(XFetchName(display, top, &w_name) && (!strcmp(w_name, name))) return top; if(!XQueryTree(display, top, &dum, &dum, &child, &nchild)) return (Window)0; for(i=0; i 0) { if (verbose) { fprintf(stderr, "gs cache valid, " "using it \n"); } return imagefile; } } if (verbose) { fprintf(stderr, "gs cache looks older than source, " "generate again\n"); } } else { if (verbose) { fprintf(stderr, "gs cache not found, convert eps\n"); } } if (verbose) fprintf(stderr, "converting eps file...\n"); /* convert eps file into readable form. */ sprintf(device, "-sDEVICE=%s", gsdevice); /* * a suffix of +scale in the device tipe means produce a larger * image that can be scaled later for better antialiasing. */ if ((cp = strchr(device, '+')) != NULL) { *cp++ = '\0'; scale = atoi(cp); if (scale <= 0) scale = 2; xzoom *= scale; yzoom *= scale; width *= scale; height *= scale; } if (width == 0 || height == 0) { fprintf(stderr, "WARN: epstoimage: scale=%d, xzoom=%d, " "yzoom=%d, width=%d, height=%d\n", scale, xzoom, yzoom, width, height); return NULL; } if (scale != 1) sprintf(scalebuf, "%f", 1. / (double)scale); sprintf(geom, "-g%dx%d", width, height); /* generate cache file. */ fd = open(imagefile, O_RDWR|O_CREAT|O_TRUNC, 0600); if (fd < 0) { /* last resort: generate output onto /tmp. */ if ((cp = getenv("TMPDIR")) == NULL) cp = "/tmp"; if (verbose) { fprintf(stderr, "could not write to \"%s\", using " "%s\n", imagefile, cp); } strcpy(imagefile, cp); strcat(imagefile, "/mgp.XXXXXXXX"); if ((fd = mkstemp(imagefile)) < 0) { perror(imagefile); return NULL; } } if (scale != 1) { if (pipe(pfd[2]) < 0) { perror("pipe"); goto error; } if ((pid = vfork()) == 0) { close(pfd[2][1]); dup2(pfd[2][0], 0); close(pfd[2][0]); dup2(fd, 1); close(fd); if (verbose) fprintf(stderr, "epstoimage: \"pnmdepth 256\"\n"); close(2); /* XXX suppress message */ execlp("pnmdepth", "pnmdepth", "255", NULL); perror("pnmdepth"); _exit(1); } if (pid < 0) { perror("vfork"); goto error; } close(pfd[2][0]); pfd[2][0] = -1; close(fd); fd = -1; if (pipe(pfd[1]) < 0) { perror("pipe"); goto error; } if ((gspid = vfork()) == 0) { close(pfd[1][1]); dup2(pfd[1][0], 0); close(pfd[1][0]); dup2(pfd[2][1], 1); close(pfd[2][1]); if (verbose) fprintf(stderr, "epstoimage: \"pnmscale %s\"\n", scalebuf); close(2); /* XXX suppress message */ execlp("pnmscale", "pnmscale", scalebuf, NULL); perror("pnmscale"); _exit(1); } if (gspid < 0) { perror("vfork"); goto error; } close(pfd[2][1]); pfd[2][1] = -1; close(pfd[1][0]); pfd[1][0] = -1; fd = pfd[1][1]; pfd[1][1] = -1; } if (pipe(pfd[0]) < 0) { perror("pipe"); goto error; } if ((gspid = vfork()) == 0) { close(pfd[0][1]); dup2(pfd[0][0], 0); close(pfd[0][0]); dup2(fd, 1); close(fd); if (verbose) fprintf(stderr, "epstoimage: \"gs %s %s -sOutputFile=- -q -\"\n", geom, device); execlp("gs", "gs", geom, device, "-sOutputFile=-", "-q", "-", NULL); perror("gs"); _exit(1); } close(fd); fd = -1; close(pfd[0][0]); pfd[0][0] = -1; if ((fp = fdopen(pfd[0][1], "w")) == NULL) { fprintf(stderr, "fdopen failed\n"); goto error; } sigpipe_handler = signal(SIGPIPE, SIG_IGN); /* XXX: avoid SIGPIPE */ pfd[0][1] = -1; fprintf(fp, "%f %f scale\n", (double)xzoom/100., (double)yzoom/100.); fprintf(fp, "%d %d translate\n", -1 * x, -1 * y); fprintf(fp, "(%s) run\n", epsfile); fprintf(fp, "showpage\n"); fprintf(fp, "quit\n"); fflush(fp); fclose(fp); signal(SIGPIPE, sigpipe_handler); if (!pid) pid = gspid; while (waitpid(pid, &status, 0) < 0) { if (errno != EINTR) break; } if (stat(imagefile, &stbuf) == 0 && stbuf.st_size > 0) return imagefile; error: if (fd >= 0) close(fd); for (i = 0; i < 3; i++) { for (j = 0; j < 2; j++) if (pfd[i][j] >= 0) close(pfd[i][j]); } if (imagefile[0]) unlink(imagefile); return NULL; } static void image_setcolor(state) struct render_state *state; { struct render_object *obj; Image *image; int i; Intensity *red, *green, *blue; XColor fore, back; obj = state->objlast; if (obj->type != O_IMAGE) return; image = obj->data.image.image; if (image->trans >= 0) return; switch (image->type) { case IBITMAP: /* * XXX: Actually, no one comes here. * This translation for IBITMAP was done by image_load(). */ fore.pixel = fore_color[caching]; fore.flags = DoRed | DoGreen | DoBlue; XQueryColor(display, colormap, &fore); image->rgb.red [1] = fore.red; image->rgb.green[1] = fore.green; image->rgb.blue [1] = fore.blue; image->trans = 0; break; case IRGB: red = image->rgb.red; green = image->rgb.green; blue = image->rgb.blue; for (i = 0; i < image->rgb.used; i++) { if (red[i] != green[i] || red[i] != blue[i]) return; } /* grayscale */ fore.pixel = fore_color[caching]; fore.flags = DoRed | DoGreen | DoBlue; XQueryColor(display, colormap, &fore); if (!COMPLEX_BGIMAGE) { back.pixel = back_color[caching]; back.flags = DoRed | DoGreen | DoBlue; XQueryColor(display, colormap, &back); } else { int x, y, bpl; byte *p; Pixel d; /* XXX: use background color of center position */ x = (obj->x + image->width/2) % bgpixmap[bgindex].image->width; y = (state->ypos + image->height/2) % bgpixmap[bgindex].image->height; bpl = bgpixmap[bgindex].image->pixlen; p = bgpixmap[bgindex].image->data + (bgpixmap[bgindex].image->width * y + x) * bpl; d = memToVal(p, bpl); if (bgpixmap[bgindex].image->type == ITRUE) { back.red = TRUE_RED(d) << 8; back.green = TRUE_GREEN(d) << 8; back.blue = TRUE_BLUE(d) << 8; } else { back.red = bgpixmap[bgindex].image->rgb.red [d]; back.green = bgpixmap[bgindex].image->rgb.green[d]; back.blue = bgpixmap[bgindex].image->rgb.blue [d]; } } for (i = 0; i < image->rgb.used; i++) { if (red[i] >= 65000) /*XXX*/ image->trans = i; red[i] = (back.red * red [i] + fore.red * (65535-red [i])) / 65535; green[i] = (back.green * green[i] + fore.green * (65535-green[i])) / 65535; blue[i] = (back.blue * blue [i] + fore.blue * (65535-blue [i])) / 65535; } break; case ITRUE: /* XXX: assume background color is on the left right corner */ image->trans = memToVal(image->data, image->pixlen); } } #ifdef FREETYPE static u_int draw_onechar_tf(state, code, x, y, size, registry, lastchar, charset16) struct render_state *state; u_int code; int x, y; u_int size; char *registry; int lastchar; int charset16; { struct tfont *tfc; int charlen; tfc = tfc_get(code, size, 1, registry, charset16); draw_line_itemsize(state, tfc->ascent, tfc->descent, 0); /* usually */ charlen = tfc->charlen; /* * for the very first char on the line, the char may goes over the * edge at the lefthand side. offset the image to the right so that * whole part of the bitmap appears on the screen. * beware the sign-ness of tfc->xoff. */ if (x + tfc->xoff < 0) { x -= tfc->xoff; charlen -= tfc->xoff; } /* * For the last char, make sure that the whole part of the bitmap * appears on the screen. */ if (lastchar && tfc->charlen < tfc->xoff + tfc->width) charlen += tfc->xoff + tfc->width - tfc->charlen; /* * (x, y): left side, baseline of the font (FreeType font origin) */ obj_new_tfont(state, x, y, tfc); return charlen; } #endif /* FREETYPE */ static void x_registerseed(state, seed, registry) struct render_state *state; char *seed; char *registry; { char tmp1[BUFSIZ], tmp2[BUFSIZ]; char *p; struct ctrl *cp; int hyphen; /* if both of arguments are NULL, initialize */ if (!seed && !registry) { if (state->xfont) ctlfree(state->xfont); state->xfont = NULL; return; } if (!registry) registry = "iso8859-1"; /* canonicalize seed */ hyphen = 0; for (p = seed; *p; p++) { if (*p == '-') hyphen++; if (*p == ':') { hyphen = 0; break; } } switch (hyphen) { case 0: /* maybe alias, don't canonicalize */ break; case 1: sprintf(tmp1, "%s-*", seed); seed = tmp1; break; case 2: case XLFD_HYPHEN: /* as is */ break; default: fprintf(stderr, "invalid XFONT seed <%s>\n", seed); break; } /* canonicalize registry */ if (!registry) registry = "iso8859-1"; hyphen = 0; for (p = registry; *p; p++) { if (*p == '-') hyphen++; } switch (hyphen) { case 0: sprintf(tmp2, "%s-*", registry); registry = tmp2; break; case 1: /* as is */ break; default: fprintf(stderr, "invalid XFONT registry <%s>\n", registry); exit(1); } cp = NULL; for (cp = state->xfont; cp; cp = cp->ct_next) { if (!cp->ctc2_value2) continue; if (strcmp(cp->ctc2_value2, registry) == 0) break; } if (cp) { if (!strcmp(cp->ctc2_value1, seed)) return; free(cp->ctc2_value1); cp->ctc2_value1 = strdup(seed); } else { cp = ctlalloc1(CTL_XFONT2); cp->ctc2_value1 = strdup(seed); cp->ctc2_value2 = strdup(registry); cp->ct_next = state->xfont; state->xfont = cp; } } static char * x_findseed(state, registry) struct render_state *state; char *registry; { struct ctrl *cp; if (!registry) registry = "iso8859-1"; for (cp = state->xfont; cp; cp = cp->ct_next) { if (strcmp(cp->ctc2_value2, registry) == 0) { return cp->ctc2_value1; } } return "*-*-*"; /*anything, canonicalized*/ } /* cache specified page */ static void cache_page(state, page) struct render_state *state; int page; { struct ctrl *tmp_bg_ctl; int tmp_bgindex; /* we don't need caching */ if (cached_page == page || page > maxpage || page <= 0) return; if (!page_attribute[page].pg_linenum) return; XFlush(display); memset(state, 0, sizeof(struct render_state)); state->target = cachewin; /*XXX*/ state->width = window_width; state->height = window_height; state->page = page; caching = 1; tmp_bg_ctl = bg_ctl; tmp_bgindex = bgindex; if (verbose){ printf("now caching %d page ...\n", page); fflush(stdout); } draw_page(state, NULL); if (verbose){ printf("caching done \n"); } caching = 0; cached_page = page; bg_ctl = tmp_bg_ctl; bgindex = tmp_bgindex; } static void set_from_cache(state) struct render_state *state; { int i; char_size[0] = char_size[1]; horiz_gap[0] = horiz_gap[1]; vert_gap[0] = vert_gap[1]; fore_color[0] = fore_color[1]; back_color[0] = back_color[1]; ctrl_color[0] = ctrl_color[1]; b_quality[0] = b_quality[1]; memcpy(state, &cache_state, sizeof(struct render_state)); state->target = window; XSetForeground(display, gcfore, fore_color[0]); XSetBackground(display, gcfore, back_color[0]); bg_ctl = bg_ctl_last = bg_ctl_cache; if (bg_ctl){ for (i = 0; i < MAXBGPIXMAP; i ++){ if (bgpixmap[i].ctl && ctlcmp(bg_ctl, bgpixmap[i].ctl) == 0) bgindex = i; } set_background_pixmap(bg_ctl); } switch(cache_effect){ case 1: cache_effect1(); break; case 2: cache_effect2(); break; default: break; } XCopyArea(display, cachewin, window, gc_cache, 0, 0, window_width, window_height, 0, 0); XFlush(display); } void reset_background_pixmap() { int i = 0; bg_ctl_last = NULL; bg_ctl_cache = NULL; for (i = 0; i < MAXBGPIXMAP; i ++) { if (bgpixmap[i].image){ XFreePixmap(display, bgpixmap[i].pixmap); freeXImage(bgpixmap[i].image, bgpixmap[i].ximageinfo); freeImage(bgpixmap[i].image); } bgpixmap[i].ctl = NULL; bgpixmap[i].image = NULL; bgpixmap[i].ximageinfo = NULL; } } static void cache_effect1() { int x, step; step = cache_value ? window_width / cache_value : 1; if (!step) step = 1; for (x = window_width; x > step; x -= step){ XCopyArea(display, window, window, gc_cache, step, 0, window_width - step, window_height, 0, 0); XCopyArea(display, cachewin, window, gc_cache, window_width - x, 0, step, window_height, window_width - step, 0); #if 1 XSync(display, False); #else XFlush(display); #endif #if 1/*ONOE*/ { XEvent e; if (XCheckMaskEvent(display, ~NoEventMask, &e) == True) { printf("event type=%d\n", e.type); XPutBackEvent(display, &e); break; } } #endif } } static void cache_effect2() { int x, step; step = cache_value ? window_width / (cache_value * 2) : 1; if (!step) step = 1; for (x = 0; x < window_width; x += step){ XCopyArea(display, window, window, gc_cache, x, 0, window_width - step -x , window_height, x + step, 0); XCopyArea(display, cachewin, window, gc_cache, x, 0, step, window_height, x, 0); XFlush(display); } } /* pcache directive process */ static void pcache_process(page) int page; { if (!pcache.flag) return; if (pcache.page != page) return; if (pcache.mgpflag) mgp_flag |= FL_FRDCACHE; else mgp_flag ^= FL_FRDCACHE; cache_mode = pcache.mode; cache_effect = pcache.effect; cache_value = pcache.value; pcache.flag = 0; } /* predraw: if this page contains texts only, draw page in pixmap once, then copy to window. */ static void predraw(state) struct render_state *state; { if (!caching && cached_page != state->page && page_attribute[state->page].pg_text && page_attribute[state->page].pg_linenum){ cache_page(&cache_state, state->page); set_from_cache(state); pcache_process(state->page); } } static void get_background_pixmap(ctl, state) struct ctrl *ctl; struct render_state *state; { int i; /* * check if background is already cached */ for (i = 0; i < MAXBGPIXMAP; i ++){ if (bgpixmap[i].ctl && ctlcmp(ctl, bgpixmap[i].ctl) == 0){ bgindex = i; return; } } if (i == MAXBGPIXMAP){ /* this background is not cached, we have to generate one */ switch(ctl->ct_op){ case CTL_BIMAGE: image_load(state, ctl->ctm_fname, ctl->ctm_numcolor, ctl->ctm_ximagesize, ctl->ctm_yimagesize, 1, ctl->ctm_zoomflag, 0, 0, ctl->ctm_rotate, 0); break; case CTL_BGRAD: back_gradation(state, &ctl->ct_val.ctrl_grad); break; case CTL_BACK: break; default: fprintf(stderr, "fatal error in get_background_pixmap()\n"); cleanup(-1); break; } } } static void regist_background_pixmap(ximageinfo, image) XImageInfo *ximageinfo; Image *image; { Pixmap pixmap; int i, j; /* search empty slot */ for (i = 0; i < MAXBGPIXMAP; i ++){ if (bgpixmap[i].ctl == NULL) break; } if (i == MAXBGPIXMAP){ /* no empty slot, we need to make one */ XFreePixmap(display, bgpixmap[MAXBGPIXMAP -1].pixmap); freeXImage(bgpixmap[MAXBGPIXMAP -1].image, bgpixmap[MAXBGPIXMAP -1].ximageinfo); freeImage(bgpixmap[MAXBGPIXMAP -1].image); for (j = MAXBGPIXMAP -2; j >= 0; j --){ bgpixmap[j +1].ctl = bgpixmap[j].ctl; bgpixmap[j +1].pixmap = bgpixmap[j].pixmap; bgpixmap[j +1].image = bgpixmap[j].image; bgpixmap[j +1].ximageinfo = bgpixmap[j].ximageinfo; } bg_ctl_last = NULL; i = 0; } pixmap = ximageToPixmap(display, RootWindow(display, screen), ximageinfo); bgpixmap[i].ctl = bg_ctl; bgpixmap[i].pixmap = pixmap; bgpixmap[i].image = image; bgpixmap[i].ximageinfo = ximageinfo; bgindex = i; } static void set_background_pixmap(ctl) struct ctrl *ctl; { int i; switch(ctl->ct_op){ case CTL_BIMAGE: case CTL_BGRAD: for (i = 0; i < MAXBGPIXMAP; i ++){ if (bgpixmap[i].ctl && ctlcmp(ctl, bgpixmap[i].ctl) == 0) break; } if (i == MAXBGPIXMAP){ fprintf(stderr, "fatal error in set_background_pixmap()\n"); cleanup(-1); } XSetWindowBackgroundPixmap(display, window, bgpixmap[i].pixmap); break; case CTL_BACK: XSetWindowBackground(display, window, ctl->ctl_value); break; default: fprintf(stderr, "fatal error in set_background_pixmap() op=%d\n", ctl->ct_op); cleanup(-1); break; } } /* * Clear target pixmap */ static void XClearPixmap(display, target) Display *display; Drawable target; { int i; int x, y, width, height; XImage *xim; switch(bg_ctl->ct_op){ case CTL_BIMAGE: case CTL_BGRAD: for (i = 0; i < MAXBGPIXMAP; i ++){ if (bgpixmap[i].ctl && ctlcmp(bg_ctl, bgpixmap[i].ctl) == 0) break; } if (i == MAXBGPIXMAP){ fprintf(stderr, "fatal error in XClearPixmap()\n"); cleanup(-1); } xim = bgpixmap[i].ximageinfo->ximage; for (y = 0; y < window_height; y += xim->height) for (x = 0; x < window_width; x += xim->width) XPutImage(display, target, gc_cache, xim, 0, 0, x, y, xim->width, xim->height); break; case CTL_BACK: XSetForeground(display, gc_cache, bg_ctl->ctl_value); XFillRectangle(display, target, gc_cache, 0, 0, window_width, window_height); break; default: fprintf(stderr, "fatal error in XClearPixmap()\n"); cleanup(-1); break; } } int get_regid(registry) char *registry; { char *p; if (!registry || registry[0] == '\0') return 0; if (strlen(registry) == 9 && !strncmp("iso8859-", registry, 8) && registry[8] >= '1' && registry[8] <= '4') { p = registry + 8; return atoi(p) -1; } else return -1; } #ifdef MNG int obj_new_anim(state, x, y, width, height, filename, key) struct render_state *state; int x, y; int width, height; char *filename; void *key; { struct render_object *obj; obj = obj_alloc(state); if (obj == NULL) return 0; obj->x = x; obj->y = y; obj->type = O_ANIM; obj->data.anim.width = width; obj->data.anim.height = height; obj->data.anim.filename = strdup(filename); obj->data.anim.key = key; /* for regchild */ obj->ascent = 0; /*XXX*/ obj->descent = height; /*XXX*/ obj->vertloc = VL_CENTER; return 1; } static void obj_draw_anim(state, x, y, obj) struct render_state *state; u_int x, y; struct render_object *obj; { pid_t pid; if (!(pid = fork())){ mngload(obj->data.anim.filename, x, y, obj->data.anim.width, obj->data.anim.height); while(1) sleep(1); } regchild(pid, obj->data.anim.key, -1, state->page); } static void process_anim(state, cp) struct render_state *state; struct ctrl *cp; { int width, height; width = 200; height = 100; /* * we support only mng so far */ mngpreload(state, cp->ctc_value, &width, &height); obj_new_anim(state, state->linewidth, - height, width, height, cp->ctc_value, cp); switch(valign){ case VL_TOP: draw_line_itemsize(state, 0, height, 0); break; case VL_BOTTOM: draw_line_itemsize(state, height, 0, 0); break; case VL_CENTER: draw_line_itemsize(state, height /2 , height /2, 0); break; } state->linewidth += width; state->brankline = 0; } #endif #ifdef USE_XFT2 void set_xrender_color(value, opaque) long value; int opaque; { XColor xc; XRenderColor render_color; xft_forecolor.color.alpha = 65535 * opaque / 100; if (value == xft_forecolor.pixel) return; xc.flags = DoRed | DoGreen | DoBlue; xc.pixel = value; XQueryColor(display, colormap, &xc); xft_forecolor.pixel = value; xft_forecolor.color.red = xc.red; xft_forecolor.color.green = xc.green; xft_forecolor.color.blue = xc.blue; } static char * xft_draw_fragment(state, p, len, registry, charset16) struct render_state *state; u_char *p; u_int len; char *registry; int charset16; /*2-octet charset?*/ { XGlyphInfo extents; struct ctrl *cp; char *fontname = NULL; int i; static char etab[3][20] = { "iso-2022-jp", "gb2312", "ksc5601"}; static char rtab[3][20] = { "jisx208", "gb2312", "ksc5601"}; static char prefix[3][20] = { "\033$B", "\033$A", "\033$(C"}; char buf16[1024], *p16; char out16[1024], *o16; int ileft, oleft; #ifdef HAVE_ICONV static iconv_t icv[3]; #endif for (i = 0; i < len; i ++){ if (!isspace(*(p + i))) state->brankline = 0; /* This isn't brankline */ } if (!registry) registry = "iso8859-1"; for (cp = state->xfont; cp; cp = cp->ct_next) { if (!cp->ctc2_value2) continue; if (strcmp(cp->ctc2_value2, registry) == 0) { fontname = cp->ctc2_value1; break; } } if (!fontname) return NULL; if (!(xft_font = xft_setfont(fontname, char_size[caching], registry))) return NULL; if (charset16) { #ifdef HAVE_ICONV for (i = 0; i < 3; i ++) { if (!strncmp(registry, rtab[i], 3)) break; } if (i == 3) return NULL; /* cannot find codeset */ sprintf(buf16, "%s%s\0", prefix[i], p); if (icv[i] == (iconv_t)0) icv[i] = iconv_open("UTF-8", etab[i]); if (icv[i] == (iconv_t)-1) { fprintf(stderr, "your iconv doesn't support %s\n", etab[i]); return NULL; } p16 = buf16; o16 = out16; ileft = len + strlen(prefix[i]); oleft = sizeof(out16); if (iconv(icv[i], &p16, &ileft, &o16, &oleft) < 0) { perror("iconv"); return NULL; } /* measure drawing are */ XftTextExtentsUtf8(display, xft_font, (XftChar8 *)out16, sizeof(out16) - oleft, &extents); /* line folding check */ if (state->width - state->leftfillpos / 2 - state->linewidth < extents.xOff) { draw_line_end(state); draw_line_start(state); state->linewidth = state->leftfillpos; } draw_line_itemsize(state, xft_font->ascent, xft_font->descent, 0); if (obj_new_xftfont(state, state->linewidth, 0, out16, sizeof(out16) - oleft, fontname, registry, char_size[caching], charset16, xft_font)) { state->linewidth += extents.xOff; return p + len; } else #endif return NULL; } XftTextExtents8(display, xft_font, (XftChar8 *)p, len, &extents); /* line folding check */ if (state->width - state->leftfillpos / 2 - state->linewidth < extents.xOff) { if (isspace(*(p + len -1))) { XftTextExtents8(display, xft_font, (XftChar8 *)p, len -1, &extents); if (state->width - state->leftfillpos / 2 - state->linewidth >= extents.xOff) goto nofolding; draw_line_end(state); draw_line_start(state); state->linewidth = state->leftfillpos; return p; } for (i = 2; i < len; i ++){ XftTextExtents8(display, xft_font, (XftChar8 *)p, len -i, &extents); if (state->width - state->leftfillpos / 2 - state->linewidth >= extents.xOff){ len -= i; break; } } draw_line_itemsize(state, xft_font->ascent, xft_font->descent, 0); if (obj_new_xftfont(state, state->linewidth, state->charoff, p, len, fontname, registry, char_size[caching], charset16, xft_font)) { draw_line_end(state); draw_line_start(state); state->linewidth = state->leftfillpos; return p +len; } else return NULL; } nofolding: #if 1 draw_line_itemsize(state, xft_font->ascent, xft_font->descent, 0); #else draw_line_itemsize(state, extents.y, extents.height - extents.y, 0); #endif if (obj_new_xftfont(state, state->linewidth, state->charoff, p, len, fontname, registry, char_size[caching], charset16, xft_font)) { state->linewidth += extents.xOff; return p + len; } else return NULL; } static int obj_new_xftfont(state, x, y, p, len, fontname, registry, size, charset16, xft_font) struct render_state *state; int x, y; char *p; int len; char *fontname; char *registry; int size; int charset16; XftFont *xft_font; { struct render_object *obj; char buf[65535], *p1; p1 = buf; bzero(buf, sizeof(buf)); if (sizeof(buf) > len) memcpy(buf, p, len); else return 0; obj = obj_alloc(state); if (obj == NULL) return 0; obj->x = x; obj->y = y; obj->fore = fore_color[caching]; obj->type = O_XTFONT; obj->data.xftfont.data = strdup(p1); obj->data.xftfont.fontname = strdup(fontname); obj->data.xftfont.registry = strdup(registry); obj->data.xftfont.len = len; obj->data.xftfont.size = size; obj->data.xftfont.charset16 = charset16; obj->ascent = xft_font->ascent; obj->descent = xft_font->descent; obj->vertloc = VL_BASE; return 1; } static XftDraw * xft_getdraw(Drawable drawable) { int i; for (i = 0; i < 2; i ++) { if (xft_xdraw[i] == drawable) return xft_draw[i]; } for (i = 0; i < 2; i ++) { if (!xft_xdraw[i]) xft_draw[i] = XftDrawCreate(display, drawable, visual, colormap); return xft_draw[i]; } return NULL; /* should not happen */ } static XftFont * xft_setfont(xfontarg, csize, registry) char *xfontarg; int csize; char *registry; { char *xfont; static XftFont *last_xftfont; static char lastfont[100]; static int lastsize = 0; XftFont *xftfont; char *p, *p2; char style[100]; char font[100]; int stlen; bzero(style, sizeof(style)); bzero(font, sizeof(font)); xfont = strdup(xfontarg); if (!xfont) return NULL; if (!strcmp(xfont, lastfont) && lastsize == csize) { free(xfont); return last_xftfont; } if ((p = strchr(xfont, ':')) != NULL) { /* * if xfont contsins ":", we believe this is a Xft font name * with the style expression. */ p2 = p + 1; /* allow to use ":style=" syntax */ if ((strstr(p2, "style=") != NULL) || (strstr(p2, "STYLE=") != NULL)) p2 += 6; *p = '\0'; strlcpy(font, xfont, sizeof(font)); strlcpy(style, p2, sizeof(style)); } else if ((p = strchr(xfont, '-')) != NULL) { /* * if xfont contains "-", we believe this is a conventional * xfont name and try to convert it for xft */ *p++ = 0; strlcpy(font, xfont, sizeof(font)); if (strncmp(p, "bold-i", 6) == 0) strlcpy(style, "Bold Italic", sizeof(style)); else if (strncmp(p, "bold-", 5) == 0) strlcpy(style, "Bold", sizeof(style)); else if ((p = strchr(p, '-')) != NULL && p[1] == 'i') strlcpy(style, "Italic", sizeof(style)); } else strlcpy(font, xfont, sizeof(font)); if (style[0]) { xftfont = XftFontOpen(display, screen, XFT_FAMILY, XftTypeString, font, XFT_ENCODING, XftTypeString, registry, XFT_STYLE, XftTypeString, style, XFT_PIXEL_SIZE, XftTypeDouble, (float)csize, 0); } else { xftfont = XftFontOpen(display, screen, XFT_FAMILY, XftTypeString, font, XFT_ENCODING, XftTypeString, registry, XFT_PIXEL_SIZE, XftTypeDouble, (float)csize, 0); } if (xftfont == 0) { free(xfont); return NULL; } if (style[0]) snprintf(lastfont, sizeof(lastfont), "%s:%s", font, style); else snprintf(lastfont, sizeof(lastfont), "%s", font); if (verbose) { fprintf(stderr, "using xftfont [%s] size: %d\n", lastfont, csize); } lastsize = csize; last_xftfont = xftfont; free(xfont); return last_xftfont; } #endif #ifdef USE_M17N obj_new_mtext(state, x, y, mt, from, to, drawframe, ascent, descent) struct render_state *state; int x, y; MText *mt; int from, to; MFrame *drawframe; int ascent, descent; { struct render_object *obj; obj = obj_alloc(state); if (obj == NULL) return 0; obj->x = x; obj->y = y; obj->fore = fore_color[caching]; /* we don't need this */ obj->type = O_M17NTEXT; obj->ascent = ascent; obj->descent = descent; obj->vertloc = VL_BASE; obj->data.m17ntext.mt = mt; m17n_object_ref (mt); obj->data.m17ntext.drawframe = drawframe; obj->data.m17ntext.from = from; obj->data.m17ntext.to = to; return 1; } #endif #ifdef USE_IMLIB void regist_zimage_position(obj, x, y, width, height, page) struct render_object *obj; int x, y, width, height, page; { int i; for (i = 0; i < ZIMAGENUM; i ++){ /* already registered */ if (zimage[i] == obj->data.image.imimage) return; } for (i = 0; i < ZIMAGENUM; i ++){ if (!zimage[i]) break; } if (i == ZIMAGENUM) { fprintf(stderr, "Warning: too many images\n"); return; } zimage[i] = obj->data.image.imimage; zonzoom[i] = obj->data.image.zoomonclk; zx[i] = x; zy[i] = y; zwidth[i] = width; zheight[i] = height; zpage[i] = page; } static void clear_zimage(page) int page; { int i; zoomin = 0; manage_pixmap((Pixmap)NULL, 0, page); for (i = 0; i < ZIMAGENUM; i ++){ if (zpage[i] == page) zimage[i] = 0; } } int search_zimage(x, y, page) int x, y, page; { int i; for (i = 0; i < ZIMAGENUM; i ++){ if (!zimage[i]) continue; if (zx[i] <= x && zx[i] + zwidth[i] >= x && zy[i] <= y && zy[i] + zheight[i] >= y && zpage[i] == page) { return i; } } return -1; } void zoomin_zimage(id) int id; { Pixmap pixmap; int i, w, h, x, y, xf, yf; int ratio = 10; float zstep = (window_width * zonzoom[id] / 100.0 - zwidth[id]) / (float)ratio; float xstep; float ystep; float xyratio = (float)zheight[id] / zwidth[id]; xf = window_width * (100 - zonzoom[id]) / 200.0; yf = (window_height - (window_width * zonzoom[id] / 100.0 * xyratio)) / 2; xstep = (float)(xf - zx[id]) / ratio; ystep = (float)(yf - zy[id]) / ratio; for (i = 0; i <= ratio; i ++) { w = zstep * i + zwidth[id]; h = w * xyratio+1; x = zx[id] + xstep * i; y = zy[id] + ystep * i; pixmap = pixmap_fromimimage(zimage[id], w, h); manage_pixmap(pixmap, 1, zpage[id]); if (i > 0) clear_region(id, i-1, i, 0); XCopyArea(display, pixmap, window, gcfore, 0,0, w, h, x, y); XFlush(display); if (i < ratio) usleep(10000); } } void zoomout_zimage(id) int id; { Pixmap pixmap; int i, w, h, x, y, xf, yf; int ratio = 10; float zstep = (window_width * zonzoom[id] / 100.0 - zwidth[id]) / (float)ratio; float xstep; float ystep; float xyratio = (float)zheight[id] / zwidth[id]; xf = window_width * (100 - zonzoom[id]) / 200.0; yf = (window_height - (window_width * zonzoom[id] / 100.0 * xyratio)) / 2; xstep = (float)(xf - zx[id]) / ratio; ystep = (float)(yf - zy[id]) / ratio; for (i = ratio-1; i >= 0; i --) { w = zstep * i + zwidth[id]; h = w * xyratio+1; x = zx[id] + xstep * i; y = zy[id] + ystep * i; pixmap = pixmap_fromimimage(zimage[id], w, h); manage_pixmap(pixmap, 1, zpage[id]); if (i < ratio) clear_region(id, i+1, i, 0); XCopyArea(display, pixmap, window, gcfore, 0, 0, w, h, x, y); XFlush(display); if (i > 0) usleep(10000); } clear_region(id, ratio, 1, 1); } void clear_region(id, prev, cur, clear) int id, prev, cur, clear; { int i, w, h, x, y, xf, yf; int x1, x2, y1, y2, w1, w2, h1, h2; int ratio = 10; float zstep = (window_width * zonzoom[id] / 100.0 - zwidth[id]) / (float)ratio; float xstep; float ystep; float xyratio = (float)zheight[id] / zwidth[id]; if (prev > ratio) return; xf = window_width * (100 - zonzoom[id]) / 200.0; yf = (window_height - (window_width * zonzoom[id] / 100.0 * xyratio)) / 2; xstep = (float)(xf - zx[id]) / ratio; ystep = (float)(yf - zy[id]) / ratio; x1 = zx[id] + xstep * prev; y1 = zy[id] + ystep * prev; w1 = zstep * prev + zwidth[id]; h1 = w1 * xyratio+1; x2 = zx[id] + xstep * cur; y2 = zy[id] + ystep * cur; w2 = zstep * cur + zwidth[id]; h2 = w2 * xyratio+1; if (x2 > x1) XClearArea(display, window, x1-1, y1, x2 - x1, h1, clear); if (y2 > y1) XClearArea(display, window, x1, y1, w1, y2 -y1, clear); if (x2 + w2 < x1 + w1) XClearArea(display, window, x2 + w2, y1, x1 + w1 - x2 - w2, h1, clear); if (y2 + h2 < y1 + h1) XClearArea(display, window, x1, y2 + h2, w1, y1 + h1 - y2 - h2, clear); } #endif kit/embed.c010064400237450000000000000077120664430437300124060ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: embed.c,v 1.7 1999/01/05 03:37:31 itojun Exp $ */ #include "mgp.h" #include char *mgpwdir = DEFAULT_MGPWDIR; char mgpwdirname[BUFSIZ] = ""; char * allocpy(p) char *p; { char *q; q = (char *)malloc(strlen(p) + 1); if (q == NULL) { fprintf(stderr, "malloc: %s\n", strerror(errno)); cleanup(-1); } return strcpy(q, p); } char * embed_fname(fname) char *fname; { char buf[BUFSIZ]; if (strncmp(fname, EMBEDDIR, strlen(EMBEDDIR)) != 0) return fname; fname += strlen(EMBEDDIR); if (*mgpwdirname == '\0') { /* not initialized yet */ sprintf(mgpwdirname, "%s/mgp.%d", mgpwdir, getpid()); if (mkdir(mgpwdirname, 0700) < 0) { fprintf(stderr, "%s: %s\n", mgpwdirname, strerror(errno)); cleanup(-1); } } sprintf(buf, "%s/%s", mgpwdirname, fname); return allocpy(buf); } void embed_file(fp, p, lineno) FILE *fp; /* stream to get data */ struct ctrl *p; int *lineno; { char buf[BUFSIZ]; FILE *pp; struct stat st; int len; if (stat(mgpwdirname, &st) < 0) { fprintf(stderr, "no EMBED directory found\n"); cleanup(-1); } #ifdef UUDECODEOPT # define UUDECODE_ALL UUDECODE " " UUDECODEOPT #else #define UUDECODE_ALL UUDECODE #endif if ((pp = popen(UUDECODE_ALL, "w")) == NULL) { fprintf(stderr, "popen: %s\n", strerror(errno)); cleanup(-1); } sprintf(buf, "%s/%s", mgpwdirname, p->ctc_value); if (access(buf, F_OK) == 0) { fprintf(stderr, "embedded filename duplicated: %s\n", p->ctc_value); cleanup(-1); } fprintf(pp, "begin 600 %s/%s\n", mgpwdirname, p->ctc_value); while (fgets(buf, sizeof(buf), fp)) { (*lineno)++; if (strncasecmp(buf, "%endembed", 9) == 0) break; fputs(buf, pp); } fprintf(pp, "end\n"); pclose(pp); len = strlen(p->ctc_value); if (len > 3 && strncmp(p->ctc_value + len - 3, ".gz", 3) == 0) { sprintf(buf, "%s %s/%s", GUNZIP, mgpwdirname, p->ctc_value); system(buf); } return; } void cleandir() /* called by signal and quitting the mgp */ { DIR *dp; struct dirent *dep; char fname[BUFSIZ]; if (*mgpwdirname == '\0') return; if ((dp = opendir(mgpwdirname)) == NULL) { fprintf(stderr, "%s: %s\n", mgpwdirname, strerror(errno)); return; } while ((dep = readdir(dp))) { if (strcmp(dep->d_name, ".") == 0 || strcmp(dep->d_name, "..") == 0) continue; sprintf(fname, "%s/%s", mgpwdirname, dep->d_name); if (unlink(fname)) { fprintf(stderr, "unlink of %s: %s", fname, strerror(errno)); } } closedir(dp); rmdir(mgpwdirname); } kit/font.c010064400237450000000000000324050721266102700122670ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: font.c,v 1.26 2000/12/04 09:21:27 nishida Exp $ */ #include "mgp.h" #ifdef VFLIB #define VF_DESCENT 8 int vfcachesize = 3000; /*XXX*/ #define VFHASH_SIZE 255 static char *vf_curname; static int vfont_fd = -1; static int vfcinitdone; static int vfcachecnt; static struct vfont vfclru; static struct vfont vfcache[VFHASH_SIZE]; #define VFCACHE_HASH(w, h, c) (((c ^ w) ^ h) % VFHASH_SIZE) int vfcachehit = 0; int vfcachemiss = 0; static void initrevbitmap __P((void)); /* * revbitmap: reverse the MSB and LSB of a byte value. * example: revbitmap[0x80] == 0x01, revbitmap[0x55] == 0xaa * leftbitmap: the index of leftmost bit in a byte value. (MSB is on the left) * example: leftbitmap[0x80] == 0, leftbitmap[0x19] == 3 * rightbitmap: the index of rightmost bit in a byte value. * example: rightbitmap[0x80] == 0, rightbitmap[0x19] == 7 */ static u_char *revbitmap = NULL; static char *leftbitmap = NULL; static char *rightbitmap = NULL; static short ctable[128] = { 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x2121, 0x212a, 0x216d, 0x2174, 0x2170, 0x2173, 0x2175, 0x216c, 0x214a, 0x214b, 0x2176, 0x215c, 0x2124, 0x215d, 0x2125, 0x213f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x2127, 0x2128, 0x2152, 0x2161, 0x2153, 0x2129, 0x2177, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x214e, 0x2140, 0x214f, 0x2130, 0x2132, 0x212e, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x2150, 0x2143, 0x2151, 0x2141, 0x2121, }; static void initrevbitmap() { int i; int j; u_char x; int right; int left; revbitmap = (u_char *)malloc(256 * sizeof(u_char)); leftbitmap= (char *)malloc(256 * sizeof(char)); rightbitmap= (char *)malloc(256 * sizeof(char)); if (!revbitmap || !leftbitmap || !rightbitmap) { fprintf(stderr, "initrevbitmap: malloc failed\n"); cleanup(-1); } for (i = 0; i < 256; i++) { right = left = -1; x = 0x00; for (j = 0; j < 8; j++) { if (i & (0x80 >> j)) { x |= (1 << j); right = j; if (left == -1) left = j; } } revbitmap[i] = x; rightbitmap[i] = right; leftbitmap[i] = left; } } #define VFC_INSHASH(vfc) { \ struct vfont *h, *n; \ h = &vfcache[VFCACHE_HASH(vfc->code, vfc->width, vfc->height)]; \ n = h->next; vfc->next = n; n->prev = vfc; \ h->next = vfc; vfc->prev = h; \ } #define VFC_DELHASH(vfc) { \ struct vfont *n, *p; \ n = vfc->next; p = vfc->prev; \ n->prev = p; p->next = n; \ } #define VFC_INSLRU(vfc) { \ struct vfont *p; \ p = vfclru.lruprev; vfc->lruprev = p; p->lrunext = vfc; \ vfclru.lruprev = vfc; vfc->lrunext = &vfclru; \ } #define VFC_DELLRU(vfc) { \ struct vfont *n, *p; \ n = vfc->lrunext; p = vfc->lruprev; \ n->lruprev = p; p->lrunext = n; \ } static void vfc_init() { int i; struct vfont *vfc; vfc = vfcache; for (vfc = vfcache, i = 0; i < VFHASH_SIZE; vfc++, i++) vfc->next = vfc->prev = vfc; vfclru.lrunext = vfclru.lruprev = &vfclru; vfcinitdone++; } static void vfc_free(vfc) struct vfont *vfc; { VFC_DELHASH(vfc); VFC_DELLRU(vfc); free(vfc->dbitmap); free(vfc); vfcachecnt--; } static struct vfont * vfc_lookup(code, width, height, fontname) u_int code, width, height; char *fontname; { struct vfont *vfc, *hvfc; hvfc = &vfcache[VFCACHE_HASH(code, width, height)]; for (vfc = hvfc->next; vfc != hvfc; vfc = vfc->next) { if (vfc->code == code && vfc->width == width && vfc->height == height && vfc->fontname == fontname) { vfcachehit++; VFC_DELLRU(vfc); VFC_INSLRU(vfc); return vfc; } } vfcachemiss++; return NULL; } static struct vfont * vfc_alloc(code, width, height, fontname) u_int code, width, height; char *fontname; { u_int rast = (width + 7) / 8; u_int rast2 = (width * 2 + 7) / 8; u_char *lbitmap; u_char *dbitmap; u_int char_len; struct vfont *vfc; u_int max_x, min_x; u_int ix, iy; u_char data, *bitmap; u_char *s; u_int bsize; u_int vcode; XImage *xim; bsize = rast * height; if (code < 128) vcode = ctable[code]; else vcode = code; vfc = (struct vfont *)malloc(sizeof(*vfc)); if (vfc == NULL) { fprintf(stderr, "vfc_alloc: malloc failed\n"); cleanup(-1); } vfc->code = code; vfc->width = width; vfc->height = height; vfc->fontname = vf_curname; vfc->ref = 0; bitmap = (u_char *)malloc(bsize); if (bitmap == NULL) { fprintf(stderr, "vfc_alloc: malloc failed\n"); cleanup(-1); } #if 1 /* ANTIALIAS */ /*XXX: TODO: cleanup, optimization */ lbitmap = (u_char *)malloc(rast2 * height * 2); dbitmap = (u_char *)malloc(width * height); if (lbitmap == NULL || dbitmap == NULL) { fprintf(stderr, "vfc_alloc: malloc failed\n"); cleanup(-1); } memset(lbitmap, 0, rast2 * height * 2); VF_GetBitmap(vcode, vfont_fd, width * 2, height * 2, rast2, 0, lbitmap); { int i, j, x1, x2, y, b1, b2; u_char *s1, *s2, *d, *z; static u_char dp[] = { 0, 1, 1, 2 }; z = dbitmap; d = bitmap; for (j = 0; j < height; j++) { s1 = lbitmap + rast2 * (j * 2); s2 = s1 + rast2; y = 0; for (i = 0, b1 = 7, b2 = 6; i < width; i++, b1--, b2 -= 2) { if (b1 < 0) { *d++ = y; y = 0; b1 = 7; } if (b2 < 0) { s1++, s2++; b2 = 6; } x1 = (*s1 >> b2) & 0x03; x2 = (*s2 >> b2) & 0x03; if (x1 | x2) y |= 1 << b1; *z++ = dp[x1] + dp[x2]; } *d++ = y; for (i += 2; i < rast * 2; i++) *d++ = 0; } } free(lbitmap); vfc->dbitmap = dbitmap; #else memset(bitmap, 0, bsize); if (!(mgp_flag & FL_OUTLINE)) { VF_GetBitmap(vcode, vfont_fd, width, height, rast, 0, bitmap); } else { /* OR */ u_long *vfdata; if ((vfdata = VF_GetOutline(vcode, vfont_fd)) == NULL) { fprintf(stderr, "Failed to get outline : %04x\n", vcode); } else { VF_DrawOutline(vfdata, vfont_fd, width, height, rast, 0, bitmap); VF_FreeOutline(vfdata, vfont_fd); } } #endif /*ANTIALIAS*/ if (!revbitmap) initrevbitmap(); /* compute right/left boundary */ max_x = -1; min_x = -1; for (ix = 0; ix < rast; ix++) { data = 0x00; s = bitmap + ix; for (iy = 0, s = bitmap + ix; iy < height; iy++, s += rast) data |= *s; if (data) { max_x = ix * 8 + rightbitmap[data]; if (min_x == -1) min_x = ix * 8 + leftbitmap[data]; } } /* XXX: ".," ... */ if (code >= 0x2121 && code <= 0x2125 && max_x < width / 2) max_x += width / 2; #if 0 /* remove soon */ xim = XCreateImage(display, visual, 1, XYBitmap, 0, NULL, width, height, 8, 0); if (xim == NULL) { fprintf(stderr, "vfc_alloc: XCreateImage failed\n"); cleanup(-1); } if (xim->bitmap_bit_order == LSBFirst) { /* convert the bit order of image bitmap */ for (iy = 0, s = bitmap; iy < height; iy++) { for (ix = 0; ix < rast; ix++, s++) *s = revbitmap[*s]; } } xim->data = (char *)bitmap; vfc->image = xim; #endif /* horizontal gap of 1 dot is included by default */ char_len = max_x - min_x + 2; vfc->xoff = min_x; vfc->charlen = vfc->xmax = char_len; vfc->descent = height / VF_DESCENT; vfc->ascent = vfc->height - vfc->descent; VFC_INSHASH(vfc); VFC_INSLRU(vfc); vfcachecnt++; return vfc; } struct vfont * vfc_get(code, width, height, force) u_int code, width, height; int force; { struct vfont *vfc, *nvfc; /* sanity check */ if (vf_curname == NULL) return NULL; if (!vfcinitdone) vfc_init(); vfc = vfc_lookup(code, width, height, vf_curname); if (vfc == NULL) { if (vfcachecnt >= vfcachesize) { if (!force) return NULL; vfc = vfclru.lrunext; while (vfcachecnt >= vfcachesize) { if (vfc == &vfclru) break; nvfc = vfc->lrunext; if (vfc->ref == 0) vfc_free(vfc); vfc = nvfc; } } vfc = vfc_alloc(code, width, height, vf_curname); } #if 0 fprintf(stderr, "vfc_get: cache=%d, hit=%d, miss=%d\n", vfcachecnt, vfcachehit, vfcachemiss); #endif return vfc; } void vfc_setfont(fontname) char *fontname; { static char *prev_vfcap; if ((mgp_flag & FL_NOVFLIB)) { return; } if (prev_vfcap != vfcap_name) { /* * Because the string specified by %vfcap is stored in * allocated area and never freed, string compare is not * needed here. */ if (prev_vfcap) VF_Deinit(); if (VF_Init(vfcap_name) < 0) { fprintf(stderr, "Error VF_Init\n"); cleanup(-1); } prev_vfcap = vfcap_name; if (prev_vfcap == NULL) prev_vfcap = ""; /* XXX: just in case */ } #if 0 if (vfont_fd >= 0) VF_CloseFont(vfont_fd); #endif vfont_fd = VF_OpenFont(fontname); vf_curname = fontname; if (vfont_fd < 0) { fprintf(stderr, "Can't open vffont %s (vfcap=%s)\n", fontname, vfcap_name); cleanup(-1); } } XImage * vfc_image(vfc, fore, back, xim, bx, by) struct vfont *vfc; long fore, back; XImage *xim; u_int bx, by; { int x, y; int maxx; static XColor col[5]; u_char d, *s; u_long p; XColor *bcol = NULL, *bc; u_int charlen; /* offset the base position */ by -= vfc->ascent; charlen = vfc->charlen; if (vfc->xoff + charlen > vfc->width) charlen = vfc->width - vfc->xoff; if (back == -1) { u_long r, g, b; int dots; dots = charlen * vfc->height; bcol = malloc(sizeof(XColor) * dots); if (bcol == NULL) return NULL; bc = bcol; for (y = 0; y < vfc->height; y++) { for (x = 0; x < charlen; x++, bc++) { bc->pixel = XGetPixel(xim, bx+x, by+y); bc->flags = DoRed|DoGreen|DoBlue; } } XQueryColors(display, colormap, bcol, dots); r = g = b = 0; for (y = 0; y < vfc->height; y++) { for (x = 0; x < charlen; x++) { r += bcol[x].red; g += bcol[x].green; b += bcol[x].blue; } } r /= dots; g /= dots; b /= dots; bc = &col[0]; if (bc->red == r && bc->green == g && bc->blue == b) bc->pixel = back; else { bc->pixel = ~back; bc->red = r; bc->green = g; bc->blue = b; } } if (fore != col[4].pixel || back != col[0].pixel) { col[4].pixel = fore; col[4].flags = DoRed|DoGreen|DoBlue; if (back != -1) { col[3].pixel = back; col[3].flags = DoRed|DoGreen|DoBlue; XQueryColors(display, colormap, &col[3], 2); col[0] = col[3]; } else { XQueryColor(display, colormap, &col[4]); } for (x = 3; x > 0; x--) { col[x].red = (col[4].red *x + col[0].red *(4-x)) /4; col[x].green = (col[4].green*x + col[0].green*(4-x)) /4; col[x].blue = (col[4].blue *x + col[0].blue *(4-x)) /4; if (!XAllocColor(display, colormap, &col[x])) { if (verbose) printf("vfc_image: cannot allocate color for level %d (using %d)\n", x, x + 1); col[x].pixel = col[x + 1].pixel; } else regist_alloc_colors(&font_clr, &col[x].pixel, 1); } } /* XXX: need optimization */ s = vfc->dbitmap; bc = bcol; maxx = bx + charlen; for (y = by; y < vfc->height + by; y++) { s += vfc->xoff; for (x = bx; x < maxx; x++) { if ((d = *s++)) { p = col[d].pixel; XPutPixel(xim, x, y, p); } } s += vfc->width - (vfc->xoff + charlen); } if (mgp_flag & FL_GLYPHEDGE) { /* * for debugging treatment of font metrics, for 16bpp displays */ /* pixmap bounding box */ for (y = 0; y < vfc->height; y++) { XPutPixel(xim, bx, by + y, 0xffff); XPutPixel(xim, bx + charlen - 1, by + y, 0xffff); } for (x = 0; x < charlen; x++) { XPutPixel(xim, bx + x, by, 0xffff); XPutPixel(xim, bx + x, by + vfc->height - 1, 0xffff); } /* origin */ XPutPixel(xim, bx, by, 0xaaaa); /* baseline */ for (x = 0; x < vfc->width; x++) XPutPixel(xim, bx + vfc->xoff + x, by, 0xaaaa); } if (bcol) free(bcol); return xim; } #endif /* VFLIB */ kit/globals.c010064400237450000000000000140511072206166000127360ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: globals.c,v 1.52 2007/11/24 17:47:28 nishida Exp $ */ #include "mgp.h" /* * Global variables common to "mgp" and "mgp2ps". * (hate to define these in two places, mgp.c and print.c, I've made * a separate file) */ u_char *page_data[MAXPAGE][MAXLINE]; struct ctrl *page_control[MAXPAGE][MAXLINE]; struct ctrl *default_control[MAXLINE]; struct ctrl *tab_control[MAXTAB+MAXSTYLE]; struct ctrl *init_control[MAXLINE]; struct ctrl *fontdef_control[MAXFONTDEF]; struct page_attribute page_attribute[MAXPAGE]; u_int mgp_flag; int verbose; u_int maxpage; u_int cur_page = 0; char *mgp_fname; char *mgp_wname; /* window title */ u_int parse_error = 0; u_int parse_debug = 0; Display *display; Visual *visual; Window window; int screen; int window_width; int window_height; int caching = 0; int cached_page = 0; int cache_hit = 0; int cache_mode = 0; int cache_effect = 0; int cache_value = 60; Pixmap pixmap; Pixmap cachewin; Pixmap cachetmp; struct bgpixmap bgpixmap[MAXBGPIXMAP]; Colormap colormap; int free_clr_num; u_long *free_clr = NULL; u_int char_size[2]; u_int nonscaled_size[2]; float sup_scale; float sup_off; float sub_off; u_int horiz_gap[2] = {DEFAULT_HGAP, DEFAULT_HGAP}; u_int vert_gap[2] = {DEFAULT_VGAP, DEFAULT_VGAP}; u_int depth; u_long fore_color[2]; u_long back_color[2]; u_long ctrl_color[2]; u_int b_quality[2] = {DEFAULT_BQUALITY, DEFAULT_BQUALITY}; u_int quality_flag = 0; char mgp_charset[256]; struct alloc_color image_clr = {0, NULL}; struct alloc_color back_clr = {0, NULL}; struct alloc_color font_clr = {0, NULL}; const struct ctl_words ctl_words[] = { /*CTL*/ { CTL_NOOP, T_VOID, "noop", 4 }, /*CTL*/ { CTL_DEFAULT, T_INT, "default", 7 }, /*CTL*/ { CTL_TAB, T_SP, "tab", 3 }, /*CTL*/ { CTL_SIZE, T_DOUBLE, "size", 4 }, /*CTL*/ { CTL_FORE, T_LONG, "fore", 4 }, /*CTL*/ { CTL_BACK, T_LONG, "back", 4 }, /*CTL*/ { CTL_LEFT, T_VOID, "left", 4 }, /*CTL*/ { CTL_LEFTFILL, T_VOID, "leftfill", 4 }, /*CTL*/ { CTL_CENTER, T_VOID, "center", 6 }, /*CTL*/ { CTL_RIGHT, T_VOID, "right", 5 }, /*CTL*/ { CTL_SHRINK, T_VOID, "shrink", 6 }, /*CTL*/ { CTL_LCUTIN, T_VOID, "lcutin", 6 }, /*CTL*/ { CTL_RCUTIN, T_VOID, "rcutin", 6 }, /*CTL*/ { CTL_CONT, T_VOID, "cont", 4 }, /*CTL*/ { CTL_NODEF, T_VOID, "nodefault", 9 }, /*CTL*/ { CTL_XFONT, T_STR, "xfont", 5 }, /*CTL*/ { CTL_XFONT2, T_STR2, "xfont2", 6 }, /*CTL*/ { CTL_VFONT, T_STR, "vfont", 5 }, /*CTL*/ { CTL_TFONT, T_STR, "tfont", 5 }, /*CTL*/ { CTL_IMAGE, T_SP, "image", 5 }, /*CTL*/ { CTL_BIMAGE, T_SP, "bimage", 6 }, /*CTL*/ { CTL_PAGE, T_VOID, "page", 4 }, /*CTL*/ { CTL_HGAP, T_INT, "hgap", 4 }, /*CTL*/ { CTL_VGAP, T_INT, "vgap", 4 }, /*CTL*/ { CTL_GAP, T_INT, "gap", 3 }, /*CTL*/ { CTL_PAUSE, T_SP, "pause", 5 }, /*CTL*/ { CTL_PSFONT, T_STR, "psfont",6 }, /*CTL*/ { CTL_PREFIX, T_STR, "prefix", 6 }, /*CTL*/ { CTL_PREFIXN, T_STR, "*prefixn*", 9 }, /*CTL*/ { CTL_TABPREFIX, T_STR, "*tabprefix*", 11 }, /*CTL*/ { CTL_TABPREFIXN, T_STR, "*tabprefixn*", 12 }, /*CTL*/ { CTL_PREFIXPOS, T_VOID, "*prefixpos*", 11 }, /*CTL*/ { CTL_AGAIN, T_VOID, "again", 5 }, /*CTL*/ { CTL_CCOLOR, T_LONG, "ccolor", 6 }, /*CTL*/ { CTL_BAR, T_SP, "bar", 3 }, /*CTL*/ { CTL_INCLUDE, T_STR, "include", 7 }, /*CTL*/ { CTL_BGRAD, T_SP, "bgrad", 5 }, /*CTL*/ { CTL_TEXT, T_STR, "*text*", 6 }, /*CTL*/ { CTL_LINESTART, T_VOID, "*linestart*", 11 }, /*CTL*/ { CTL_LINEEND, T_VOID, "*lineend*", 9 }, /*CTL*/ { CTL_MARK, T_VOID, "mark", 4 }, /*CTL*/ { CTL_SYSTEM, T_SP, "system", 6 }, /*CTL*/ { CTL_FILTER, T_SP, "filter", 6 }, /*CTL*/ { CTL_ENDFILTER, T_VOID, "endfilter", 9 }, /*CTL*/ { CTL_QUALITY, T_INT, "bquality", 8 }, /*CTL*/ { CTL_ICON, T_SP, "icon", 4 }, /*CTL*/ { CTL_XSYSTEM, T_SP, "xsystem", 7 }, /*CTL*/ { CTL_TSYSTEM, T_SP, "tsystem", 7 }, /*CTL*/ { CTL_TFDIR, T_STR, "tfdir", 5 }, /*CTL*/ { CTL_DEFFONT, T_STR, "deffont", 7 }, /*CTL*/ { CTL_FONT, T_STR, "font", 4 }, /*CTL*/ { CTL_VFCAP, T_STR, "vfcap", 5 }, /*CTL*/ { CTL_TFONT0, T_STR, "tfont0", 6 }, /*CTL*/ { CTL_EMBED, T_STR, "embed", 5 }, /*CTL*/ { CTL_ENDEMBED, T_VOID, "endembed", 8 }, /*CTL*/ { CTL_CHARSET, T_STR, "charset", 7 }, /*CTL*/ { CTL_TMFONT, T_STR, "tmfont", 6 }, /*CTL*/ { CTL_TMFONT0, T_STR, "tmfont0", 7 }, /*CTL*/ { CTL_PCACHE, T_SP, "pcache", 6 }, /*CTL*/ { CTL_ANIM, T_STR, "anim", 4 }, /*CTL*/ { CTL_VALIGN, T_SP, "valign", 6 }, /*CTL*/ { CTL_AREA, T_SP, "area", 4 }, /*CTL*/ { CTL_OPAQUE, T_INT, "opaque", 6 }, /*CTL*/ { CTL_SUP, T_VOID, "sup", 3 }, /*CTL*/ { CTL_SUB, T_VOID, "sub", 3 }, /*CTL*/ { CTL_SETSUP, T_INT, "setsup", 6 }, /*CTL*/ { CTL_M17N, T_STR2, "m17n", 4 }, { 0, 0, NULL, 0 }, }; kit/grammar.y010064400237450000000000000635571074416247000130130ustar nishidawheel%{ /* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: grammar.y,v 1.50 2008/01/18 17:43:20 nishida Exp $ */ /* * partly derived from lbl libpcap source code, which has the following * copyright notice: */ /* * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code distributions * retain the above copyright notice and this paragraph in its entirety, (2) * distributions including binary code include the above copyright notice and * this paragraph in its entirety in the documentation or other materials * provided with the distribution, and (3) all advertising materials mentioning * features or use of this software display the following acknowledgement: * ``This product includes software developed by the University of California, * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of * the University nor the names of its contributors may be used to endorse * or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * */ #include "mgp.h" #ifdef HAVE_STDARG_H #include #else #include #endif #if 0 #define QSET(q, p, d, a) (q).proto = (p),\ (q).dir = (d),\ (q).addr = (a) static struct qual qerr = { Q_UNDEF, Q_UNDEF, Q_UNDEF, Q_UNDEF }; #endif int n_errors = 0; struct ctrl *root; char *yyfilename; int yylineno; #ifdef HAVE_STDARG_H /* GCC complains if we declare this function in traditional style */ void yyerror(char *msg, ...) #else void yyerror(msg) char *msg; #endif { va_list ap; #ifdef HAVE_STDARG_H va_start(ap, msg); #else va_start(ap); #endif ++n_errors; fprintf(stderr, "%s:%d: error: ", yyfilename, yylineno); vfprintf(stderr, msg, ap); fprintf(stderr, "\n"); va_end(ap); } #ifdef HAVE_STDARG_H /* GCC complains if we declare this function in traditional style */ static void yywarn(char *msg, ...) #else static void yywarn(msg) char *msg; #endif { va_list ap; #ifdef HAVE_STDARG_H va_start(ap, msg); #else va_start(ap); #endif fprintf(stderr, "%s:%d: warning: ", yyfilename, yylineno); vfprintf(stderr, msg, ap); fprintf(stderr, "\n"); va_end(ap); } static struct ctrl * gen_void(op) int op; { struct ctrl *ct; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate void node"); return ct; } return ct; } static struct ctrl * gen_double_int(op, v) int op; int v; { struct ctrl *ct; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate double node"); return ct; } ct->ctf_value = (double)v; return ct; } static struct ctrl * gen_double(op, v) int op; double v; { struct ctrl *ct; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate double node"); return ct; } ct->ctf_value = v; return ct; } static struct ctrl * gen_int(op, v) int op; int v; { struct ctrl *ct; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate integer node"); return ct; } ct->cti_value = v; return ct; } static struct ctrl * gen_int2(op, v1, v2) int op; int v1; int v2; { struct ctrl *ct; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate integer2 node"); return ct; } ct->cti2_value1 = v1; ct->cti2_value2 = v2; return ct; } static struct ctrl * gen_int3(op, v1, v2, v3) int op; int v1; int v2; int v3; { struct ctrl *ct; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate integer3 node"); return ct; } ct->cti3_value1 = v1; ct->cti3_value2 = v2; ct->cti3_value3 = v3; return ct; } static struct ctrl * gen_str(op, str) int op; char *str; { struct ctrl *ct; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate str1 node"); return ct; } ct->ctc_value = strdup(str); return ct; } static struct ctrl * gen_str2(op, str1, str2) int op; char *str1; char *str2; { struct ctrl *ct; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate str2 node"); return ct; } ct->ctc2_value1 = strdup(str1); ct->ctc2_value2 = strdup(str2); return ct; } static struct ctrl * gen_color(op, color) int op; char *color; { struct ctrl *ct; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate color node"); return ct; } if (get_color(color, &ct->ctl_value) < 0) yyerror("cannot allocate color \"%s\"", color); return ct; } static struct ctrl * gen_bgrad(w, h, colors, dir, zoomflg, extra) int w; int h; int colors; int dir; int zoomflg; struct ctrl *extra; { struct ctrl *ct; struct ctrl *p; int siz; if (!(ct = ctlalloc1(CTL_BGRAD))) { yyerror("cannot allocate node (op=BGRAD)"); return ct; } ct->ctd_width = w; ct->ctd_height = h; ct->ctd_numcolor = colors; ct->ctd_dir = dir; ct->ctd_zoomflag = zoomflg; /* process color list. */ siz = ct->ctd_g_colors = 0; for (p = extra; p; p = p->ct_next) siz++; if (siz <= 2) { ct->ct_val.ctrl_grad.colors = malloc(3 * sizeof(struct gcolor *)); } else { ct->ct_val.ctrl_grad.colors = malloc((siz + 1) * sizeof(struct gcolor *)); } if (!ct->ct_val.ctrl_grad.colors) { yyerror("cannot allocate color table"); return ct; } ct->ctd_g_colors = 2; ct->ct_val.ctrl_grad.colors[0] = name2gcolor(DEFAULT_GRADSTART); ct->ct_val.ctrl_grad.colors[1] = name2gcolor(DEFAULT_GRADEND); switch (siz) { case 0: break; case 1: ct->ct_val.ctrl_grad.colors[0] = name2gcolor(extra->ctc_value); break; default: ct->ctd_g_colors = siz; siz = 0; for (p = extra; p; p = p->ct_next) { ct->ct_val.ctrl_grad.colors[siz] = name2gcolor(p->ctc_value); siz++; } } /* normalize */ if (ct->ctd_dir < 0) { /*circle*/ ct->ctd_mode = 1; ct->ctd_dir = abs(ct->ctd_dir); } else /*linear*/ ct->ctd_mode = 0; while (ct->ctd_dir < 0) ct->ctd_dir += 360; ct->ctd_dir %= 360; if (ct->ctd_width <= 0) ct->ctd_width = 100; if (ct->ctd_height <= 0) ct->ctd_height = 100; if (extra) ctlfree(extra); return ct; } static struct ctrl * gen_newimage(arg) struct ctrl *arg; { struct ctrl *p; struct ctrl *ct; if (!(ct = ctlalloc1(CTL_IMAGE))) { yyerror("cannot allocate node (op=IMAGE)"); return ct; } /* default setting */ ct->ctm_ximagesize = 100; ct->ctm_yimagesize = 100; ct->ctm_zoomflag = Z_NORMAL | (Z_NORMAL << Z_YSHIFT); ct->ctm_raise = 0; ct->ctm_rotate = 0; ct->ctm_zoomonclk = 0; for (p = arg; p; p = p->ct_next) { if (p->ctc_value[0] != '-') break; if (strcmp(p->ctc_value, "-colors") == 0 && p->ct_next) { p = p->ct_next; ct->ctm_numcolor = atoi(p->ctc_value); } else if (strcmp(p->ctc_value, "-xysize") == 0 && p->ct_next && p->ct_next->ct_next) { p = p->ct_next; ct->ctm_ximagesize = atoi(p->ctc_value); p = p->ct_next; ct->ctm_yimagesize = atoi(p->ctc_value); ct->ctm_zoomflag = Z_ABSOLUTE | (Z_ABSOLUTE << Z_YSHIFT); } else if (strcmp(p->ctc_value, "-zoom") == 0 && p->ct_next) { p = p->ct_next; ct->ctm_ximagesize = atoi(p->ctc_value); ct->ctm_yimagesize = atoi(p->ctc_value); ct->ctm_zoomflag = Z_NORMAL | (Z_NORMAL << Z_YSHIFT); } else if (strcmp(p->ctc_value, "-xyzoom") == 0 && p->ct_next && p->ct_next->ct_next) { p = p->ct_next; ct->ctm_ximagesize = atoi(p->ctc_value); p = p->ct_next; ct->ctm_yimagesize = atoi(p->ctc_value); ct->ctm_zoomflag = Z_NORMAL | (Z_NORMAL << Z_YSHIFT); } else if (strcmp(p->ctc_value, "-scrzoom") == 0 && p->ct_next) { p = p->ct_next; ct->ctm_ximagesize = atoi(p->ctc_value); ct->ctm_yimagesize = atoi(p->ctc_value); ct->ctm_zoomflag = Z_SCREEN | (Z_SCREEN << Z_YSHIFT); } else if (strcmp(p->ctc_value, "-xscrzoom") == 0 && p->ct_next) { p = p->ct_next; ct->ctm_ximagesize = atoi(p->ctc_value); ct->ctm_yimagesize = 100; ct->ctm_zoomflag = Z_SCREEN | (Z_OBEY << Z_YSHIFT); } else if (strcmp(p->ctc_value, "-yscrzoom") == 0 && p->ct_next) { p = p->ct_next; ct->ctm_ximagesize = 100; ct->ctm_yimagesize = atoi(p->ctc_value); ct->ctm_zoomflag = Z_OBEY | (Z_SCREEN << Z_YSHIFT); } else if (strcmp(p->ctc_value, "-xyscrzoom") == 0 && p->ct_next && p->ct_next->ct_next) { p = p->ct_next; ct->ctm_ximagesize = atoi(p->ctc_value); p = p->ct_next; ct->ctm_yimagesize = atoi(p->ctc_value); ct->ctm_zoomflag = Z_SCREEN | (Z_SCREEN << Z_YSHIFT); } else if (strcmp(p->ctc_value, "-raise") == 0 && p->ct_next) { p = p->ct_next; ct->ctm_raise = atoi(p->ctc_value); } else if (strcmp(p->ctc_value, "-rotate") == 0 && p->ct_next) { p = p->ct_next; ct->ctm_rotate = atoi(p->ctc_value); } else if (strcmp(p->ctc_value, "-zoomonclk") == 0 && p->ct_next) { p = p->ct_next; #ifdef USE_IMLIB ct->ctm_zoomonclk = atoi(p->ctc_value); #else fprintf(stderr, "warning: cannot use -zoomonclk option in this configuration\n"); #endif } else { yyerror("invalid argument %s specified for newimage", p->ctc_value); return ct; } } if (!p) { yyerror("no filename specified to newimage"); return ct; } if (p->ct_next) { yyerror("multiple filename specified to newimage"); return ct; } ct->ctm_fname = embed_fname(p->ctc_value); if (mgpwdirname[0] != '\0' && strncmp(mgpwdirname, ct->ctm_fname, strlen(mgpwdirname)) == 0) ; /* do not chkfile() */ else chkfile(ct->ctm_fname); return ct; } static struct ctrl * gen_image(op, fname, colors, xsiz, ysiz, zoomflg) int op; char *fname; int colors; int xsiz; int ysiz; int zoomflg; { struct ctrl *ct; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate node (op=IMAGE)"); return ct; } ct->ctm_fname = embed_fname(fname); ct->ctm_numcolor = colors; ct->ctm_ximagesize = xsiz; ct->ctm_yimagesize = ysiz; switch (zoomflg) { case 0: ct->ctm_zoomflag = 0; if (ct->ctm_ximagesize == 0) { ct->ctm_ximagesize = 100; ct->ctm_zoomflag |= Z_NORMAL; } else ct->ctm_zoomflag |= Z_SCREEN; if (ct->ctm_yimagesize == 0) { ct->ctm_yimagesize = 100; ct->ctm_zoomflag |= (Z_NORMAL << Z_YSHIFT); } else ct->ctm_zoomflag |= (Z_SCREEN << Z_YSHIFT); break; case 1: ct->ctm_zoomflag = Z_NORMAL | (Z_NORMAL << Z_YSHIFT); break; case 2: ct->ctm_zoomflag = Z_SCREEN0 | (Z_SCREEN0 << Z_YSHIFT); break; } if (mgpwdirname[0] != '\0' && strncmp(mgpwdirname, ct->ctm_fname, strlen(mgpwdirname)) == 0) ; /* do not chkfile() */ else chkfile(ct->ctm_fname); return ct; } static struct ctrl * gen_bar(color, thick, start, len) char *color; int thick; int start; int len; { struct ctrl *ct; if (!(ct = ctlalloc1(CTL_BAR))) { yyerror("cannot allocate node (op=BAR)"); return ct; } if (get_color(color, &ct->ctb_color) < 0) yyerror("cannot allocate color %s", color); ct->ctb_width = thick; ct->ctb_start = start; ct->ctb_length = len; /* normalize */ if (ct->ctb_width < 0) ct->ctb_width = 0; else if (1000 < ct->ctb_width) ct->ctb_width = 1000; if (ct->ctb_start < 0) ct->ctb_start = 0; else if (100 < ct->ctb_start) ct->ctb_start = 100; if (100 < ct->ctb_start + ct->ctb_length) ct->ctb_length = 100 - ct->ctb_start; return ct; } static struct ctrl * gen_icon(n, color, siz) char *n; char *color; int siz; { struct ctrl *ct; if (!(ct = ctlalloc1(CTL_ICON))) { yyerror("cannot allocate node (op=ICON)"); return ct; } ct->ctic_value = n; if (get_color(color, &ct->ctic_color) < 0) yyerror("cannot allocate color %s", color); ct->ctic_size = siz; return ct; } static struct ctrl * gen_pcache(flag, mode, effect, value) int flag; int mode; int effect; int value; { struct ctrl *ct; if (!(ct = ctlalloc1(CTL_PCACHE))) { yyerror("cannot allocate node (op=PCACHE)"); return ct; } ct->ctch_flag = flag; ct->ctch_mode = mode; ct->ctch_effect = effect; ct->ctch_value = value; return ct; } static struct ctrl * gen_valign(align) char *align; { struct ctrl *ct; if (!(ct = ctlalloc1(CTL_VALIGN))) { yyerror("cannot allocate node (op=VALIGN)"); return ct; } if (!strcmp(align, "center")) ct->cti_value = VL_CENTER; else { if (!strcmp(align, "top")) ct->cti_value = VL_TOP; else { if (!strcmp(align, "bottom")) ct->cti_value = VL_BOTTOM; else { yyerror("%valign center|top|bottom"); ctlfree(ct); return NULL; } } } return ct; } static struct ctrl * gen_area(width, height, xoff, yoff) int width; int height; int xoff; int yoff; { struct ctrl *ct; if (!(ct = ctlalloc1(CTL_AREA))) { yyerror("cannot allocate node (op=AREA)"); return ct; } if (width < 0 || width > 100) width = 100; if (height < 0 || height > 100) height = 100; if (xoff < 0) xoff = (100 - width) / 2; else if (width + xoff > 100) xoff = 100 - width; if (yoff < 0) yoff = (100 - height) / 2; #ifdef notdef /* mgp doesn't check overflow in y axis, anyway. */ else if (height + yoff > 100) yoff = 100 - height; #endif ct->ctar_width = width; ct->ctar_height = height; ct->ctar_xoff = xoff; ct->ctar_yoff = yoff; return ct; } #if 0 static struct ctrl * gen_argsfromnid(op, nid) int op; struct ctrl *nid; { struct ctrl *ct; struct ctrl *p; int siz; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate args node"); return ct; } siz = 0; for (p = nid; p; p = p->ct_next) siz++; ct->cta_argc = siz; ct->cta_argv = malloc((siz + 1) * sizeof(char *)); if (!ct->cta_argv) { yyerror("cannot allocate args table"); return ct; } siz = 0; for (p = nid; p; p = p->ct_next) { ct->cta_argv[siz] = strdup(p->ctc_value); siz++; } ct->cta_argv[siz] = NULL; if (nid) ctlfree(nid); return ct; } #endif static struct ctrl * gen_argsfromstr(op, str, flag) int op; char *str; int flag; { struct ctrl *ct; int siz; char **h; if (!(ct = ctlalloc1(op))) { yyerror("cannot allocate args node"); return ct; } ct->cta_argc = 0; ct->cta_argv = malloc((siz = 16) * sizeof(char *)); /*initial siz*/ ct->cta_flag = flag; if (!ct->cta_argv) { yyerror("cannot allocate args table"); return ct; } for (h = (char **)ct->cta_argv; (*h = strsep((char **)&str, " ")); /*none*/) { if (**h != '\0') { h++; ct->cta_argc++; if (siz < ct->cta_argc + 2) { siz *= 2; ct->cta_argv = realloc(ct->cta_argv, siz * sizeof(char *)); if (!ct->cta_argv) { yyerror("cannot allocate args table"); return ct; } } } } ct->cta_argv[ct->cta_argc] = NULL; return ct; } static void check_xfont(seed, registry) char *seed; char *registry; { int hyphen; char *p; hyphen = 0; for (p = seed; *p; p++) { if (*p == '-') hyphen++; } switch (hyphen) { case 0: case 1: case 2: case XLFD_HYPHEN: break; default: yyerror("invalid XFONT seed <%s>", seed); break; } hyphen = 0; for (p = registry; *p; p++) { if (*p == '-') hyphen++; } switch (hyphen) { case 0: case 1: break; default: yyerror("invalid XFONT registry <%s>", registry); break; } } #if 0 /*YYBISON*/ int yyparse __P((void)); int pcap_parse() { return (yyparse()); } #endif %} %union { int i; double d; char *s; struct ctrl *ct; } %token COMMA NUM DOUBLE ID STR WINSIZ %token KW_NOOP KW_DEFAULT KW_TAB KW_SIZE KW_FORE KW_BACK KW_LEFT KW_CENTER %token KW_RIGHT KW_SHRINK KW_LCUTIN KW_RCUTIN KW_CONT KW_NODEF KW_XFONT %token KW_VFONT KW_IMAGE KW_BIMAGE KW_PAGE KW_HGAP KW_VGAP KW_GAP KW_PAUSE %token KW_PREFIX KW_AGAIN KW_CCOLOR KW_BAR KW_INCLUDE KW_BGRAD KW_TEXT %token KW_LINESTART KW_LINEEND KW_MARK KW_SYSTEM KW_FILTER KW_ENDFILTER %token KW_QUALITY KW_ICON KW_LEFTFILL KW_XSYSTEM KW_VFCAP KW_TFONT KW_TFDIR %token KW_TSYSTEM %token KW_DEFFONT KW_FONT KW_TFONT0 KW_EMBED KW_ENDEMBED KW_NEWIMAGE KW_PSFONT %token KW_CHARSET KW_TMFONT KW_PCACHE KW_TMFONT0 KW_ANIM KW_VALIGN KW_AREA %token KW_OPAQUE %token KW_SUP KW_SUB KW_SETSUP %token KW_M17N %type toplevel %type line defaultline tabline shellline deffontline %type cmd defaultcmd tabcmd deffontcmd %type nid args arg %type NUM %type DOUBLE %type ID STR WINSIZ STRorID %% toplevel: line { root = $$; } | defaultline { root = $$; } | tabline { root = $$; } | shellline { root = $$; } | deffontline { root = $$; } ; line: cmd { $$ = $1; } | cmd COMMA line { $$ = $1; $$->ct_next = $3; } ; defaultline: defaultcmd line { $$ = $1; $$->ct_next = $2; } ; tabline: tabcmd line { $$ = $1; $$->ct_next = $2; } ; deffontline: deffontcmd line { $$ = $1; $$->ct_next = $2; } ; STRorID: STR | ID { yywarn("\"%s\" should be quoted", $1); } ; shellline: KW_SYSTEM STR NUM { $$ = gen_argsfromstr(CTL_SYSTEM, $2, $3); } | KW_SYSTEM STR { $$ = gen_argsfromstr(CTL_SYSTEM, $2, 0); } | KW_XSYSTEM STR NUM { $$ = gen_argsfromstr(CTL_XSYSTEM, $2, $3); } | KW_XSYSTEM STR { $$ = gen_argsfromstr(CTL_XSYSTEM, $2, 0); } | KW_TSYSTEM STR NUM { $$ = gen_argsfromstr(CTL_TSYSTEM, $2, $3); } | KW_TSYSTEM STR { $$ = gen_argsfromstr(CTL_TSYSTEM, $2, 0); } | KW_FILTER STR { $$ = gen_argsfromstr(CTL_FILTER, $2, 0); } | KW_ENDFILTER { $$ = gen_void(CTL_ENDFILTER); } | KW_EMBED STR { $$ = gen_str(CTL_EMBED, $2); } | KW_ENDEMBED STR { $$ = gen_void(CTL_ENDEMBED); } ; nid: STRorID { $$ = gen_str(CTL_NOOP, $1); } | STRorID nid { $$ = gen_str(CTL_NOOP, $1); $$->ct_next = $2; } ; args: arg { $$ = $1; } | arg args { $$ = $1; $$->ct_next = $2; } ; arg: STR { $$ = gen_str(CTL_NOOP, $1); } | ID { $$ = gen_str(CTL_NOOP, $1); } | NUM { char buf[30]; snprintf(buf, sizeof(buf), "%d", $1); $$ = gen_str(CTL_NOOP, buf); } ; cmd: KW_NOOP { $$ = gen_void(CTL_NOOP); } | KW_LEFT { $$ = gen_void(CTL_LEFT); } | KW_LEFTFILL { $$ = gen_void(CTL_LEFTFILL); } | KW_RIGHT { $$ = gen_void(CTL_RIGHT); } | KW_CENTER { $$ = gen_void(CTL_CENTER); } | KW_SHRINK { $$ = gen_void(CTL_SHRINK); } | KW_LCUTIN { $$ = gen_void(CTL_LCUTIN); } | KW_RCUTIN { $$ = gen_void(CTL_RCUTIN); } | KW_CONT { $$ = gen_void(CTL_CONT); } | KW_NODEF { $$ = gen_void(CTL_NODEF); } | KW_PAUSE { $$ = gen_int(CTL_PAUSE, 0); } | KW_AGAIN { $$ = gen_void(CTL_AGAIN); } | KW_MARK { $$ = gen_void(CTL_MARK); } | KW_PAGE { $$ = gen_void(CTL_PAGE); } | KW_SETSUP NUM NUM NUM { $$ = gen_int3(CTL_SETSUP, $2, $3, $4); } | KW_SUP { $$ = gen_void(CTL_SUP); } | KW_SUB { $$ = gen_void(CTL_SUB); } | KW_SIZE NUM { $$ = gen_double_int(CTL_SIZE, $2); } | KW_SIZE DOUBLE { $$ = gen_double(CTL_SIZE, $2); } | KW_HGAP NUM { $$ = gen_int(CTL_HGAP, $2); } | KW_VGAP NUM { $$ = gen_int(CTL_VGAP, $2); } | KW_GAP NUM { $$ = gen_int(CTL_GAP, $2); } | KW_QUALITY NUM { if (!quality_flag) $$ = gen_int(CTL_QUALITY, $2); else $$ = ctlalloc1(CTL_NOOP); } | KW_FORE STRorID { $$ = gen_color(CTL_FORE, $2); } | KW_BACK STRorID { $$ = gen_color(CTL_BACK, $2); } | KW_CCOLOR STRorID { $$ = gen_color(CTL_CCOLOR, $2); } | KW_BGRAD NUM NUM NUM NUM NUM nid { $$ = gen_bgrad($2, $3, $4, $5, $6, $7); } | KW_BGRAD NUM NUM NUM NUM NUM { $$ = gen_bgrad($2, $3, $4, $5, $6, (struct ctrl *)NULL); } | KW_BGRAD NUM NUM NUM NUM { $$ = gen_bgrad($2, $3, $4, $5, 1, (struct ctrl *)NULL); } | KW_BGRAD NUM NUM NUM { $$ = gen_bgrad($2, $3, $4, 0, 1, (struct ctrl *)NULL); } | KW_BGRAD NUM NUM { $$ = gen_bgrad($2, $3, DEFAULT_GRADCOLORS, 0, 1, (struct ctrl *)NULL); } | KW_BGRAD NUM { $$ = gen_bgrad($2, 100, DEFAULT_GRADCOLORS, 0, 1, (struct ctrl *)NULL); } | KW_BGRAD { $$ = gen_bgrad(100, 100, DEFAULT_GRADCOLORS, 0, 1, (struct ctrl *)NULL); } | KW_XFONT STRorID { char *p; if (strncmp($2, "medium", 6) == 0 || strncmp($2, "bold", 4) == 0) { /* for backward compatibility */ p = malloc(strlen($2) + 1 + 6); sprintf(p, "times-%s", $2); } else p = $2; check_xfont(p, "iso8859-1"); /* lexical check */ $$ = gen_str2(CTL_XFONT2, p, "iso8859-1"); } | KW_XFONT STRorID STRorID { check_xfont($2, $3); /* lexical check */ $$ = gen_str2(CTL_XFONT2, $2, $3); } | KW_BIMAGE STRorID { $$ = gen_image(CTL_BIMAGE, $2, 0, 0, 0, 0); } | KW_BIMAGE STRorID WINSIZ { int x, y; x = atoi($3); y = atoi(strchr($3, 'x') + 1); $$ = gen_image(CTL_BIMAGE, $2, 0, x, y, 2); } | KW_VFONT STRorID { #ifdef VFLIB $$ = gen_str(CTL_VFONT, $2); #else $$ = gen_str(CTL_NOOP, $2); yywarn("directive \"vfont\" not supported " "in this configuration"); #endif } | KW_PSFONT STRorID { $$ = gen_str2(CTL_PSFONT, $2, "iso8859-1"); } | KW_TFONT STRorID { #ifdef FREETYPE $$ = gen_str2(CTL_TFONT, $2, "iso8859-1"); #else $$ = gen_str2(CTL_NOOP, $2, "iso8859-1"); yywarn("directive \"tfont\" not supported " "in this configuration"); #endif } | KW_TFONT STRorID STRorID { #ifdef FREETYPE $$ = gen_str2(CTL_TFONT, $2, $3); #else $$ = gen_str2(CTL_NOOP, $2, $3); yywarn("directive \"tfont\" not supported " "in this configuration"); #endif } | KW_TMFONT STRorID { #ifdef FREETYPE $$ = gen_str(CTL_TMFONT, $2); #else $$ = gen_str(CTL_NOOP, $2); yywarn("directive \"tmfont\" not supported " "in this configuration"); #endif } | KW_TFONT0 STRorID { #ifdef FREETYPE $$ = gen_str(CTL_TFONT0, $2); #else $$ = gen_str(CTL_NOOP, $2); yywarn("directive \"tfont0\" not supported " "in this configuration"); #endif } | KW_TMFONT0 STRorID { #ifdef FREETYPE_CHARSET16 $$ = gen_str(CTL_TMFONT0, $2); #else $$ = gen_str(CTL_NOOP, $2); yywarn("directive \"tmfont0\" not supported " "in this configuration"); #endif } | KW_INCLUDE STRorID { $$ = gen_str(CTL_INCLUDE, $2); } | KW_PREFIX ID { char *p; $$ = gen_str(CTL_PREFIX, $2); for (p = $$->ctc_value; *p; p++) { if (*p == '_') *p = ' '; } } | KW_PREFIX STR { $$ = gen_str(CTL_PREFIX, $2); } | KW_PREFIX NUM { $$ = gen_double_int(CTL_PREFIXN, $2); } | KW_PREFIX DOUBLE { $$ = gen_double(CTL_PREFIXN, $2); } | KW_NEWIMAGE args { $$ = gen_newimage($2); } | KW_IMAGE STRorID WINSIZ { int x, y; x = atoi($3); y = atoi(strchr($3, 'x') + 1); $$ = gen_image(CTL_IMAGE, $2, 0, x, y, 2); } | KW_IMAGE STRorID NUM WINSIZ { int x, y; x = atoi($4); y = atoi(strchr($4, 'x') + 1); $$ = gen_image(CTL_IMAGE, $2, $3, x, y, 2); } | KW_IMAGE STRorID NUM NUM NUM NUM { $$ = gen_image(CTL_IMAGE, $2, $3, $4, $5, $6 ? 1 : 0); } | KW_IMAGE STRorID NUM NUM NUM { $$ = gen_image(CTL_IMAGE, $2, $3, $4, $5, 0); } | KW_IMAGE STRorID NUM NUM { $$ = gen_image(CTL_IMAGE, $2, $3, $4, 0, 0); } | KW_IMAGE STRorID NUM { $$ = gen_image(CTL_IMAGE, $2, $3, 0, 0, 0); } | KW_IMAGE STRorID { $$ = gen_image(CTL_IMAGE, $2, 0, 0, 0, 0); } | KW_BAR STRorID NUM NUM NUM { $$ = gen_bar($2, $3, $4, $5); } | KW_BAR STRorID NUM NUM { $$ = gen_bar($2, $3, $4, 100); } | KW_BAR STRorID NUM { $$ = gen_bar($2, $3, 0, 100); } | KW_BAR STRorID { $$ = gen_bar($2, 10, 0, 100); } | KW_BAR { $$ = gen_bar("black", 10, 0, 100); } | KW_ICON STR STRorID NUM { $$ = gen_icon($2, $3, $4); } | KW_ICON ID STRorID NUM { $$ = gen_icon($2, $3, $4); } | KW_VFCAP STR { #ifdef VFLIB $$ = gen_str(CTL_VFCAP, $2); #else $$ = gen_str(CTL_NOOP, $2); yywarn("directive \"vfcap\" not supported " "in this configuration"); #endif } | KW_TFDIR STR { #ifdef FREETYPE $$ = gen_str(CTL_TFDIR, $2); #else $$ = gen_str(CTL_NOOP, $2); yywarn("directive \"tfdir\" not supported " "in this configuration"); #endif } | KW_FONT STR { $$ = gen_str(CTL_FONT, $2); } | KW_TEXT STR { $$ = gen_str(CTL_TEXT, $2); } /*easter egg*/ | KW_CHARSET STR { $$ = gen_str(CTL_CHARSET, $2); } | KW_AREA NUM NUM { $$ = gen_area($2, $3, -1, -1); } | KW_AREA NUM NUM NUM NUM { $$ = gen_area($2, $3, $4, $5); } | KW_PCACHE NUM NUM NUM NUM { $$ = gen_pcache($2, $3, $4, $5); } | KW_PCACHE NUM { $$ = gen_pcache($2, 0, 0, 0); } | KW_ANIM STRorID { #ifdef MNG $$ = gen_str(CTL_ANIM, $2); chkfile($2); #else $$ = gen_str(CTL_NOOP, $2); yywarn("directive \"anim\" not supported " "in this configuration"); #endif } | KW_M17N STRorID STRorID { #ifdef USE_M17N $$ = gen_str2(CTL_M17N, $2, $3); #else $$ = gen_str2(CTL_NOOP, $2, $3); yywarn("directive \"m17n\" not supported " "in this configuration"); #endif } | KW_VALIGN STRorID { $$ = gen_valign($2); } | KW_OPAQUE NUM { $$ = gen_int(CTL_OPAQUE, $2); } ; tabcmd: KW_TAB NUM { $$ = gen_int(CTL_TAB, $2); } | KW_TAB ID { $$ = gen_str(CTL_TAB, $2); } ; defaultcmd: KW_DEFAULT NUM { $$ = gen_int(CTL_DEFAULT, $2); } ; deffontcmd: KW_DEFFONT STR { $$ = gen_str(CTL_DEFFONT, $2); } ; enbedded_file: | ; %% kit/install-sh010075500237450000000000000112430664430355400131640ustar nishidawheel#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. # # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" tranformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 kit/keywords.pl010064400237450000000000000003670672727315200133730ustar nishidawheel@keywords = (); die if (@ARGV != 1); open(IN, "< $ARGV[0]") || die; while () { next if (! /^\/\*CTL\*\//); next if (! /CTL_([A-Z0-9]+),/); $t = $1; $t =~ tr/A-Z/a-z/; push(@keywords, $t); } close(IN); print join(' ', @keywords) . "\n"; kit/m17n.c010064400237450000000000000517561075453157200121230ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * Copyright (C) 2005, 2008 * National Institute of Advanced Industrial Science and Technology (AIST) * Registration Number H16PRO276 * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: m17n.c,v 1.11 2008/02/13 09:08:10 nishida Exp $ */ #ifdef USE_M17N #include "mgp.h" #ifdef USE_SETLOCALE #ifdef HAVE_LOCALE_H #include #endif #endif #ifdef HAVE_FONTCONFIG_FONTCONFIG_H /* This is to parse Xft font name pattern. */ #include #endif /* Prototypes for internal functions. They start with "M17N__". */ static int M17N__line_break __P ((MText *, int, int, int ,int, int)); static void M17N__format_line __P ((int, int, int *, int *)); static MText *M17N__gen_mtext __P ((u_char *)); static void M17N__add_font_to_fontset __P ((MFont *)); static MFont *M17N__get_font __P ((char *, char *)); /* The following two variables are set by M17N_draw_string and referred by M17N__format_line (). */ /* Width remaining for the first line of a drawning text. */ static int first_width; /* Width of the currently drawing area. */ static int area_width; static MDrawControl control; static MFontset *fontset; static MFace *faces[2]; static MSymbol languages[2]; /* M-text containing a single space. It is used to get normal ascent/descent of an ASCII font selected for the current set of faces. */ static MText *space; static MSymbol Miso8859_1, Municode_bmp, Mjisx0208, Mgb2312, Mksc5601; static MSymbol Mlatin, Mhan, Mhangul, Mkatakana, Mhiragana; static MSymbol Mzh, Mja, Mko; static MSymbol Miso_8859_1, Mutf_8, Miso_2022_7bit; static int kinsoku_range [][2] = { {0x3041, 0x30FF}, /* Kana */ {0x2E80, 0x2FDF}, /* radical */ {0x3400, 0x4DB5}, /* CJK Ideograph Extention A */ {0x4E00, 0x9FAF}, /* CJK Ideograph */ {0XF900, 0xFAFF}, /* CJK COMPATIBILITY IDEOGRAPH */ {0X20000, 0x2A6D6}, /* CJK Ideograph Extention B */ {0x2F800, 0x2FA1D} /* CJK COMPATIBILITY IDEOGRAPH */ }; static int kinsoku_list [] = { /* UNICODE */ 0x2019, 0x201A, 0x201D, 0x201E, 0x2032, 0x2033, 0x2034, 0x203A, 0x203C, 0x203D, 0x2046, 0x2047, 0x2048, 0x2049, 0x204D, 0x3000, 0x3001, 0x3002, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015, 0x3017, 0x3018, 0x309B, 0x309C, 0x309D, 0x309E, 0x30FD, 0x30FD, 0xFF01, 0xFF09, 0xFF0C, 0xFF0E, 0xFF1A, 0xFF1B, 0xFF1F, 0xFF3D, 0xFF5D, 0xFF60, 0xFF61, 0xFF63, 0xFF64, /* JISX208 */ 0x00A7, 0x00B0, 0x2018, 0x201C, 0x2032, 0x2033, 0x2103, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016, 0xFF02, 0xFF08, 0xFF20, 0xFF3B, 0xFF5B }; static MCharTable *kinsoku_table; static MSymbol Mkinsoku; /* Find a linebreak position. Set in control.line_break */ static int M17N__line_break (mt, pos, from, to, line, y) MText *mt; int pos, from, to; int line, y; { int c, i = 0, opos = pos; c = mtext_ref_char(mt, pos); if (mchartable_lookup(kinsoku_table, c) == Mt) return pos; while(pos != from){ if (i ++ > 10) return opos; /* for stupidly long line */ pos --; c = mtext_ref_char(mt, pos); if (c < 256 && isspace(c)) return pos +1; if (mchartable_lookup(kinsoku_table, c) == Mt) return pos; } return pos; } /* Decide the width and indentation of the LINEth line. Set in control.format. */ static void M17N__format_line(line, y, indent, width) int line, y, *indent, *width; { *width = line == 0 ? first_width : area_width; *indent = 0; } /* Return an M-text generated from the byte sequence at P. */ static MText * M17N__gen_mtext (p) u_char *p; { MSymbol coding; MText *mt = 0; int i, len = strlen ((char *) p); if (len == 0) return NULL; if (!mt && mgp_charset[0] != '\0') { coding = mconv_resolve_coding (msymbol (mgp_charset)); if (coding) mt = mconv_decode_buffer (coding, p, len); } if (strchr ((char *) p, '\033')) { /* Try ISO-2022 encoding. */ coding = mconv_resolve_coding (Miso_2022_7bit); if (coding) mt = mconv_decode_buffer (coding, p, len); if (mt) { int len = mtext_len (mt); int pos = 0, to; for (pos = 0; pos < len; pos = to) if (mtext_prop_range (mt, Mcharset, pos, NULL, &to, 0)) { MSymbol cs = mtext_get_prop (mt, pos, Mcharset); char *name = msymbol_name (cs); MSymbol lang = (strncmp (name, "jis", 3) == 0 ? Mja : strncmp (name, "gb", 2) == 0 ? Mzh : strncmp (name, "ksc", 3) == 0 ? Mko : Mnil); if (lang != Mnil) mtext_put_prop (mt, pos, to, Mlanguage, lang); } } } if (!mt) { /* Check ASCII only. */ for (i = 0; i < len; i++) if (p[i] >= 0x80) break; if (i == len) mt = mtext_from_data (p, len, MTEXT_FORMAT_US_ASCII); } if (!mt) { /* Try UTF-8. */ coding = mconv_resolve_coding (Mutf_8); if (coding) mt = mconv_decode_buffer (coding, p, len); } #ifdef USE_SETLOCALE #ifdef HAVE_LOCALE_H if (!mt){ /* Try the encoding of the current locale. */ mt = mconv_decode_buffer (Mnil, p, len); } #endif #endif if (!mt) { /* XXX: wrong encoding, fall back to ISO-8859-1 */ mt = mconv_decode_buffer (Miso_8859_1, p, len); } if (!mt) { /* Unknown encoding */ fprintf(stderr, "unexpected byte sequence found.\n"); fprintf(stderr, " (expecting: %s (by %%charset), iso-2022-7bit, utf-8, default encoding of locale)\n", mgp_charset); exit(1); } return mt; } /* Return a font matching SEED and REGISTRY. */ static MFont * M17N__get_font (seed, registry) char *seed; char *registry; { static MPlist *font_list; MPlist *plist; MSymbol sym_seed, sym_registry; MSymbol family, weight, slant; MFont *font; char *p; if (! font_list) font_list = mplist (); sym_seed = msymbol (seed); if (strncmp (registry, "iso8859", 7) == 0) sym_registry = msymbol (registry); else if (strncmp (registry, "jisx0208", 8) == 0) sym_registry = Mjisx0208; else if (strncmp (registry, "gb2312", 6) == 0) sym_registry = Mgb2312; else if (strncmp (registry, "ksc5601", 7) == 0) sym_registry = Mksc5601; else sym_registry = msymbol (registry); for (plist = mplist_find_by_key (font_list, sym_seed); plist; plist = mplist_find_by_key (mplist_next (plist), sym_seed)) { font = mplist_value (plist); if (mfont_get_prop (font, Mregistry) == sym_registry) return font; } family = weight = slant = Mnil; if ((p = strchr (seed, '-')) != NULL) { /* Should be XLFD of format FAMILY-WEIGHT[-SLANT] */ char *copy = alloca (strlen (seed) + 1); strcpy (copy, seed); copy[p - seed] = '\0'; family = msymbol (copy); copy += p + 1 - seed; p = strchr (copy, '-'); if (! p) weight = msymbol (copy); else { *p = 0; weight = msymbol (copy); slant = msymbol (p + 1); } } else if (strchr (seed, ':')) { /* Should be Xft (i.e. Fontconfig) pattern. */ #ifdef HAVE_FONTCONFIG_FONTCONFIG_H FcPattern *pat = FcNameParse ((FcChar8 *) seed); FcChar8 *p; int i; if (pat) { if (FcPatternGetString (pat, FC_FAMILY, 0, &p) == FcResultMatch) family = msymbol ((char *) p); if (FcPatternGetInteger (pat, FC_WEIGHT, 0, &i) == FcResultMatch) weight = (i < FC_WEIGHT_EXTRALIGHT ? msymbol ("ultralight") : i < FC_WEIGHT_LIGHT ? msymbol ("extralight") : i < FC_WEIGHT_REGULAR ? msymbol ("light") : i < FC_WEIGHT_MEDIUM ? msymbol ("regular") : i < FC_WEIGHT_DEMIBOLD ? msymbol ("medium") : i < FC_WEIGHT_BOLD ? msymbol ("demibold") : i < FC_WEIGHT_EXTRABOLD ? msymbol ("bold") : i < FC_WEIGHT_ULTRABOLD ? msymbol ("extrabold") : i < FC_WEIGHT_BLACK ? msymbol ("ultrabold") : msymbol ("black")); else weight = msymbol ("medium"); if (FcPatternGetInteger (pat, FC_SLANT, 0, &i) == FcResultMatch) slant = (i < FC_SLANT_ITALIC ? msymbol ("r") : i < FC_SLANT_OBLIQUE ? msymbol ("i") : msymbol ("o")); else slant = msymbol ("r"); FcPatternDestroy (pat); } else #endif /* Treat the seed as family name. */ family = msymbol (seed); } else /* Treat the name as family name. */ family = msymbol (seed); font = mfont (); mfont_put_prop (font, Mfamily, family); mfont_put_prop (font, Mweight, weight); mfont_put_prop (font, Mstyle, slant); mfont_put_prop (font, Mregistry, sym_registry); mplist_push (font_list, sym_seed, font); return font; } /* Pre-define the font set in CP. */ static void M17N__add_font_to_fontset (font) MFont *font; { MSymbol family, registry; MPlist *plist, *pl; static MPlist *registered_list; family = mfont_get_prop (font, Mfamily); registry = mfont_get_prop (font, Mregistry); plist = NULL; if (! registered_list) registered_list = mplist (); else if ((plist = mplist_get (registered_list, family)) && (pl = mplist_get (plist, registry))) return; /* This font is not yet registered. */ if (! plist) plist = mplist (); mplist_push (plist, registry, Mt); mplist_push (registered_list, family, plist); if (registry == Miso8859_1) { /* This may be a TTF, in which case, we may be able to use it for any scripts. */ plist = mfontset_lookup (fontset, Mt, Mnil, Mnil); } else { plist = mplist (); if (registry == Mjisx0208) { mplist_put (plist, Mhan, NULL); mplist_put (plist, Mhiragana, NULL); mplist_put (plist, Mkatakana, NULL); } else if (registry == Mgb2312) mplist_put (plist, Mhan, NULL); else if (registry == Mksc5601) mplist_put (plist, Mhangul, NULL); else if (strncmp (msymbol_name (registry), "iso8859-", 8) == 0) mplist_put (plist, Mlatin, NULL); } font = mfont (); mfont_put_prop (font, Mfamily, family); for (pl = plist; mplist_key (pl) != Mnil; pl = mplist_next (pl)) { MSymbol script = mplist_key (pl); MPlist *p = mfontset_lookup (fontset, script, Mt, Mnil); MPlist *p0; for (p0 = p; mplist_key (p0) != Mnil; p0 = mplist_next (p0)) { MSymbol lang = mplist_key (p0); mfont_put_prop (font, Mregistry, registry); if (registry == Miso8859_1) { /* Add this font only for Latin script, and add unicode version of this font for any scripts. */ if (script == Mlatin) mfontset_modify_entry (fontset, script, lang, Mnil, font, Mnil, 1); mfont_put_prop (font, Mregistry, Municode_bmp); } mfontset_modify_entry (fontset, script, lang, Mnil, font, Mnil, 1); } m17n_object_unref (p); } m17n_object_unref (plist); mfontset_modify_entry (fontset, Mnil, Mnil, Mnil, font, Mnil, 1); if (registry == Miso8859_1) { mfont_put_prop (font, Mregistry, Municode_bmp); mfontset_modify_entry (fontset, Mnil, Mnil, Mnil, font, Mnil, 1); } } /* Internal API (functions called from the other files) */ void M17N_init() { int i; M17N_INIT(); #ifdef USE_SETLOCALE #ifdef HAVE_LOCALE_H mlocale_set (LC_CTYPE, NULL); #endif #endif space = mtext_from_data (" ", 1, MTEXT_FORMAT_US_ASCII); fontset = mfontset ("default"); memset (&control, 0, sizeof control); control.two_dimensional = 1; control.enable_bidi = 1; control.ignore_formatting_char = 1; control.disable_caching = 0; control.max_line_width = 0; control.anti_alias = 1; control.format = M17N__format_line; control.line_break = M17N__line_break; /* Generate kinsoku_char_table. */ Mkinsoku = msymbol ("kinsoku"); kinsoku_table = mchartable (Msymbol, Mnil); for (i = 0; i < (sizeof(kinsoku_range) / sizeof(kinsoku_range[0])); i++) mchartable_set_range (kinsoku_table, kinsoku_range[i][0], kinsoku_range[i][1], Mt); for (i = 0; i < (sizeof kinsoku_list / sizeof (int)); i++) mchartable_set (kinsoku_table, kinsoku_list[i], Mkinsoku); Miso8859_1 = msymbol ("iso8859-1"); Municode_bmp = msymbol ("unicode-bmp"); Mjisx0208 = msymbol ("jisx0208.1983-0"); Mgb2312 = msymbol ("gb2312.1980-0"); Mksc5601 = msymbol ("ksc5601.1987-0"); Mlatin = msymbol ("latin"); Mhan = msymbol ("han"); Mhangul = msymbol ("hangul"); Mkatakana = msymbol ("katakana"); Mhiragana = msymbol ("hiragana"); Mzh = msymbol ("zh"); Mja = msymbol ("ja"); Mko = msymbol ("ko"); Mutf_8 = msymbol ("utf-8"); Miso_8859_1 = msymbol ("iso-8859-1"); Miso_2022_7bit = msymbol ("iso-2022-7bit"); } void M17N_fini(void) { m17n_object_unref (kinsoku_table); if (fontset) m17n_object_unref (fontset); if (faces[0]) m17n_object_unref (faces[0]); if (faces[1]) m17n_object_unref (faces[1]); if (space) m17n_object_unref (space); M17N_FINI (); } /* Set font-oriented properties (family, weight, slant) of the current face to what specified in SEED. */ void M17N_set_font (seed, registry) char *seed; char *registry; { MFont *font = M17N__get_font (seed, registry); MSymbol reg; MFace *face; M17N__add_font_to_fontset (font); reg = mfont_get_prop (font, Mregistry); if (reg != Miso8859_1) return; face = faces[caching]; if (! face) face = faces[caching] = mface (); mface_put_prop (face, Mfoundry, (MSymbol) mfont_get_prop (font, Mfoundry)); mface_put_prop (face, Mfamily, (MSymbol) mfont_get_prop (font, Mfamily)); mface_put_prop (face, Mweight, mfont_get_prop (font, Mweight)); mface_put_prop (face, Mstyle, mfont_get_prop (font, Mstyle)); mface_put_prop (face, Mstretch, mfont_get_prop (font, Mstretch)); mface_put_prop (face, Madstyle, mfont_get_prop (font, Madstyle)); } void M17N_set_color (color) u_long color; { MFace *face = faces[caching]; char color_string[20]; XColor xcolor; if (! faces[caching]) face = faces[caching] = mface (); xcolor.pixel = color; XQueryColor (display, colormap, &xcolor); sprintf (color_string, "#%04X%04X%04X", xcolor.red, xcolor.green, xcolor.blue); mface_put_prop (face, Mforeground, msymbol (color_string)); } /* Calculate the extents of text pointed by CP and update STATE. */ void M17N_draw_string (state, cp) struct render_state *state; struct ctrl *cp; { MText *mt; static MFrame *drawframe; static MPlist *plist; MDrawGlyphInfo info; MDrawMetric rect_sp, rect; int ascent = 0, descent = 0; int nchars; int i, c; int leftfillpos = state->leftfillpos; if (cp->ct_flag == 0) { /* cp->ctc_value points a raw byte sequence. */ mt = M17N__gen_mtext ((u_char *) cp->ctc_value); if (mt) mtext_put_prop (mt, 0, 1, msymbol ("leftfillpos"), (void *) leftfillpos); cp->ctc_value = (char *) mt; cp->ct_flag = 1; } else { /* cp->ctc_valus points an M-text. */ mt = (MText *) cp->ctc_value; if (mt) leftfillpos = (int) mtext_get_prop (mt, 0, msymbol ("leftfillpos")); } if (! mt) return; nchars = mtext_len (mt); if (! plist) { plist = mplist (); mplist_add (plist, Mdisplay, display); drawframe = mframe (plist); } if (! mtext_get_prop (mt, 0, Mface)) { MFace *face; if (! faces[caching]) faces[caching] = mface (); face = mface_copy (faces[caching]); mface_put_prop (face, Msize, (void *) (char_size[caching] * 10)); mtext_push_prop (mt, 0, nchars, Mface, face); if (languages[caching]) mtext_push_prop (mt, 0, nchars, Mlanguage, languages[caching]); m17n_object_unref (face); } /* Compare the normal ascent/descent and the physical ascent/descent of this M-text, and use the bigger ones. */ mdraw_text_extents(drawframe, space, 0, 1, &control, NULL, NULL, &rect_sp); rect_sp.height += rect_sp.y; /* calculate descent */ area_width = state->width - leftfillpos; first_width = area_width - state->linewidth; mdraw_glyph_info (drawframe, mt, 0, 0, &control, &info); if (info.line_to == nchars) { /* All text can be drawn on the current line. */ mdraw_text_extents (drawframe, mt, 0, nchars, &control, NULL, NULL, &rect); rect.height += rect.y; /* calculate descent */ ascent = rect_sp.y < rect.y ? - rect_sp.y : - rect.y; descent = rect_sp.height > rect.height ? rect_sp.height : rect.height; for (i = 0; state->brankline && i < nchars; i++) if ((c = mtext_ref_char (mt, i)) != ' ' && c != '\t') state->brankline = 0; draw_line_itemsize(state, ascent, descent, 0); obj_new_mtext (state, state->linewidth, state->charoff, mt, 0, nchars, drawframe, ascent, descent); state->linewidth += rect.width; } else { int i, c; MDrawGlyphInfo info2; /* We need a line break. Check if there's a room for at least one fragment on the current line. */ /* Skip the leading spaces. */ for (i = 0; i < nchars && mtext_ref_char (mt, 0) == ' '; i++); for (; i < nchars; i++) { if ((c = mtext_ref_char (mt, i)) == ' ') break; else if (mchartable_lookup (kinsoku_table, c) == Mt) { i++; break; } } mdraw_glyph_info (drawframe, mt, 0, i - 1, &control, &info2); if (info2.line_from > 0) { /* No room even for one fragment. Break the line before drawing anything. */ draw_line_end (state); draw_line_start (state); state->linewidth = leftfillpos; first_width = area_width; mdraw_clear_cache (mt); mdraw_glyph_info (drawframe, mt, 0, 0, &control, &info); } while (1) { for (i = info.line_to; i > info.line_from; i--) if ((c = mtext_ref_char (mt, i - 1)) != ' ' && c != '\t') { state->brankline = 0; break; } if (i == info.line_from) i = info.line_to; mdraw_text_extents (drawframe, mt, info.line_from, i, &control, NULL, NULL, &rect); rect.height += rect.y; /* calculate descent */ ascent = rect_sp.y < rect.y ? - rect_sp.y : - rect.y; descent = rect_sp.height > rect.height ? rect_sp.height : rect.height; draw_line_itemsize (state, ascent, descent, 0); obj_new_mtext (state, state->linewidth, state->charoff, mt, info.line_from, i, drawframe, ascent, descent); state->linewidth += rect.width; if (info.line_to >= nchars) break; draw_line_end (state); draw_line_start (state); state->linewidth = leftfillpos; mdraw_glyph_info (drawframe, mt, info.line_to, info.line_to, &control, &info); } } } /* Draw the M-text stored in OBJ on TARGET at the coordinate (X Y). */ void M17N_draw_object(obj, target, x, y) struct render_object *obj; Drawable target; int x, y; { control.format = NULL; mdraw_text_with_control ( obj->data.m17ntext.drawframe, (MDrawWindow) target, x, y, obj->data.m17ntext.mt, obj->data.m17ntext.from, obj->data.m17ntext.to, &control); control.format = M17N__format_line; } /* Update faces[caching] or languages[caching] according to KEY and VALUE. */ void M17N_process_direc(key, value) char *key, *value; { MSymbol key_sym = msymbol (key); MFace *face = faces[caching]; if (! faces[caching]) face = faces[caching] = mface (); if (key_sym == Mfoundry || key_sym == Mfamily || key_sym == Mweight || key_sym == Mstyle || key_sym == Mstretch || key_sym == Madstyle) mface_put_prop (face, key_sym, value ? msymbol (value) : Mnil); else if (key_sym == Mfontset) mface_put_prop (face, key_sym, value ? mfontset (value) : fontset); else if (key_sym == Mratio) mface_put_prop (face, key_sym, value ? (void *) atoi (value) : (void *) 1); else if (key_sym == Mlanguage) languages[caching] = value ? msymbol (value) : Mnil; } void M17N_write_text (txt, cp) FILE *txt; struct ctrl *cp; { MText *mt; if (! cp->ctc_value) return; if (cp->ct_flag == 0) { /* cp->ctc_value points a raw byte sequence. */ mt = M17N__gen_mtext ((u_char *) cp->ctc_value); cp->ctc_value = (char *) mt; cp->ct_flag =1; } else { /* cp->ctc_valus points an M-text. */ mt = (MText *) cp->ctc_value; } if (mt) mconv_encode_stream (Mcoding_utf_8, mt, txt); } #endif /* USE_M17N */ kit/mgp.c010064400237450000000000000755131075457573200121270ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: mgp.c,v 1.154 2008/02/13 14:16:58 nishida Exp $ */ static char *mgp_version = "1.13a (20080214)"; #include "mgp.h" #ifdef USE_SETLOCALE #ifdef HAVE_LOCALE_H #include #endif #endif #include #ifdef TTY_KEYINPUT #include #endif Window plwin[MAXPAGE]; Pixmap maskpix; XFontStruct *plfs; XFontStruct *plkfs; u_int pg_mode; u_long pl_fh, pl_fw; time_t t_start; u_int t_fin; u_int tbar_mode; int zoomin = 0; static int rakugaki = 0; static int rakugaki_x = -1; static int rakugaki_y = -1; static int rakugaki_color = 0; static XColor rakugaki_fore; static XColor rakugaki_back; static char *rakugaki_forecolors[] = { "red", "green", "blue", "yellow", "black", "white", }; static char *rakugaki_backcolors[] = { "black", "black", "black", "black", "gray", "gray", }; static int demointerval = 0; /* XXX define option for this */ u_long depth_mask; char *back_clname = DEFAULT_BACK; #ifdef VFLIB char *vfcap_name = VFCAP; #endif #ifdef FREETYPE char *freetypefontdir = FREETYPEFONTDIR; char *freetypefont0 = NULL; /* font name to be used as a last resort */ char *freetypemfont0 = NULL; /* font name to be used as a last resort */ int unicode_map[65536]; #endif int latin_unicode_map[3][256]; /* currently we have iso8859-2-4 map */ static char *tsfile = NULL; static char *dumpdir = NULL; char *gsdevice = DEFAULT_GSDEV; char *htmlimage; static time_t srctimestamp; static char *xgeometry = NULL; /*default: full screen*/ #ifdef TTY_KEYINPUT static struct termios saveattr, curattr; volatile int ttykey_enable; #endif static pid_t mypid; static void genhtml __P((int)); static void mgp_usage __P((char *)); static void mgp_show_version __P((char *)); static void beep __P((void)); static void main_loop __P((u_int)); static void rakugaki_update __P((struct render_state *, XEvent *)); static void rakugaki_updatecolor __P((Cursor)); static RETSIGTYPE waitkids __P((int)); static int wantreload __P((void)); /*image*/ extern char *expandPath __P((char *)); #ifdef TTY_KEYINPUT static void susp(int sig) { sigset_t mask; if (ttykey_enable) { if (sig == SIGTTIN || sig == SIGTTOU) { ttykey_enable = 0; return; } tcsetattr(0, TCSANOW, &saveattr); } signal(sig, SIG_DFL); sigemptyset(&mask); sigaddset(&mask, sig); sigprocmask(SIG_UNBLOCK, &mask, NULL); kill(mypid, sig); /* resumed */ signal(sig, susp); if (ttykey_enable) { if (tcgetpgrp(0) != mypid) ttykey_enable = 0; else tcsetattr(0, TCSANOW, &curattr); } } void try_enable_ttykey() { if (ttykey_enable) return; if (tcgetpgrp(0) != mypid) return; ttykey_enable = 1; signal(SIGTTIN, susp); signal(SIGTTOU, susp); signal(SIGTSTP, susp); curattr = saveattr; curattr.c_lflag |= ISIG; curattr.c_lflag &= ~(ECHO|ICANON|IEXTEN); curattr.c_iflag &= ~(IXON|IXOFF); curattr.c_cc[VMIN] = 1; curattr.c_cc[VTIME] = 0; /* This call might cause STGTTOU */ tcsetattr(0, TCSANOW, &curattr); } #endif void cleanup(int sig) { sigset_t mask; #ifdef USE_M17N if (! (mgp_flag & FL_NOM17N)) /* finalize M17N library */ M17N_fini(); #endif cleandir(); /* clean up embedded files and its dir */ #ifdef TTY_KEYINPUT if (ttykey_enable) tcsetattr(0, TCSANOW, &saveattr); #endif signal(SIGTERM, SIG_IGN); kill(0, SIGTERM); /*kill all of my kids*/ if (tsfile) unlink(tsfile); if (sig > 0) { signal(sig, SIG_DFL); sigemptyset(&mask); sigaddset(&mask, sig); sigprocmask(SIG_UNBLOCK, &mask, NULL); kill(mypid, sig); } finish_win(); /* finish X connection */ exit(-sig); } int main(argc, argv) int argc; char **argv; { int i, j; /* counters */ int tmp_argc; /* number of current arguments */ char **tmp_argv; /* manipulated 'argv' */ int opt; extern char *optarg; extern int optind; char *progname; int start_page = 1; char buf[BUFSIZ], *p, *p2; extern char *Paths[]; extern int NumPaths; #ifdef VFLIB char *vfont_name = VFONT; #endif char *ep; #ifdef USE_SETLOCALE setlocale(LC_CTYPE, ""); #endif progname = argv[0]; /* secure by default. If you need fork/exec, use -U */ mgp_flag |= FL_NOFORK; if ((p = getenv("MGPWDIR")) != NULL) { mgpwdir = p; } /* * check for the argument '--title' to set the window's title: * go through the whole 'argv' and cut off this option since it * will not be accepted by getopt() * default title is 'MagicPoint' */ tmp_argv=(char**)malloc(argc*sizeof(char*)); tmp_argc=argc; i=j=0; while (i < argc) { if (strcmp(argv[i], "--title") == 0) { tmp_argc--; if (++i < argc) { mgp_wname=strdup(argv[i]); tmp_argc--; } } else tmp_argv[j++]=strdup(argv[i]); i++; } /* set title to default if not set by user */ if (argc-1 <= tmp_argc) mgp_wname=strdup("MagicPoint"); argv=tmp_argv; argc=tmp_argc; #define ACCEPTOPTS "Bd:vVob:c:eg:f:hlGp:qt:Q:PSUT:D:CORw:X:x:nF:E:" while ((opt = getopt(argc, argv, ACCEPTOPTS)) != -1) { #undef ACCEPTOPTS switch (opt) { case 'B': mgp_flag |= FL_BIMAGE; break; case 'd': mgp_flag |= FL_DEMO; if (isdigit(optarg[0])) demointerval = atoi(optarg); else optind --; break; case 'V': mgp_flag |= FL_VERBOSE; verbose++; break; case 'l': mgp_flag |= FL_OUTLINE; break; case 'G': pg_mode = 1; break; case 'o': mgp_flag |= FL_OVER; break; #ifdef VFLIB case 'c': vfcap_name = optarg; break; case 'f': vfont_name = optarg; break; #endif /*VFLIB*/ case 'b': back_clname = optarg; break; case 'p': ep = NULL; start_page = atoi(optarg); if (start_page <= 0) { mgp_usage(progname); /*NOTREACHED*/ } break; case 'e': mgp_flag |= FL_GLYPHEDGE; break; case 'g': xgeometry = optarg; mgp_flag |= FL_OVER; /* -g implies -o */ break; case 'q': mgp_flag |= FL_NOBEEP; break; case 't': t_fin = atoi(optarg); tbar_mode = 1; break; case 'Q': b_quality[caching] = atoi(optarg); quality_flag = 1; break; case 'P': parse_debug++; break; case 'S': mgp_flag |= FL_NOFORK; break; case 'U': mgp_flag &= ~FL_NOFORK; break; case 'T': tsfile = optarg; break; case 'D': dumpdir = optarg; break; case 'C': mgp_flag |= FL_PRIVATE; break; case 'O': mgp_flag |= FL_NODECORATION | FL_OVER; /* -O implies -o */ break; case 'R': mgp_flag |= FL_NOAUTORELOAD; break; case 'w': mgpwdir = optarg; break; case 'X': gsdevice = optarg; break; case 'x': if (strcmp(optarg, "vflib") == 0) mgp_flag |= FL_NOVFLIB; else if (strcmp(optarg, "freetype") == 0) mgp_flag |= FL_NOFREETYPE; else if (strcmp(optarg, "xft") == 0) mgp_flag |= FL_NOXFT; else if (strcmp(optarg, "m17n") == 0) mgp_flag |= FL_NOM17N; else { fprintf(stderr, "unknown rendering engine %s\n", optarg); mgp_usage(progname); /*NOTREACHED*/ } break; case 'v': mgp_show_version(progname); /*NOTREACHED*/ case 'n': mgp_flag |= FL_NOSTDIN; break; case 'F': mgp_flag |= FL_FRDCACHE; p = optarg; if ((p2 = strsep(&p, ","))) cache_mode = atoi(p2); if ((p2 = strsep(&p, ","))) cache_effect = atoi(p2); if ((p2 = strsep(&p, ","))) cache_value = atoi(p2); break; case 'E': htmlimage = optarg; break; case 'h': default: mgp_usage(progname); /*NOTREACHED*/ } } argc -= optind; argv += optind; mypid = getpid(); setpgid(mypid, mypid); signal(SIGHUP, cleanup); signal(SIGINT, cleanup); signal(SIGQUIT, cleanup); signal(SIGTERM, cleanup); if (argc != 1) { mgp_usage(progname); /*NOTREACHED*/ } mgp_fname = argv[0]; { struct stat sb; srctimestamp = (time_t) 0; if (0 <= stat(mgp_fname, &sb)) srctimestamp = sb.st_ctime; } init_win1(xgeometry); strlcpy(buf, mgp_fname, sizeof(buf)); if ((p = rindex(buf, '/'))) { *p = '\0'; Paths[NumPaths++]= expandPath(buf); } loadPathsAndExts(); load_file(mgp_fname); if (parse_error) exit(-1); init_win2(); #ifdef VFLIB vfc_setfont(vfont_name); #endif signal(SIGCHLD, waitkids); #ifdef USE_M17N if (! (mgp_flag & FL_NOM17N)) /* initaiize M17N library */ M17N_init(); #endif if (dumpdir) genhtml(start_page); else if (mgp_flag & FL_DEMO) { struct render_state state; memset(&state, 0, sizeof(struct render_state)); state.target = window; /*XXX*/ state.width = window_width; state.height = window_height; while (start_page <= maxpage) { state_goto(&state, start_page, 0); draw_page(&state, NULL); start_page++; sleep(demointerval); /*XXX*/ } } else { init_win3(); main_loop(start_page); } cleanup(0); /* never returns */ exit(0); /* avoid warnings */ /*NOTREACHED*/ } static void genhtml(start_page) int start_page; { struct render_state state; char buf[BUFSIZ]; int fd; FILE *html; FILE *txt; int page; char *childdebug; char *convdb[][3] = {{ "jpg", "cjpeg", "djpeg" }, { "png", "pnmtopng", "pngtopnm" }, { NULL, NULL, NULL }}; int inum = 0; /* check image type */ if (htmlimage) { for (inum = 0; *convdb[inum] != NULL; inum++) { if (strcmp(*convdb[inum], htmlimage) == 0) break; } if (*convdb[inum] == NULL) { fprintf(stderr, "unknwon image type %s.\n", htmlimage); /* print out valid image types */ fprintf(stderr, "Valid image types: "); for (inum = 0; *convdb[inum] != 0; inum++) { fprintf(stderr, "%s ", *convdb[inum] ); } fprintf(stderr,"\n"); cleanup(-1); } } /* check if we can write to the directory */ sprintf(buf, "%s/%ld", dumpdir, (long)time((time_t *)NULL)); fd = open(buf, O_WRONLY | O_CREAT, 0644); if (fd < 0) { fprintf(stderr, "bad dump directory %s.\n", dumpdir); cleanup(-1); } close(fd); unlink(buf); memset(&state, 0, sizeof(struct render_state)); state.target = window; /*XXX*/ state.width = window_width; state.height = window_height; childdebug = parse_debug ? "" : "2>&-"; for (page = start_page; page <= maxpage; page++) { fprintf(stderr, "generating page %d... ", page); state_goto(&state, page, 0); draw_page(&state, NULL); #define EXT convdb[inum][0] /* * dump out image */ fprintf(stderr, "(full image)"); sprintf(buf, "xwintoppm -silent -name MagicPoint | " "%s %s > %s/mgp%05d.%s", convdb[inum][1], childdebug, dumpdir, page, EXT); if (system(buf) < 0){ /*XXX security hole*/ fprintf(stderr, "system() failed for %s", buf); exit(-1); } fprintf(stderr, "(thumbnail)"); sprintf(buf, "%s %s/mgp%05d.%s | " "pnmscale 0.25 | %s %s > %s/mgp%05d.idx.%s", convdb[inum][2], dumpdir, page, EXT, convdb[inum][1], childdebug, dumpdir, page, EXT); if (system(buf) < 0){ /*XXX security hole*/ fprintf(stderr, "system() failed for %s", buf); exit(-1); } /* * dump out html file */ fprintf(stderr, "(html)"); sprintf(buf, "%s/mgp%05d.html", dumpdir, page); html = fopen(buf, "w"); if (!html) continue; fprintf(html, "\n" "MagicPoint presentation foils\n" "\n"); fprintf(html, "[index] " "[text page] ", page); if (1 < page) { fprintf(html, "[<<start] " "[<prev] ", 1, page - 1); } else fprintf(html, "[<<start] [<prev] "); if (page < maxpage) { fprintf(html, "[next>] " "[last>>]\n", page + 1, maxpage); } else fprintf(html, "[next>] [last>>]\n"); fprintf(html, "
Page %d: %s
\n", page, page_title(page)); fprintf(html, "
\n"); if (window_width < 0 || window_height < 0) { fprintf(html, "\n", page, EXT, page); } else { fprintf(html, "\"Page
\n", page, EXT, window_width, window_height, page); } fprintf(html, "
Generated by " "MagicPoint\n" "\n"); fclose(html); /* * dump out text file */ fprintf(stderr, "(txt)\n"); sprintf(buf, "%s/mgp%05d.txt", dumpdir, page); txt = fopen(buf, "w"); if (!txt) continue; state_goto(&state, page, 0); state_init(&state); while (1) { if (state.phase == P_NONE || state.phase == P_END) break; if (!state.cp) { state_next(&state); continue; } switch (state.cp->ct_op) { case CTL_PAUSE: if (state.cp->cti_value) goto txtdone; break; case CTL_TEXT: if (state.cp->ctc_value) { #ifdef USE_M17N if (! (mgp_flag & FL_NOM17N)) { M17N_write_text (txt, state.cp); } else #endif fprintf(txt, "%s", state.cp->ctc_value); } break; case CTL_LINEEND: fprintf(txt, "\n"); break; } state_next(&state); } txtdone:; fclose(txt); } fprintf(stderr, "generating top page... "); sprintf(buf, "%s/index.html", dumpdir); html = fopen(buf, "w"); if (!html) { fprintf(stderr, "could not generate top page\n"); cleanup(-1); } fprintf(stderr, "\n"); fprintf(html, "\n" "MagicPoint presentation foils\n" "\n"); for (page = start_page; page <= maxpage; page++) { if (window_width < 0 || window_height < 0) { fprintf(html, "" "\n", page, page, EXT, page); } else { fprintf(html, "" "\n", page, page, EXT, window_width / 4, window_height / 4, page); } } fprintf(html, "
\n"); fprintf(html, "Generated by " "" "MagicPoint\n"); fprintf(html, "
\n\n"); fclose(html); } static void mgp_show_version(name) char *name; { char *p; if ((p = strrchr(name, '/'))) p ++; else p = name; fprintf(stderr, "%s version %s\n", p, mgp_version); exit(0); } static void mgp_usage(name) char *name; { fprintf(stderr, "Usage: %s [opts] mgpfile\n", name); fprintf(stderr, "\t-b : Specify background color\n"); #ifdef VFLIB fprintf(stderr, "\t-c : Specify vfontcap file\n"); #endif /*VFLIB*/ fprintf(stderr, "\t-d: Demo mode - go through the presentation\n"); #ifdef VFLIB fprintf(stderr, "\t-f : Specify default vflib font\n"); #endif /*VFLIB*/ fprintf(stderr, "\t-g : Set window geometry\n"); fprintf(stderr, "\t-h: Display this help message\n"); #ifdef VFLIB fprintf(stderr, "\t-l: Do not use outline font on vflib\n"); #endif /*VFLIB*/ fprintf(stderr, "\t-n: Disables control key input from tty\n"); fprintf(stderr, "\t-o: Do not override the window manager\n"); fprintf(stderr, "\t-p : Start at the specified page\n"); fprintf(stderr, "\t-q Do not beep on errors\n"); fprintf(stderr, "\t-t : Enable presentation timer\n"); fprintf(stderr, "\t-v: Show version number and quit\n"); fprintf(stderr, "\t-w : Specify a working directory\n"); fprintf(stderr, "\t-x : Disable specified rendering engine\n"); fprintf(stderr, "\t-B: Ignore background image\n"); fprintf(stderr, "\t-C: Use private colormap\n"); fprintf(stderr, "\t-D : Generate html pages for the presentation\n"); fprintf(stderr, "\t-E : Use this image format in html (jpg or png)\n"); fprintf(stderr, "\t-F,,: Use forwarding caches\n"); fprintf(stderr, "\t-G: Page guide is on\n"); fprintf(stderr, "\t-O: Obey to the window manager\n"); fprintf(stderr, "\t-Q : Set background image quality(0-100)\n"); fprintf(stderr, "\t-R: Do not perform automatic reload\n"); fprintf(stderr, "\t-S: Do not process directives that forks process (default)\n"); fprintf(stderr, "\t-U: Do process directives that forks process\n\t or allow to use non-ASCII filenames (unsecure mode)\n"); fprintf(stderr, "\t-T : Update timestampfile on page refresh\n"); fprintf(stderr, "\t-P: print stderr from image conversion tools (by default it's discarded)\n"); fprintf(stderr, "\t-V: Be verbose\n"); fprintf(stderr, "\t-X : ghostscript device to use\n"); fprintf(stderr, "\t--title : Set window title\n"); exit(0); } static void beep() { if (!(mgp_flag & FL_NOBEEP)) XBell(display, 0); } static void main_loop(start_page) u_int start_page; { XEvent e, ahead; KeySym key; u_int i; u_int number = 0; u_int shift = 0; u_int control = 0; static struct render_state state; static Cursor pen_curs; u_int prevpage; memset(&state, 0, sizeof(struct render_state)); state.target = window; /*XXX*/ state.width = window_width; state.height = window_height; if (!pen_curs) { pen_curs = XCreateFontCursor(display, XC_pencil); rakugaki_updatecolor(pen_curs); } state_goto(&state, start_page, 0); #if 0 /* be conservative about first page... */ draw_page(&state, NULL); #endif if (pg_mode) { pg_on(); pg_draw(&state); XFlush(display); } #ifdef TTY_KEYINPUT if (!(mgp_flag & FL_NOSTDIN)) { if (tcgetattr(0, &saveattr) < 0) mgp_flag |= FL_NOSTDIN; else try_enable_ttykey(); } #endif while (1) { if (!t_start && 1 < state.page) t_start = time(NULL); if (rakugaki) XDefineCursor(display, window, pen_curs); else XUndefineCursor(display, window); do { ; /*nothing*/ } while (draw_one(&state, &e) == False); if (t_fin) timebar(&state); #if 0 /* last page reload bug fix? */ if (state.cp && state.cp->ct_op == CTL_PAUSE) { #else if ((state.cp && state.cp->ct_op == CTL_PAUSE) || (state.page == maxpage)){ #endif if (tsfile) { int fd; fd = open(tsfile, O_WRONLY|O_TRUNC|O_CREAT, 0644); if (fd < 0) { fprintf(stderr, "timestamp file %s " "write failed; " "timestamp turning off\n", tsfile); tsfile = NULL; } else { if (write(fd, &state, sizeof(state)) < 0) fprintf(stderr, "timestamp file write failed\n"); close(fd); } } if (wantreload()) { draw_reinit(&state); cleanup_file(); load_file(mgp_fname); if (maxpage < state.page) state.page = 1; state_goto(&state, state.page, 1); /*repaint*/ } } prevpage = state.page; switch (e.type) { case EnterNotify: for (i = 1; i <= maxpage; i++) { if (e.xany.window == plwin[i]) { XClearWindow(display, plwin[i]); pl_pdraw(&state, i, gc_plrev); pl_title(i); } } XFlush(display); break; case LeaveNotify: for (i = 1; i <= maxpage; i++) { if (e.xany.window == plwin[i]) { XClearWindow(display, plwin[i]); pl_pdraw(&state, i, gc_pl); pl_title(0); } } XFlush(display); break; case ButtonPress: if (rakugaki && e.xany.window == window) { rakugaki_update(&state, &e); break; } for (i = 1; i <= maxpage; i++) { if (e.xany.window == plwin[i]) { state_goto(&state, i, 0); pl_off(&state); break; } } if (e.xany.window == window) { if (e.xbutton.button == 1) { struct render_state tstate; tstate = state; int zid; #ifdef USE_IMLIB if (zoomin == 1){ zoomin = 0; zoomout_zimage(zid); break; } if ((zid = search_zimage(e.xbutton.x, e.xbutton.y, state.page)) >= 0){ zoomin_zimage(zid); zoomin = 1; break; } #endif if (!shift && state.cp && state.cp->ct_op == CTL_PAUSE) { state_next(&tstate); } else if (state.page + 1 < maxpage) { state_goto(&tstate, state.page + 1, 0); } else { beep(); break; } if (memcmp(&state, &tstate, sizeof(state)) != 0) { state = tstate; } else { /* cannot make a progress */ beep(); } } else if (e.xbutton.button == 3) { if (state.page > 1) { state_goto(&state, state.page - 1, 0); } else beep(); } } break; case ButtonRelease: if (rakugaki && e.xany.window == window) rakugaki_update(&state, &e); if (e.xbutton.button == 2) goto rakugaki_toggle; break; case MotionNotify: if (!rakugaki) break; if (e.xany.window == window) rakugaki_update(&state, &e); break; case KeyPress: key = XLookupKeysym((XKeyEvent *)&e, 0); switch (key) { case XK_q: case XK_Escape: return; /*NOTREACHED*/ case XK_f: case XK_j: case XK_n: case XK_Down: case XK_Next: case XK_space: { struct render_state tstate; tstate = state; if (number == 0 && state.cp && state.cp->ct_op == CTL_PAUSE) { state_next(&tstate); } else { if (number == 0) number = 1; if (state.page + number <= maxpage) { state_goto(&tstate, state.page + number, 0); } else { beep(); break; } } if (memcmp(&state, &tstate, sizeof(state)) != 0) { state = tstate; } else { /* cannot make a progress */ beep(); } number = 0; break; } case XK_b: case XK_k: case XK_p: case XK_Up: case XK_Prior: case XK_BackSpace: case XK_Delete: if (number == 0) number = 1; if (state.page - number >= 1) { state_goto(&state, state.page - number, 0); } else beep(); number = 0; break; case XK_x: if (shift) { rakugaki_color++; rakugaki_updatecolor(pen_curs); XUndefineCursor(display, window); XDefineCursor(display, window, pen_curs); XFlush(display); } else { rakugaki_toggle: rakugaki = 1 - rakugaki; rakugaki_x = rakugaki_y = -1; if (rakugaki) { XDefineCursor(display, window, pen_curs); } else { XUndefineCursor(display, window); } XFlush(display); } break; case XK_t: if (tbar_mode) tbar_mode = 0; else { if (t_fin) tbar_mode = 1; } break; case XK_Control_L: case XK_Control_R: pl_on(&state); control = 1; number = 0; break; case XK_Shift_L: case XK_Shift_R: shift = 1; number = 0; break; case XK_r: if (control) { reload: pl_off(&state); cached_page = 0; reset_background_pixmap(); draw_reinit(&state); cleanup_file(); load_file(mgp_fname); if (maxpage < state.page) state.page = 1; state_goto(&state, state.page, 1); goto repaint; } break; case XK_l: /* used to be control-L */ repaint:; { struct ctrl *lastcp; lastcp = state.cp; state.repaint = 1; state_goto(&state, state.page, 1); draw_page(&state, lastcp); state.repaint = 0; number = 0; } break; case XK_g: if (shift) { pg_mode = 1 - pg_mode; if (pg_mode) { pg_on(); pg_draw(&state); } else pg_off(); } else { if (number == 0) number = maxpage; if (number <= maxpage && number > 0) { state_goto(&state, number, 0); state_newpage(&state); state_init(&state); } else beep(); } number = 0; break; case XK_0: case XK_1: case XK_2: case XK_3: case XK_4: case XK_5: case XK_6: case XK_7: case XK_8: case XK_9: number = number * 10 + key - XK_0; break; case XK_c: if (verbose) { if (mgp_flag & FL_FRDCACHE) printf("turn off forward cache\n"); else printf("turn on forward cache\n"); } mgp_flag ^= FL_FRDCACHE; break; case XK_a: XCopyArea(display, cachewin, window, gc_cache, 0, 0, window_width, window_height, 0, 0); break; case XK_w: toggle_fullscreen(); break; default: number = 0; break; } break; case KeyRelease: key = XLookupKeysym((XKeyEvent *)&e, 0); switch (key) { case XK_Control_L: case XK_Control_R: pl_off(&state); control = 0; break; case XK_Shift_L: case XK_Shift_R: shift = 0; break; } break; case Expose: if (e.xexpose.window != window) break; if (state.repaint) break; /* compress expose event */ while (XEventsQueued(display, QueuedAfterReading) > 0) { XPeekEvent(display, &ahead); if (ahead.type != Expose && ahead.type != ConfigureNotify) break; if (ahead.xexpose.window != window) break; XNextEvent(display, &e); } if (wantreload()) goto reload; if ((state.cp && state.cp->ct_op == CTL_PAUSE) || (state.page == maxpage)) goto repaint; break; case ConfigureNotify: if ((e.xconfigure.window != window) && ((mgp_flag & FL_OVER) || e.xconfigure.window != RootWindow(display, screen))) break; /* compress expose event */ while (XEventsQueued(display, QueuedAfterReading) > 0) { XPeekEvent(display, &ahead); if (ahead.type != Expose && ahead.type != ConfigureNotify) break; if (ahead.xconfigure.window != window) break; XNextEvent(display, &e); } if (window_width != e.xconfigure.width || window_height != e.xconfigure.height) { struct ctrl *lastcp; if (!(mgp_flag & FL_OVER)) XMoveResizeWindow(display, window, 0, 0, e.xconfigure.width, e.xconfigure.height); if (pg_mode) pg_off(); pl_off(&state); window_width = e.xconfigure.width; window_height = e.xconfigure.height; state.width = e.xconfigure.width; state.height = e.xconfigure.height; if (mgp_flag & FL_FRDCACHE) { cached_page = 0; reset_background_pixmap(); } reset_background_pixmap(); draw_reinit(&state); /*notify*/ lastcp = state.cp; state_goto(&state, state.page, 1); draw_page(&state, lastcp); } if (pg_mode) { pg_on(); pg_draw(&state); } if (wantreload()) goto reload; break; } /* page may have changed... */ if (pg_mode) pg_draw(&state); if (prevpage != state.page) { pl_pdraw(&state, prevpage, gc_pl); pl_pdraw(&state, state.page, gc_plrev); pl_title(state.page); } if (state.phase == P_END) { if (state.page < maxpage) state_goto(&state, state.page + 1, 0); } } } static void rakugaki_update(state, e) struct render_state *state; XEvent *e; { int x, y; if (e->type == MotionNotify) { XMotionEvent *em; em = (XMotionEvent *)e; x = em->x; y = em->y; } else if (e->type == ButtonPress) { XButtonPressedEvent *eb; eb = (XButtonPressedEvent *)e; x = eb->x; y = eb->y; if (e->xbutton.button != 1) return; } else { rakugaki_x = rakugaki_y = -1; return; } if (rakugaki_x < 0 || rakugaki_y < 0) XDrawRectangle(display, state->target, gcpen, x, y, 1, 1); else { XDrawLine(display, state->target, gcpen, x, y, rakugaki_x, rakugaki_y); XDrawLine(display, state->target, gcpen, x + 1, y, rakugaki_x + 1, rakugaki_y); XDrawLine(display, state->target, gcpen, x, y + 1, rakugaki_x, rakugaki_y + 1); XDrawLine(display, state->target, gcpen, x + 1, y + 1, rakugaki_x + 1, rakugaki_y + 1); } rakugaki_x = x; rakugaki_y = y; } static void rakugaki_updatecolor(cursor) Cursor cursor; { XColor junk; int maxidx; maxidx = sizeof(rakugaki_forecolors)/sizeof(rakugaki_forecolors[0]); if (maxidx <= rakugaki_color) rakugaki_color %= maxidx; XAllocNamedColor(display, DefaultColormap(display, screen), rakugaki_forecolors[rakugaki_color], &rakugaki_fore, &junk); XAllocNamedColor(display, DefaultColormap(display, screen), rakugaki_backcolors[rakugaki_color], &rakugaki_back, &junk); /* * due to the design of the cursor, it looks more natural if we swap * the background color and foreground color. */ XRecolorCursor(display, cursor, &rakugaki_back, &rakugaki_fore); XSetForeground(display, gcpen, rakugaki_fore.pixel); } static struct { pid_t pid; void *key; Window window_id; int flag; } childtab[64]; static int childidx = 0; pid_t checkchild(key) void *key; { int i; for (i = 0; i < childidx; i++) { if (childtab[i].pid == (pid_t)-1) continue; if (childtab[i].key == key) return childtab[i].pid; } return (pid_t)-1; } Window checkchildwin(key) void *key; { int i; for (i = 0; i < childidx; i++) { if (childtab[i].pid == (pid_t)-1) continue; if (childtab[i].key == key) return childtab[i].window_id; } return (Window)-1; } void regchild(pid, key, window_id, flag) pid_t pid; void *key; Window window_id; int flag; { int i; for (i = 0; i < childidx; i++) { if (childtab[i].pid == (pid_t)-1) { childtab[i].pid = pid; childtab[i].key = key; childtab[i].window_id = window_id; childtab[i].flag = flag; return; } } childtab[childidx].pid = pid; childtab[childidx].key = key; childtab[childidx].flag = flag; childtab[childidx].window_id = window_id; childidx++; } void purgechild(flag) int flag; { int i; for (i = 0; i < childidx; i++) { if (childtab[i].pid == (pid_t)-1) continue; if (childtab[i].flag == flag){ kill(childtab[i].pid, SIGTERM); } } } static RETSIGTYPE waitkids(sig) int sig; { int status; int i; pid_t pid; if (sig != SIGCHLD) { fprintf(stderr, "signal different from expected: %d\n", sig); cleanup(-1); } while ((pid_t) 0 < (pid = waitpid(-1, &status, WNOHANG))) { for (i = 0; i < childidx; i++) { if (childtab[i].pid == pid) { childtab[i].pid = (pid_t)-1; childtab[i].window_id = (Window)-1; } } } } static int wantreload() { struct stat sb; if (mgp_flag & FL_NOAUTORELOAD) return 0; if (0 <= stat(mgp_fname, &sb)) { if (srctimestamp < sb.st_ctime) { srctimestamp = sb.st_ctime; return 1; } } return 0; } /* remap child window which was invoked by xsystem directive. this is an adhoc solution for window-maker. */ void remapchild() { int i; for (i = 0; i < childidx; i++) { if (childtab[i].window_id > 0){ XMapSubwindows(display, window); XFlush(display); return; } } return; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/mgp.h�������������������������������������������������������������������������������������������0100644�0023745�0000000�00000052266�11146763216�0012124�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: mgp.h,v 1.147 2009/02/18 10:44:30 nishida Exp $ */ #include <stdio.h> #include <stdlib.h> #include <math.h> #if TIME_WITH_SYS_TIME # include <sys/time.h> # include <time.h> #else # if HAVE_SYS_TIME_H # include <sys/time.h> # else # include <time.h> # endif #endif #ifdef HAVE_UNISTD_H # include <unistd.h> #endif #include <string.h> #include <sys/param.h> #include <ctype.h> #include <assert.h> #include <sys/types.h> #if HAVE_SYS_WAIT_H # include <sys/wait.h> #endif #include <sys/stat.h> #include <signal.h> #include <errno.h> #include <fcntl.h> #include <X11/Xlib.h> #include <X11/keysym.h> #include <X11/cursorfont.h> #include <X11/Xatom.h> #ifdef USE_XFT2 #include <ft2build.h> #include FT_FREETYPE_H #include <fontconfig/fontconfig.h> #include <X11/Xft/Xft.h> #ifdef HAVE_ICONV #include <iconv.h> #endif #endif #include "image/xloadimage.h" #ifndef __P # define __P(x) x #endif #if 0 #define USE_XDRAWSTRING_ONLY_SMALL #endif #ifdef VFLIB #include "VF.h" #define VFONT "minsl" #ifndef VFCAP #define VFCAP "/usr/local/lib/VFlib/vfontcap" #endif #endif /* end of VFLIB */ #ifdef FREETYPE #include "freetype.h" #ifndef FREETYPEFONTDIR #define FREETYPEFONTDIR "/usr/local/share/fonts/ttf" #endif #endif /*FREETYPE*/ #ifdef HAVE_TERMIOS_H #define TTY_KEYINPUT #else #undef TTY_KEYINPUT #endif #ifdef USE_M17N #include <m17n-gui.h> #include <m17n-misc.h> #endif #define DEFAULT_FORE "yellow" #define DEFAULT_BACK "black" #define PAGELIST_FONT "a14" #define PAGELIST_KFONT "k14" #define DEFAULT_CHARSIZE 10 /* 10% of height */ #define DEFAULT_SUPSCALE 0.6 #define DEFAULT_SUPOFF 0.4 #define DEFAULT_SUBOFF 0.15 #define DEFAULT_HGAP 0 #define DEFAULT_VGAP 15 #define DEFAULT_BQUALITY 100 #define DEFAULT_OPAQUE 100 #define XLFD_HYPHEN 14 #define FONT_FORMAT "-*-%s-*-*-%s-*-*-*-*-*-%s" #define DEFAULT_X_FONT "times-medium-r" #define CUTIN_DELAY 5000 #define SHRINK_DELAY 00500 #define EXEC_DELAY 20000 #define DEFAULT_GSDEV "pnmraw+" #define RCFILE ".mgprc" #define EMBEDDIR "EMBEDDIR/" #ifndef UUDECODE #define UUDECODE "/usr/bin/uudecode" #endif #ifndef GUNZIP #define GUNZIP "/usr/contrib/bin/gunzip" #endif #define MAXPAGE 512 #define MAXLINE 256 #define MAXVALLEN 512 #define MAXDIREC 16 #define MAXARG 32 #define MAXTAB 32 #define MAXSTYLE 100 #define MAXFONTDEF 100 #define MAXBGPIXMAP 2 #define SP_NONE 0 #define SP_SHRINK 1 #define SP_LCUTIN 2 #define SP_RCUTIN 3 #define AL_LEFT 0 #define AL_CENTER 1 #define AL_RIGHT 2 #define AL_LEFTFILL0 3 #define AL_LEFTFILL1 4 #define DEFAULT_GRADSTART "blue" #define DEFAULT_GRADEND "black" #define DEFAULT_GRADDEPTH 8 #define DEFAULT_GRADCOLORS 128 #define DEFAULT_MGPWDIR "/tmp" /* mgp command line flags */ #define FL_OVER 0x0001 #define FL_BIMAGE 0x0002 #define FL_DEMO 0x0004 #define FL_VERBOSE 0x0008 #define FL_OUTLINE 0x0010 #define FL_NOBEEP 0x0020 #define FL_NOFORK 0x0080 #define FL_PRIVATE 0x0100 #define FL_NODECORATION 0x0200 #define FL_NOAUTORELOAD 0x0400 #define FL_NOVFLIB 0x0800 #define FL_NOFREETYPE 0x1000 #define FL_NOSTDIN 0x2000 #define FL_GLYPHEDGE 0x4000 #define FL_FRDCACHE 0x8000 #define FL_NOXFT 0x10000 #define FL_NOM17N 0x20000 /* page attribute flags */ #define PGFLAG_NODEF 0x01 /* nodefault */ #define EVENT_DEFAULT \ (KeyPressMask|KeyReleaseMask|ButtonPressMask|StructureNotifyMask|\ ExposureMask) #define EVENT_RAKUGAKI \ (EVENT_DEFAULT|ButtonReleaseMask|Button1MotionMask) #include "ctlwords.h" struct ctrl_double { double ct_value; }; struct ctrl_int { u_int ct_value; }; struct ctrl_int2 { u_int ct_value1; u_int ct_value2; }; struct ctrl_int3 { u_int ct_value1; u_int ct_value2; u_int ct_value3; }; struct ctrl_long { u_long ct_value; }; struct ctrl_char { char *ct_value; }; struct ctrl_char2 { char *ct_value1; char *ct_value2; }; struct ctrl_args { u_int ct_argc; char **ct_argv; int ct_flag; }; struct ctrl_image { char *ct_fname; u_int ct_numcolor; u_int ct_ximagesize; u_int ct_yimagesize; u_int ct_zoomflag; u_int ct_raise; u_int ct_rotate; /* +/-180, +/-90, 0, 270 */ u_int ct_zoomonclk; #define Z_XMASK 0x0f #define Z_YMASK 0xf0 #define Z_YSHIFT 4 #define Z_ABSOLUTE 0x00 /* absolute value */ #define Z_NORMAL 0x01 /* normal zoom ratio */ #define Z_SCREEN 0x02 /* screen relative zoom ratio */ #define Z_SCREEN0 0x03 /* original screen size specified */ #define Z_OBEY 0x04 /* obey other axis */ }; /* for gradation image generation*/ struct g_color { int r, g, b; int y; }; struct ctrl_grad { u_int ct_numcolor; int ct_direction; u_int ct_width; /* resulting image width, percentage */ u_int ct_height; /* resulting image height, percentage */ #if 0 u_int ct_hquality; /* horizontal quality factor */ u_int ct_vquality; /* vertical quality factor */ #endif u_int ct_zoomflag; /* zoom to full screen? */ int ct_mode; /* linear(0) / non-linear(1) */ int ct_g_colors; struct g_color **colors; }; struct ctrl_bar { u_long ct_color; u_int ct_width; u_int ct_start; u_int ct_length; }; struct ctrl_icon { char *ct_value; u_long ct_color; u_int ct_size; }; struct ctrl_area { u_int ct_xoff; u_int ct_width; u_int ct_yoff; u_int ct_height; }; struct ctrl_pcache { u_int ct_cflag; u_int ct_cmode; u_int ct_ceffect; u_int ct_cvalue; }; struct ctrl { u_char ct_op; u_char ct_flag; u_int ct_page; struct ctrl *ct_next; union { struct ctrl_double ctrl_double; struct ctrl_int ctrl_int; struct ctrl_int2 ctrl_int2; struct ctrl_int3 ctrl_int3; struct ctrl_long ctrl_long; struct ctrl_char ctrl_char; struct ctrl_char2 ctrl_char2; struct ctrl_image ctrl_image; struct ctrl_grad ctrl_grad; struct ctrl_bar ctrl_bar; struct ctrl_args ctrl_args; struct ctrl_icon ctrl_icon; struct ctrl_area ctrl_area; struct ctrl_pcache ctrl_pcache; } ct_val; }; #define ctf_value ct_val.ctrl_double.ct_value #define cti_value ct_val.ctrl_int.ct_value #define cti2_value1 ct_val.ctrl_int2.ct_value1 #define cti2_value2 ct_val.ctrl_int2.ct_value2 #define cti3_value1 ct_val.ctrl_int3.ct_value1 #define cti3_value2 ct_val.ctrl_int3.ct_value2 #define cti3_value3 ct_val.ctrl_int3.ct_value3 #define ctl_value ct_val.ctrl_long.ct_value #define ctc_value ct_val.ctrl_char.ct_value #define ctc2_value1 ct_val.ctrl_char2.ct_value1 #define ctc2_value2 ct_val.ctrl_char2.ct_value2 #define ctm_fname ct_val.ctrl_image.ct_fname #define ctm_numcolor ct_val.ctrl_image.ct_numcolor #define ctm_ximagesize ct_val.ctrl_image.ct_ximagesize #define ctm_yimagesize ct_val.ctrl_image.ct_yimagesize #define ctm_zoomflag ct_val.ctrl_image.ct_zoomflag #define ctm_raise ct_val.ctrl_image.ct_raise #define ctm_rotate ct_val.ctrl_image.ct_rotate #define ctm_zoomonclk ct_val.ctrl_image.ct_zoomonclk #define ctd_colors ct_val.ctrl_grad.colors #define ctd_g_colors ct_val.ctrl_grad.ct_g_colors #define ctd_numcolor ct_val.ctrl_grad.ct_numcolor #define ctd_dir ct_val.ctrl_grad.ct_direction #define ctd_basewidth ct_val.ctrl_grad.ct_width #define ctd_baseheight ct_val.ctrl_grad.ct_baseheight #define ctd_width ct_val.ctrl_grad.ct_width #define ctd_height ct_val.ctrl_grad.ct_height #define ctd_hquality ct_val.ctrl_grad.ct_hquality #define ctd_vquality ct_val.ctrl_grad.ct_vquality #define ctd_zoomflag ct_val.ctrl_grad.ct_zoomflag #define ctd_mode ct_val.ctrl_grad.ct_mode #define ctb_color ct_val.ctrl_bar.ct_color #define ctb_width ct_val.ctrl_bar.ct_width #define ctb_start ct_val.ctrl_bar.ct_start #define ctb_length ct_val.ctrl_bar.ct_length #define cta_argc ct_val.ctrl_args.ct_argc #define cta_argv ct_val.ctrl_args.ct_argv #define cta_flag ct_val.ctrl_args.ct_flag #define ctic_value ct_val.ctrl_icon.ct_value #define ctic_color ct_val.ctrl_icon.ct_color #define ctic_size ct_val.ctrl_icon.ct_size #define ctar_xoff ct_val.ctrl_area.ct_xoff #define ctar_width ct_val.ctrl_area.ct_width #define ctar_yoff ct_val.ctrl_area.ct_yoff #define ctar_height ct_val.ctrl_area.ct_height #define ctch_flag ct_val.ctrl_pcache.ct_cflag #define ctch_mode ct_val.ctrl_pcache.ct_cmode #define ctch_effect ct_val.ctrl_pcache.ct_ceffect #define ctch_value ct_val.ctrl_pcache.ct_cvalue struct ctl_words { u_char ctl_type; char ctl_vtype; #define T_STR 'c' #define T_STR2 'C' #define T_INT 'i' #define T_LONG 'l' #define T_DOUBLE 'f' #define T_SP 'x' #define T_VOID '-' char *ctl_string; int ctl_strlen; }; extern const struct ctl_words ctl_words[]; struct page_attribute { u_int pg_flag; u_int pg_linenum; u_int pg_b_numcolor; /* background gradation number of colors */ u_int pg_b_dir; /* background gradation deg */ u_int pg_text; /* this page is text only */ }; extern struct page_attribute page_attribute[MAXPAGE]; extern int caching; extern int cached_page; extern int cache_hit; extern int cache_mode; extern int cache_effect; extern int cache_value; struct render_state { /* state of the parser */ u_int page; u_int line; struct ctrl *cp; enum { P_NONE, P_DEFAULT, P_PAGE, P_END } phase; /* * NONE - nothing * DEFAULT - doing default_control * PAGE - doing page_control */ char *curprefix; char *tabprefix; u_int align; u_int special; u_int leftfillpos; /* * state of the renderer * we don't have xpos here since that will be * dynaimcally determined at CTL_LINEEND. */ Drawable target; u_int height; u_int width; int xprefix; int tabxprefix; int xoff; int yoff; u_int ypos; int have_mark; u_int mark_ypos; u_int repaint; int maxascent; int maxdescent; int maxflheight; int max_lineascent; /* max size above baseline ignoring supscript */ int max_linedescent; /* max size below baseline ignoring subscript */ u_int linewidth; u_int brankline; u_int opaque; u_int charoff; struct ctrl *xfont; struct render_object *obj, *objlast; }; struct render_object { struct render_object *next; int x; /* relative from left position of line */ int y; /* relative from center position of line (usually negative) */ int ascent; /* size above the baseline */ int descent; /* size below the baseline */ int vertloc; /* vertical placement control */ #define VL_BASE 0 #define VL_CENTER 1 #define VL_TOP 2 #define VL_BOTTOM 3 #define VL_ICENTER 4 enum { #ifdef VFLIB O_VFONT, #endif /* VFLIB */ #ifdef FREETYPE O_TFONT, #endif /* FREETYPE */ O_XFONT, O_IMAGE, #ifdef MNG O_ANIM, #endif /* MNG */ #ifdef USE_XFT2 O_XTFONT, #endif #ifdef USE_M17N O_M17NTEXT, #endif O_ICON } type; u_long fore; union { #ifdef VFLIB struct vfont *vfc; #endif /* VFLIB */ #ifdef FREETYPE struct tfont *tfc; #endif /* FREETYPE */ struct { char *xfont; u_int csize; u_int code; char *registry; } xfont; struct { Image *image; float xzoom, yzoom; #ifdef USE_IMLIB int zoomonclk; Imlib_Image *imimage; #endif } image; struct { u_int itype; u_int isize; u_int npoint; XPoint *xpoint; } icon; #ifdef MNG struct { u_int width; u_int height; char *filename; void *key; } anim; #endif /* MNG */ #ifdef USE_XFT2 struct { char *data; char *fontname; char *registry; int len; int size; int charset16; } xftfont; #endif #ifdef USE_M17N struct { MText *mt; MFrame *drawframe; int from, to; } m17ntext; #endif } data; }; #ifdef VFLIB struct vfont { struct vfont *next; struct vfont *prev; struct vfont *lrunext; struct vfont *lruprev; u_int size; u_int width; u_int bwidth; u_int height; u_int code; u_int charlen; u_int xmax; int ascent; int descent; u_int xoff; char *fontname; u_char *dbitmap; u_int ref; }; #endif /* VFLIB */ #ifdef FREETYPE struct tfont { struct tfont *next; struct tfont *prev; struct tfont *lrunext; struct tfont *lruprev; u_int size; /* char_size (as specified by %size) */ u_int width; /* bitmap width */ u_int bwidth; /* bitmap width, byte boundary */ u_int height; /* bitmap height */ u_int code; u_int charlen; /* origin x axis advance width */ u_int xmax; /* right edge of bbox */ int ascent; /* (top of bitmap) - (origin y axis) */ int descent; /* (origin y axis) - (bottom of bitmap) */ int xoff; /* (left of bitmap) - (origin x axis) */ char *fontname; u_char *dbitmap; u_int ref; int regid; /* registry ID */ }; #endif /* FREETYPE */ struct alloc_color { int num; long *colors; }; struct bgpixmap { struct ctrl *ctl; Pixmap pixmap; Image *image; XImageInfo *ximageinfo; }; /* * The following variables are defined in global.c, and therefore * they are available in both "mgp" and "mgp2ps" binary. */ #if 0 extern char *page_data[MAXPAGE][MAXLINE]; #endif extern struct ctrl *page_control[MAXPAGE][MAXLINE]; extern struct ctrl *default_control[MAXLINE]; extern struct ctrl *tab_control[MAXTAB+MAXSTYLE]; extern struct ctrl *init_control[MAXLINE]; extern struct ctrl *fontdef_control[MAXFONTDEF]; extern u_int mgp_flag; extern int verbose; extern u_int maxpage; extern u_int cur_page; extern char *mgp_fname; extern char *mgp_wname; extern u_int parse_error; extern u_int parse_debug; extern Display *display; extern Window window; extern int screen; extern int window_width; extern int window_height; extern Pixmap pixmap; extern Pixmap cachewin; extern Pixmap cachetmp; extern struct bgpixmap bgpixmap[MAXBGPIXMAP]; extern Colormap colormap; extern struct alloc_color image_clr; extern struct alloc_color back_clr; extern struct alloc_color font_clr; extern u_int char_size[2]; extern u_int nonscaled_size[2]; extern float sup_scale; extern float sup_off; extern float sub_off; extern u_int horiz_gap[2]; extern u_int vert_gap[2]; extern u_int depth; extern Visual *visual; extern u_long fore_color[2]; extern u_long back_color[2]; extern u_long ctrl_color[2]; extern u_int b_quality[2]; extern u_int quality_flag; extern char mgp_charset[256]; #define VERT_GAP(s) ((s) * vert_gap[caching] / 100) #define HORIZ_GAP(s) ((s) * horiz_gap[caching] / 100) #define VERT_STEP(s) ((s) + VERT_GAP(s)) #define HORIZ_STEP(s, x) ((x) + HORIZ_GAP(s)) /* * The following variable are defined in x11.c. Therefore, these are * accessible only in "mgp" binary, not in "mgp2ps". * We should separate header files. * (or, if mgp.c and print.c get merged the problem will vanish) */ /* covered by gcconf */ extern GC gcfore; extern GC gcpen; extern GC gcred; extern GC gcgreen; extern GC gcyellow; /* not covered by gcconf */ extern GC gc_pl; extern GC gc_plrev; extern GC gc_pta; extern GC gc_ptk; extern GC gc_cache; extern long xeventmask; /* * The following variable are defined in mgp.c. Therefore, these are * accessible only in "mgp" binary, not in "mgp2ps". * We should separate header files. * (or, if mgp.c and print.c get merged the problem will vanish) */ extern Window plwin[MAXPAGE]; extern Pixmap maskpix; extern XFontStruct *plfs; extern XFontStruct *plkfs; extern XFontStruct *plsfs; extern u_int pg_mode; extern time_t t_start; extern u_int t_fin; extern u_int tbar_mode; extern u_long pl_fh, pl_fw; extern u_long depth_mask; #ifdef VFLIB extern char *vfcap_name; #endif #ifdef FREETYPE extern char *freetypefontdir; extern char *freetypefont0; /* font name to be used as a last resort */ extern char *freetypemfont0; /* font name to be used as a last resort */ extern int unicode_map[65536]; #endif extern int latin_unicode_map[3][256]; #ifdef TTY_KEYINPUT extern volatile int ttykey_enable; #endif extern char *back_clname; extern char *gsdevice; extern char *htmlimage; extern char *mgpwdir; extern char mgpwdirname[]; /* mgp.c */ extern pid_t checkchild __P((void *)); extern Window checkchildwin __P((void *)); extern void regchild __P((pid_t, void *, Window, int)); extern void purgechild __P((int)); extern void remapchild __P((void)); extern void cleanup __P((int)); #ifdef TTY_KEYINPUT extern void try_enable_ttykey __P((void)); #endif extern void reset_background_pixmap(); /*draw.c*/ extern void state_goto __P((struct render_state *, u_int, int)); extern void state_init __P((struct render_state *)); extern void state_newpage __P((struct render_state *)); extern void state_next __P((struct render_state *)); extern void draw_page __P((struct render_state *, struct ctrl *)); extern Bool draw_one __P((struct render_state *, XEvent *)); extern void timebar __P((struct render_state *)); extern void draw_reinit __P((struct render_state *)); extern int get_regid __P((char *)); extern void draw_line_itemsize __P((struct render_state *, int, int, int)); extern void draw_line_start __P((struct render_state *)); extern void draw_line_end __P ((struct render_state *)); #ifdef USE_M17N extern int obj_new_mtext __P((struct render_state *, int, int, MText *, int, int, MFrame *, int, int)); #endif /*parse.c*/ extern void load_file __P((char *)); extern void cleanup_file __P(()); extern int ctlcmp __P((struct ctrl *, struct ctrl *)); extern FILE *fsearchopen __P((char *, char *, char **)); extern int chkfile __P((char *)); extern struct ctrl *ctllastitem __P((struct ctrl *)); extern void ctlappend __P((struct ctrl *, struct ctrl *)); extern void ctlinsert __P((struct ctrl **, struct ctrl *)); extern struct ctrl *ctlalloc1 __P((u_int)); extern void ctlfree __P((struct ctrl *)); extern struct ctrl *ctlcopy __P((struct ctrl *)); extern struct ctrl *ctlcopy1 __P((struct ctrl *)); extern void debug0 __P((struct ctrl *)); extern void debug1 __P((struct ctrl *)); /*plist.c*/ extern void pl_on __P((struct render_state *)); extern void pl_off __P((struct render_state *)); extern void pl_pdraw __P((struct render_state *, int, GC)); extern void pl_title __P((u_int)); extern char *page_title __P((int)); extern void pg_on __P((void)); extern void pg_clean __P((void)); extern void pg_draw __P((struct render_state *)); extern void pg_off __P((void)); /*font.c*/ extern struct vfont *vfc_get __P((u_int, u_int, u_int, int)); extern void vfc_setfont __P((char *)); extern XImage *vfc_image __P((struct vfont *, long, long, XImage *, u_int, u_int)); /*x11.c or x11dummy.c*/ extern int window_x; extern int window_y; extern void init_win1 __P((char *)); extern void init_win2 __P((void)); extern void init_win3 __P((void)); extern void finish_win __P((void)); extern int get_color __P((char *, u_long *)); extern struct g_color *name2gcolor __P((char *)); extern void regist_alloc_colors __P((struct alloc_color *, u_long *, int)); extern void free_alloc_colors __P((struct alloc_color *)); extern void toggle_fullscreen(); /* background.c */ extern double cdist __P((int, int, int, int, int, int)); extern double lcdist __P((int, int, int, int, int, int, double, double)); extern byte *draw_gradation __P((int, int, struct ctrl_grad *)); extern Image *make_XImage __P((byte *, unsigned int, unsigned int)); /* postscript.c */ extern int ps_boundingbox __P((char *, int *, int *, int *, int *)); extern void image_zoomratio __P((struct render_state *, float *, float *, int, int, int)); /* tfont.c */ extern int tfc_setsize __P((u_int)); extern struct tfont *tfc_get __P((u_int, u_int, int, char *, int)); extern void tfc_setfont __P((char *, int, char *)); extern XImage *tfc_image __P((struct tfont *, long, long, XImage *, int, int)); /* unimap.c */ extern void latin_unicode_map_init(); /* embed.c */ extern char *embed_fname __P((char *)); extern void embed_file __P((FILE *, struct ctrl *, int *)); extern void cleandir __P((void)); /* missing/ *.c */ #ifndef HAVE_STRDUP extern char *strdup __P((const char *)); #endif #ifndef HAVE_STRSEP extern char *strsep __P((char **, const char *)); #endif #ifndef HAVE_USLEEP extern void usleep __P((u_int)); #endif #ifdef FREETYPE #define RASTERLIB #endif #ifdef VFLIB #define RASTERLIB #endif #if 1 #define DITHERED_BGRAD #define COLOR_BUGFIX #endif #ifdef USE_M17N /*m17n.c*/ extern void M17N_init __P((void)); extern void M17N_fini __P((void)); extern void M17N_set_font __P((char *, char *)); extern void M17N_set_color __P((u_long)); extern void M17N_process_direc __P((char *, char *)); extern void M17N_draw_string __P((struct render_state *, struct ctrl *cp)); extern void M17N_draw_object __P((struct render_object *, Drawable, int, int)); #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/mgp.man�����������������������������������������������������������������������������������������0100644�0023745�0000000�00000027725�10722061660�0012443�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.\" Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. Neither the name of the project nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" $Id: mgp.man,v 1.65 2007/11/24 17:47:28 nishida Exp $ .\" .Dd November 1997 .Dt MGP 1 .Os .\" .Sh NAME .Nm mgp .Nd MagicPoint -- an X11 based presentation tool .\" .Sh SYNOPSIS .Nm mgp .Op Fl dhlnoqvBCGORSV .Op Fl b Ar bgcolor .Op Fl c Ar vfcap .Op Fl f Ar vfont .Op Fl g Ar geometry .Op Fl p Ar page .Op Fl t Ar timeslot .Op Fl w Ar wdir .Op Fl x Ar engine .Op Fl D Ar htmldir .Op Fl E Ar htmlimage .Op Fl F Ar mode,effect,value .Op Fl Q Ar quality .Op Fl T Ar timestampfile .Op Fl X Ar gsdevice .Ar file .\" .Sh DESCRIPTION .Nm is an X11 based presentation tool. It is designed to make simple presentations easy while to make complicated presentations possible. Its presentation file .Pq whose suffix is typically Li .mgp is just text so that you can create presentation files quickly with your favorite editor (such as Emacs). .Pp The .Li .mgp file consists of text and control commands (such as pagebreak, centering, and/or inline image). Control commands are specified on the beginning of lines started with one .Li % sign. You can include numerous kinds of image format files onto the presentation file. .Pp .Nm uses Japanese/English fonts in various sizes. .Nm uses X11 scalable fonts provided by X11 servers. .Nm can also utilize the Japanese outline font library, "VFlib", if configured to do so at compilation time. .Pp The following options are available: .Bl -tag -width indent .It Fl b Ar bgcolor Set background color to .Ar bgcolor . (The default value is black) .It Fl c Ar vfcap Specify a VFlib configuration file. .It Fl d [ Ar interval ] Demonstration mode. Browse all page automatically, spending .Ar interval secounds on each page and terminate. If .Ar interval is not specified, it will be set to 0. .It Fl f Ar vfont Specify the font name to be used by VFlib. (The default value is minsl) .It Fl g Ar geometry Set the size and location of the window. Please note that .Fl g implies .Fl o. .Nm will not override the window manager if you specify the geometry. .It Fl h Display the usage and exit without performing a presentation. .It Fl l There are two kind of fonts available by VFlib; They are outline font and bitmap font. By specifying .Fl l , you can disable the use of outline fonts. .It Fl n .Nm accepts any key inputs from invoked terminal as KEY OPERATION described below. .Fl n disables this feature. (This option may be removed in the future release) .It Fl o Do not override window manager. (By default, .Nm overrides window manager and occupies the whole display) .It Fl p Ar page Start presentation from .Ar page , rather than the first page. .It Fl q Do not beep on errors. .It Fl t Ar timeslot Specify the timeslot assigned to the presentation in minute. The timer is invoked when the second page is displayed and the remaining presentation time is indicated by the length of bar shown at the bottom of the display. The timebar is updated when some X11 event is raised, for instance some keypress. Timebar will be green if you have more than 50% of the timeslot, yellow while you have more than 30% of the timeslot, and red for the other cases. When the assigned timeslot is expired, exceeding time is also shown as a timebar growing from left to right. Current page is indicated by the position of a small vertical bar; the vertical bar is drawn at the leftend when the first page is displayed while the bar is drawn at the rightend when the last page is displayed. .It Fl Fl title Ar name Set the title of the window to .Ar name . .It Fl v Display the MagicPoint version and exit without performing a presentation. .It Fl w Ar wdir specifies the working directory used for store embedded images if any. To generate an embedded MGP file, use .Xr mgpembed 1 . .It Fl x Ar engine Do not use rendering engine, specified by .Ar engine . .Ar engine can be .Li VFlib or .Li FreeType . .It Fl B Omit background image. .It Fl C Use private colormap. .It Fl D Ar htmldir Generate html pages of the presentation into .Ar htmldir . You will need .Xr xwintoppm 1 (included in mgp kit), and .Xr pnmscale 1 , .Xr cjpeg 1 , and .Xr djpeg 1 .Po included in .Li netpbm and Independent Jpeg Group .Li jpeg package .Pc . .It Fl E Ar htmlimage Specifies html image type. Now "jpg" and "png" are supported. default value is "jpg". It works when -D option is set. .It Fl F Ar mode,effect,value Specifies forward page cache options. .Ar Mode , .Ar effect and .Ar value are numbers. .Ar Mode specifies caching mode. .Ar Mode 0 means caching is executed after 2 seconds idle. .Ar Mode 1 means caching is executed immediately. .Ar Effect specifies 'special effect' for the forward page cache. Currently, two special effects are supported. .Ar Effect 1 means that the next page will come in from the left side. .Ar Effect 2 means that the current page will go out to the left side. .Ar Effect 0 means no special effect. .Ar Value specifies speed of special effect. .Ar Value 1 means the highest speed. A higher value for .Ar value decreases effect speed. .It Fl G Specifies to turn on page guide function. At the bottom of the screen, the titles of next page and previous page are displayed to assist the presentation. Page guide can be turned on and off by keyboard too. .It Fl O Obey to the window manager, but with less decoration around the window. The behavior of this option is affected by how the window manager is implemented; this option may have no effect on some of the window managers. .It Fl Q Ar quality Set background image quality(0-100). .It Fl R .Nm will usually reload the presentation file if it gets updated, based on the file modification time taken by .Xr stat 2 . .Fl R disables this auto-reloading feature. .It Fl S Be secure. Skip directives that fork/exec the child process. It is suggested to use this option if you got some presentation file from others. This is enabled by default. .It Fl U Be unsecure. Enable directives that fork/exec the child process. Allow to use non-ASCII filename. .It Fl T Ar timestampfile If the option is specified, .Nm will modify the content of .Ar timestampfile every time it updates the presentation window. This option is useful for external process to understand when .Nm modifies the window. .It Fl V Be verbose. Generate debugging output to standard output. .It Fl X Ar gsdevice .Nm sometimes invokes .Xr ghostscript 1 to render postscript images. .Fl X enables you to specify the device to be used by .Xr ghostscript 1 . .\"If your .\".Xr ghostscript 1 .\"is capable of using .\".Li x11alpha .\"device, you should try using that. If you specify .Ar gsdevice with a trailing '+', .Xr pnmscale 1 and .Xr pnmdepth 1 will be invoked for anti-aliasing. The default .Ar gsdevice is "pnmraw+". .El .\" .Sh KEY OPERATION The keyboard/mouse commands are: .Bl -tag -width indent .It mouse button 1 (leftmost button) Go forward a page. Space key, downward cursor key, scroll down key, "f" key, "j" key, and "n" key have the same effect. If <number> is specified, go forward <number> pages. .It mouse button 3 (rightmost button) Go to the previous page. "b" key, "k" key, "p" key, backspace key, scroll up key and upward cursor key have the same effect. If <number> is specified, go back <number> pages. .It 0 - 9 (number buttons) Set prefix number in decimal. i.e. <number> = <number> * 10 + <keyN> - <key0>. For example, by typing in "10g" you can jump to page 10. .It g Go to the <number> page. If number of 0 is specified, go to the last page. .It control key Display the page listing menu. See below for details. .It G Enable/disable page guide. See description for option .Fl G for details. .It x Enable/disable rakugaki (jotting) mode. You can make an annotation (by mouse) on the presentation. Mouse button 2 (middle) has the same effect. .It X Change the pen color for rakugaki (jotting) mode. .It t Enable/disable the timebar if -t timeslot option is specified. .It c Enable/disable forward page cache. .It w Toggle full screen mode with EWMH. (You need a EWMH-aware window manager and need to run mgp with -o or -g option) .It control-L Repaint the current page. Use this if you messed up the page by jotting too much. .It control-R Reload the current presentation file. If the current page becomes unavailable, page pointer will be moved back to 1. .It escape key Quit the currently running .Nm mgp . "q" key also has the same effect. .El .Pp During the presentation, you can see the page list at the bottom of the window when you press a Control Key. Choosing a page with the mouse and clicking it with the leftmost mouse button, you can go to corresponding page directly. Releasing the Control Key, the page list disappears and you can continue with the current page. This function is useful during the Q-and-A period after your presentation completes. .\" .Sh CONFIGURATION FILES .Nm will look at a file named .Pa ~/.mgprc in your home directory. The path to this file can be overriden with the environment variable MGPRC. The content of the file must be a limited set of magicpoint directives, one directive per line, without .Li % sign. Lines start with .Li # , or empty lines, will be silently ignored. See .Pa SYNTAX for eligible directives. .Pp .Nm imports various image draw functions from .Xr xloadimage 1 . This means that the location of image files can be specified by .Pa ~/.xloadimagerc file. If you specify the presentation file with its directory, that directory is searched first and then the path specified in the .Pa ~/.xloadimagerc is searched. .\" .Sh ENVIRONMENT .Bl -tag -width indent .It MGPRC Full path of the configuration file. When unset, ~/.mgprc is used. .\" .Sh SECURITY ISSUES The presentation file can include directives to call the external process, just like shell process. Therefore, the presentation file should be treated just like shell script or perl script. This is STRONGLY recommended to review the content of the presentation file before invoking .Nm mgp , if you got the file from others. By adding the .Fl S option to the command line argument, directives that call external processes will be skipped. .\" .Sh SEE ALSO .Xr mgp2ps 1 , .Xr xloadimage 1 , .Xr mgpembed 1 .\" .Sh AUTHOR CONTACT Yoshifumi Nishida <nishida@csl.sony.co.jp> .\" .Sh CONTRIBUTION Jun-ichiro Hagino <itojun@itojun.org>, Akira Kato <kato@wide.ad.jp>, Atsushi Onoe <onoe@sm.sony.co.jp>, Kazu Yamamoto <Kazu@Mew.org>, Youjiro Uo <yuo@nui.org>, and Masaki Minami <Masaki@Minami.org> extensively contributed improvements, bug fixes, and documents. Special thanks to Chaki Kusakari <chaki@sfc.wide.ad.jp>. .\" .Sh HISTORY .Nm was created shortly after the autumn camp of WIDE Project in 1997, which was originally called .Nm tp .Pq TinyPoint . �������������������������������������������kit/mgp.spec����������������������������������������������������������������������������������������0100644�0023745�0000000�00000003455�10554722750�0012623�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%define name magicpoint %define version 1.12b %define release 1 %define serial 1 %define prefix /usr/X11R6 Summary: X based presentation software. Name: %{name} Version: %{version} Release: %{release} Serial: %{serial} Copyright: BSD Group: Applications/Productivity URL: http://member.wide.ad.jp/wg/mgp/ Source: magicpoint-%{version}.tar.gz BuildRoot: /var/tmp/magicpoint-%{version}-root %description MagicPoint is an X11 based presentation tool. MagicPoint's presentation files (typically .mgp files) are plain text so you can create presentation files quickly with your favorite editor. %prep %setup -q -n magicpoint-%{version} %build CFLAGS="$RPM_OPT_FLAGS" ./configure --enable-gif --prefix=%{prefix} xmkmf -a CFLAGS="$RPM_OPT_FLAGS" \ make %install rm -rf $RPM_BUILD_ROOT make install install.man DESTDIR=$RPM_BUILD_ROOT %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc README SYNTAX USAGE %doc sample %{prefix}/bin/mgp %{prefix}/bin/mgp2ps %{prefix}/bin/mgpembed %{prefix}/bin/mgpnet %{prefix}/bin/xwintoppm %{prefix}/lib/X11/mgp/default.mgp %{prefix}/lib/X11/mgp/mgp1.jpg %{prefix}/lib/X11/mgp/mgp2.jpg %{prefix}/lib/X11/mgp/mgp3.jpg %dir %{prefix}/lib/X11/mgp %{prefix}/man/man1/mgp.1x.gz %{prefix}/man/man1/mgp2ps.1x.gz %{prefix}/man/man1/mgpembed.1x.gz %{prefix}/man/man1/mgpnet.1x.gz %{prefix}/man/man1/xwintoppm.1x.gz %changelog * Thu Nov 18 1999 Carlos Puchol <cpg@puchol.com> - added CFLAGS compilation to pick up from rpm configs - cleaned up spec file * Mon Jul 19 1999 Tim Powers <timp@redhat.com> - updated source to 1.05a - built for 6.1 * Thu Apr 15 1999 Michael Maher <mike@redhat.com> - built package for 6.0 * Fri Oct 08 1998 Michael Maher <mike@redhat.com> - updated source to 1.04a - built for 5.2 * Fri May 22 1998 Cristian Gafton <gafton@redhat.com> - built for PowerTools �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/mgp2ps.man��������������������������������������������������������������������������������������0100644�0023745�0000000�00000007240�10722064227�0013060�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.\" Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. Neither the name of the project nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" $Id: mgp2ps.man,v 1.14 2007/11/24 18:08:23 nishida Exp $ .\" .Dd November 1997 .Dt MGP2PS 1 .Os .Sh NAME .Nm mgp2ps .Nd generate PostScript file from MagicPoint file .Sh SYNOPSIS .Nm mgp2ps .Op Fl cirtV .Op Fl f Ar psfile .Op Fl p Ar papersize .Op Fl x Ar xmargin .Op Fl y Ar ymargin .Ar mgpfile .Sh DESCRIPTION .Nm mgp2ps is a converter from MagicPoint file .Ar mgpfile to PostScript file. If .Fl f option is specified, PostScript will be generated to .Ar psfile . Otherwise, printed to the standard output. .Pp If there exists .Nm foo.eps corresponding to .Nm foo.gif (or whatever), the encapsulated PostScript file will be included to the PostScript file instead. .Pp The following options are available: .Bl -tag -width indent .It Fl c Generate color PostScript file (experimental). By default .Nm will generate monochrome postscript file. .It Fl i Paint inside icon symbols. .It Fl r Stack the paper in reverse order. .It Fl V Be verbose. .It Fl f Ar psfile Pathname to put the PostScript output. .It Fl p Ar papersize .Ar papersize specifies the size of the paper to be used. .Li a3 , .Li a4 , .Li a5 , .Li b5 , .Li A3 , .Li A4 , .Li A5 , .Li B5 , .Li letter , .Li legal , .Li ledger , .Li tabloid , .Li statement , .Li executive , .Li folio , .Li quarto and .Li 10x14 are available. Default size is .Li a4 . .It Fl x Ar xmargin .It Fl y Ar ymargin .Ar xmargin and .Ar ymargin specifies length of the margin area around the edge of the paper. .It Fl t Use truetypefont instead of psfont (ASCII font only). .It Fl e Specify encodings. At this moment, "iso-8859-1", "latin1", "iso-8859-2" "and latin-2" are supported as encodings. .It Fl m emulate "%pause" directive. .It Fl X Ar engine Do not use rendering engine, specified by .Ar engine . .Ar engine can be only FreeType so far. .It Fl g Ar level specify the distance level between lines. If .Ar level is 0, the result will be close to the result of xft2 rendering. If others, it will be close to the result of other rendering engines. .El .Sh SEE ALSO .Xr mgp 1 .Sh HISTORY .Nm mgp2ps was created so that Kazu Yamamoto could submit his tutorial document to the committee of Internet Week '97. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/mgpembed.man������������������������������������������������������������������������������������0100644�0023745�0000000�00000004251�06570716523�0013440�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.\" Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. Neither the name of the project nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" $Id: mgpembed.man,v 1.3 1998/08/26 05:29:55 itojun Exp $ .\" .Dd August 1998 .Dt MGPEMBED 1 .Os .Sh NAME .Nm mgpembed .Nd generate an embedded MagicPoint file .Sh SYNOPSIS .Nm mgpembed .Op Fl o Ar outfile .Ar mgpfile .Sh DESCRIPTION .Nm mgpembed is a converter from a MagicPoint file .Ar mgpfile to a embedded MagicPoint file. A embedded MagicPoint file is suitable to give a presentation file to other guys via Email or via Web because external references (except shell commands) are resolved. .Fl o option specifies that the output will be saved to .Ar outfile . Otherwise, the standard output is used. .Sh SEE ALSO .Xr mgp 1 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/mgpembed.pl.in����������������������������������������������������������������������������������0100755�0023745�0000000�00000006006�07520755363�0013711�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! @mgp_cv_path_perl@ # # generate "embedded" mgp file: # o image/bimage filenames are replaced and corresponding uuencoded # (gzipped if applicable) files are concatenated in %embed/%endembed # o resolve %include directives # - each image should be searched in the paths specified in ~/.xloadimagerc # and app-defaults/Xloadimage # - do we need work for .mgprc ? # - scramble file names when desired $cat = "/bin/cat"; $gzip = "@mgp_cv_path_gzip@"; $uuencode = "@mgp_cv_path_uuencode@"; if (! -x $gzip || ! -x $uuencode) { die "external program not found. manual configuration required.\n" } require 'getopts.pl'; # specify suffixes we should gzip files before uuencoding @gzipsuffix = (".ps", ".xbm"); do Getopts('o:'); if ($#ARGV != 0) { do usage(); # NOTREACHED } $infname = $ARGV[0]; undef %files; if (defined($opt_o)) { $outfname = $opt_o; die "$outfname already exists\n" if -f $outfname; die "$outfname is specified for both input/output\n" if ($outfname eq $infname); open(OUT, "> $outfname") || die "Can not open $outfname: $!"; } else { open(OUT, ">& STDOUT"); } # read the file, process %include directives do readfile($infname, 'INPUT000'); # append embedded files using %embed/%endembed directives foreach $efile (keys %files) { # check if gzipped first $docompress = 0; foreach $suffix (@gzipsuffix) { if ($efile =~ /$suffix$/) { $docompress = 1; last; } } if ($docompress) { $target = "$efile.gz"; $compress = "$gzip -c $files{$efile}"; } else { $target = "$efile"; $compress = "$cat $files{$efile}"; } print OUT "\n\%embed \"$target\"\n"; open(PIPE, "$compress | $uuencode $target |") || die "Can not execute uuencode on $target"; while (<PIPE>) { next if (/^begin/ || /^end/); print OUT; } print OUT "%endembed\n"; } close(OUT); sub readfile { local($filename, $input) = @_; local($fname, $fname0); $input++; open($input, $filename) || die "Can not open $filename: $!\n"; while (<$input>) { if (/^%%/) { print OUT; next; } if (/^%(.*)image\s+/i) { $prefix = $1; $postfix = $'; if ($postfix =~ /\"([^"]*)\"/) { # "]*)\"/) { # (workaround for bug in Emacs Perl-syntax) $fname = $1; } elsif ($b =~ /^(\S+)/) { $fname = $1; } $base = $fname; $base =~ s/^.+\///; # # check $base uniqueness here # $orgbase = $base; $index = 0; while (defined($files{$base})) { $base = $orgbase . "-" . "$index"; $index++; } $files{$base} = $fname; $embfn = "EMBEDDIR/" . $base; $postfix =~ s/\"$fname\"/\"$embfn\"/; print OUT '%'; print OUT "$prefix"; print OUT "image $postfix"; } elsif (/^%(.*)include\s+(\S+)(.*)$/i) { $incfname = $2; if ($incfname =~ /^\"(.+)\"$/) { $incfname = $1; } print OUT "\%\%\%\%\%\%\%\%\%\%INCLUDE $incfname\n"; do readfile($incfname, $input); print OUT "\%\%\%\%\%\%\%\%\%\%INCLUDE-END $incfname\n"; } else { print OUT; next; } } close($input); } sub usage { print STDERR "usage: mgpembed [-o outfile ] mgpfile\n"; exit -1; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/mng.c�������������������������������������������������������������������������������������������0100644�0023745�0000000�00000021755�10115243410�0012074�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * modified by Yoshifumi Nishida <nishida@csl.sony.co.jp> for magicpoint */ /* mngplay $Date: 2004/09/01 03:50:32 $ Ralph Giles <giles@ashlu.bc.ca> This program my be redistributed under the terms of the GNU General Public Licence, version 2, or at your preference, any later version. (this assuming there's no problem with libmng not being GPL...) this is an SDL based mng player. the code is very rough; patches welcome. */ /* * $Id: mng.c,v 1.2 2004/09/01 03:50:32 nishida Exp $ */ #ifdef MNG #include <sys/time.h> #include <libmng.h> #include "mgp.h" static GC gcmng; static Display *mngdisplay; static int mngscreen; static Visual *mngvisual; static mng_handle mng; /* structure for keeping track of our mng stream inside the callbacks */ typedef struct { FILE *file; /* pointer to the file we're decoding */ char *filename; /* pointer to the file's path/name */ Image *image; Window window; mng_uint32 delay; /* ticks to wait before resuming decode */ } mngstuff; void mng_window_setup __P((mngstuff *mymng, int x, int y, int width, int height)); /* callbacks for the mng decoder */ /* memory allocation; data must be zeroed */ mng_ptr mymngalloc(mng_uint32 size) { return (mng_ptr)calloc(1, size); } /* memory deallocation */ void mymngfree(mng_ptr p, mng_uint32 size) { free(p); return; } mng_bool mymngopenstream(mng_handle mng) { mngstuff *mymng; /* look up our stream struct */ mymng = (mngstuff*)mng_get_userdata(mng); /* open the file */ mymng->file = fopen(mymng->filename, "rb"); if (mymng->file == NULL) { fprintf(stderr, "unable to open '%s'\n", mymng->filename); return MNG_FALSE; } return MNG_TRUE; } mng_bool mymngclosestream(mng_handle mng) { mngstuff *mymng; /* look up our stream struct */ mymng = (mngstuff*)mng_get_userdata(mng); /* close the file */ fclose(mymng->file); mymng->file = NULL; /* for safety */ return MNG_TRUE; } /* feed data to the decoder */ mng_bool mymngreadstream(mng_handle mng, mng_ptr buffer, mng_uint32 size, mng_uint32 *bytesread) { mngstuff *mymng; /* look up our stream struct */ mymng = (mngstuff*)mng_get_userdata(mng); /* read the requested amount of data from the file */ *bytesread = fread(buffer, 1, size, mymng->file); return MNG_TRUE; } /* the header's been read. set up the display stuff */ mng_bool mymngprocessheader(mng_handle mng, mng_uint32 width, mng_uint32 height) { mngstuff *mymng; Image *image; Visual *get_visual(); image = (Image *)malloc(sizeof(Image)); image->type= ITRUE; image->title= strdup(""); image->rgb.used= image->rgb.size= 0; image->width= width; image->height= height; image->depth= 24; image->pixlen= 3; image->data = (char *)malloc(width * height * 24); if (image->data == NULL){ fprintf(stderr, "unable to allocate %dx%d video memory \n", width, height); return MNG_FALSE; } /* save the image pointer */ mymng = (mngstuff*)mng_get_userdata(mng); mymng->image = image; /* tell the mng decoder about our bit-depth choice */ /* FIXME: this works on intel. is it correct in general? */ mng_set_canvasstyle(mng, MNG_CANVAS_RGB8); return MNG_TRUE; } /* return a row pointer for the decoder to fill */ mng_ptr mymnggetcanvasline(mng_handle mng, mng_uint32 line) { mngstuff *mymng; mng_ptr row; /* dereference our structure */ mymng = (mngstuff*)mng_get_userdata(mng); /* we assume any necessary locking has happened outside, in the frame level code */ row = mymng->image->data + mymng->image->pixlen * mymng->image->width * line; return (row); } /* timer */ mng_uint32 mymnggetticks(mng_handle mng) { struct timeval now; mng_uint32 ticks; gettimeofday(&now, NULL); ticks=(now.tv_sec)*1000+(now.tv_usec)/1000; return(ticks); } mng_bool mymngrefresh(mng_handle mng, mng_uint32 x, mng_uint32 y, mng_uint32 w, mng_uint32 h) { XImageInfo *ximageinfo; mngstuff *mymng; /* dereference our structure */ mymng = (mngstuff*)mng_get_userdata(mng); ximageinfo= imageToXImage(mngdisplay, mngscreen, mngvisual, depth, mymng->image, 0, 0, 0, 0); if (ximageinfo == NULL) { fprintf(stderr, "Cannot convert Image to XImage\n"); exit(-1); } XPutImage(mngdisplay, mymng->window, gcmng, ximageinfo->ximage, 0, 0, 0, 0, mymng->image->width, mymng->image->height); freeXImage(ximageinfo->ximage, ximageinfo); return MNG_TRUE; } /* interframe delay callback */ mng_bool mymngsettimer(mng_handle mng, mng_uint32 msecs) { mngstuff *mymng; /* look up our stream struct */ mymng = (mngstuff*)mng_get_userdata(mng); /* set the timer for when the decoder wants to be woken */ mymng->delay = msecs; return MNG_TRUE; } mng_bool mymngerror(mng_handle mng, mng_int32 code, mng_int8 severity, mng_chunkid chunktype, mng_uint32 chunkseq, mng_int32 extra1, mng_int32 extra2, mng_pchar text) { mngstuff *mymng; char chunk[5]; /* dereference our data so we can get the filename */ mymng = (mngstuff*)mng_get_userdata(mng); /* pull out the chuck type as a string */ // FIXME: does this assume unsigned char? chunk[0] = (char)((chunktype >> 24) & 0xFF); chunk[1] = (char)((chunktype >> 16) & 0xFF); chunk[2] = (char)((chunktype >> 8) & 0xFF); chunk[3] = (char)((chunktype ) & 0xFF); chunk[4] = '\0'; /* output the error */ return (0); } void mymngquit() { mngstuff *mymng; /* dereference our data so we can free it */ mymng = (mngstuff*)mng_get_userdata(mng); XDestroyWindow(display, mymng->window); /* cleanup. this will call mymngclosestream */ mng_cleanup(&mng); /* free our data */ free(mymng); /* quit */ exit(0); } int checkevents(mng_handle mng) { /* not implemented yet */ } void mngload(mngfile, x, y, width, height) char *mngfile; int x, y; int width, height; { mngstuff *mymng; u_int myretcode; signal(SIGTERM, mymngquit); /* allocate our stream data structure */ mymng = (mngstuff*)calloc(1, sizeof(*mymng)); if (mymng == NULL) { fprintf(stderr, "could not allocate stream structure.\n"); exit(0); } /* pass the name of the file we want to play */ mymng->filename = mngfile; /* set up the mng decoder for our stream */ mng = mng_initialize(mymng, mymngalloc, mymngfree, MNG_NULL); if (mng == MNG_NULL) { fprintf(stderr, "could not initialize libmng.\n"); exit(1); } /* set the callbacks */ mng_setcb_errorproc(mng, mymngerror); mng_setcb_openstream(mng, mymngopenstream); mng_setcb_closestream(mng, mymngclosestream); mng_setcb_readdata(mng, mymngreadstream); mng_setcb_gettickcount(mng, mymnggetticks); mng_setcb_settimer(mng, mymngsettimer); mng_setcb_processheader(mng, mymngprocessheader); mng_setcb_getcanvasline(mng, mymnggetcanvasline); mng_setcb_refresh(mng, mymngrefresh); /* FIXME: should check for errors here */ myretcode = mng_set_suspensionmode(mng, MNG_TRUE); if (myretcode != MNG_NOERROR){ fprintf(stderr, "something happen.\n"); exit(-1); } mng_window_setup(mymng, x, y, width, height); mng_readdisplay(mng); /* loop though the frames */ while (mymng->delay) { usleep(mymng->delay * 1000); /* reset the delay in case the decoder doesn't update it again */ mymng->delay = 0; mng_display_resume(mng); /* check for user input (just quit at this point) */ checkevents(mng); } } void mng_window_setup(mymng, x, y, width, height) mngstuff *mymng; int x, y; int width, height; { Visual *get_visual(); if (!mngdisplay){ if ((mngdisplay = XOpenDisplay(NULL)) == NULL) { fprintf(stderr, "Can't open display\n"); exit(-1); } mngscreen = DefaultScreen(mngdisplay); mngvisual = get_visual(mngdisplay, mngscreen, &depth); } mymng->window = XCreateSimpleWindow(mngdisplay, window, 0, 0, width, height, 0, WhitePixel(display, 0), WhitePixel(display, 0)); XMoveWindow(mngdisplay, mymng->window, x, y); XMapRaised(mngdisplay, mymng->window); XFlush(mngdisplay); if (!gcmng) gcmng = XCreateGC(mngdisplay, mymng->window, 0, 0); } void mngpreload(state, mngfile, width, height) struct render_state *state; char *mngfile; int *width, *height; { mngstuff *mymng; mng_handle mng; u_int myretcode; /* allocate our stream data structure */ mymng = (mngstuff*)calloc(1, sizeof(*mymng)); if (mymng == NULL) { fprintf(stderr, "could not allocate stream structure.\n"); exit(0); } /* pass the name of the file we want to play */ mymng->filename = mngfile; /* set up the mng decoder for our stream */ mng = mng_initialize(mymng, mymngalloc, mymngfree, MNG_NULL); if (mng == MNG_NULL) { fprintf(stderr, "could not initialize libmng.\n"); exit(1); } /* set the callbacks */ mng_setcb_errorproc(mng, mymngerror); mng_setcb_openstream(mng, mymngopenstream); mng_setcb_closestream(mng, mymngclosestream); mng_setcb_readdata(mng, mymngreadstream); mng_setcb_gettickcount(mng, mymnggetticks); mng_setcb_settimer(mng, mymngsettimer); mng_setcb_processheader(mng, mymngprocessheader); mng_setcb_getcanvasline(mng, mymnggetcanvasline); mng_setcb_refresh(mng, mymngrefresh); /* FIXME: should check for errors here */ mng_read(mng); *width = mymng->image->width; *height = mymng->image->height; mng_cleanup(&mng); free(mymng); } #endif �������������������kit/parse.c�����������������������������������������������������������������������������������������0100644�0023745�0000000�00000122774�10722060340�0012433�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: parse.c,v 1.103 2007/11/24 17:35:28 nishida Exp $ */ #include "mgp.h" #ifdef HAVE_FCNTL_H # include <fcntl.h> #endif static struct ctrl *parse_text __P((char *, u_int)); static void read_rc __P((FILE *, char *)); static void read_file __P((FILE *, char *, u_int *, u_int *, int)); static void secondpass __P((void)); static void thirdpass __P((void)); static void debug __P((void)); static int define_font __P((struct ctrl *)); static struct ctrl *find_font __P((char *)); static char* clear_esc __P((char*)); /*image*/ extern int findImage __P((char *, char *)); /* lex/yacc variables */ extern int n_errors; extern struct ctrl *root; extern char *yyfilename; extern int yylineno; /* Prevent warning if -Wall. */ #ifdef __GNUC__ extern void lex_init(u_char *); extern int yyparse (void); #endif static int filterval = 0; void load_file(filename) char *filename; { FILE *fp; u_int page; u_int line; char rc[MAXPATHLEN]; char *dir; page = 1; line = 0; if((dir = getenv("MGPRC"))!=0) { fp = fopen(dir,"r"); if(fp != NULL) { read_rc(fp,dir); } else { fprintf(stderr,"cannot open MGPRC File '%s'!\n",dir); } } else { dir = getenv("HOME"); if (dir) { snprintf(rc, sizeof(rc), "%s/%s", dir, RCFILE); fp = fopen(rc, "r"); if (fp) { read_rc(fp, rc); fclose(fp); } } } if ((fp = fopen(filename, "r")) == NULL) { fprintf(stderr, "can't open %s\n", filename); exit(-1); } read_file(fp, filename, &page, &line, 1); fclose(fp); secondpass(); thirdpass(); if (parse_debug) debug(); } void cleanup_file() { u_int line; u_int page; for (line = 0; line < MAXLINE; line ++) { if (default_control[line]) { ctlfree(default_control[line]); default_control[line] = NULL; } if (init_control[line]) { ctlfree(init_control[line]); init_control[line] = NULL; } } for (page = 0; page < MAXPAGE; page ++) { for (line = 0; line < MAXLINE; line ++) { if (!page_control[page][line]) continue; ctlfree(page_control[page][line]); page_control[page][line] = NULL; } memset(&page_attribute[page], 0, sizeof(page_attribute[page])); } for (line = 0; line < MAXTAB + MAXSTYLE; line++) { if (!tab_control[line]) continue; ctlfree(tab_control[line]); tab_control[line] = NULL; } for (line = 0; line < MAXFONTDEF; line++) { if (!fontdef_control[line]) continue; ctlfree(fontdef_control[line]); fontdef_control[line] = NULL; } } /* * clear the given data from escape sequences, so identifying * a character by its hexadecimal value is possible by using \xHH */ static char* clear_esc(s) char* s; { char* p; int len; int i; int j; int k; int error = 0; int unicode = 0; int chars; unsigned int code; i = j = 0; len = strlen(s); p = (char*)malloc(len + 1); while (i < len) { code = 0x0; /* * expecting either beginning of unicode or * an ascii-character (may be an escape sequence) */ if (!unicode) { /* beginning of unicode */ if (s[i] == 0x1b && s[i+1] == '$' && '@' <= s[i+2] && s[i+2] < 'C') { unicode = 1; for (chars = 0; chars < 3; chars++) p[j++] = s[i++]; continue; } /* backslash */ if (s[i] == 0x5c) { i++; /* any escape sequence */ if (s[i] != 0x5c) { /* hexadecimal token: \xHH */ if ((s[i] == 'x' || s[i] == 'X') && i+2 < len) { i++; if (isxdigit(s[i]) && isxdigit(s[i+1])) { for (k = 2; k > 0; k--, i++) { code <<= 4; if (isdigit(s[i])) code += s[i] - 48; else code += tolower(s[i]) - 87; } } else error = 1; } else error = 1; } } if (error) return (char*) NULL; if (code == 0x0) p[j++] = s[i++]; else p[j++] = code; } else { /* * expecting either the end of unicode or * a part of a unicode character */ /* end of unicode */ if (s[i] == 0x1b && s[i+1] == '(' && (s[i+2] == 'B' || s[i+2] == 'J')) { unicode = 0; for (chars = 0; chars < 3; chars++) p[j++] = s[i++]; continue; } /* just take the unicode character */ p[j++] = s[i++]; } } p[j] = 0x0; strcpy(s, p); free(p); return s; } static struct ctrl * parse_text(p, page) char *p; u_int page; { struct ctrl sentinel; struct ctrl *cp; assert(p); cp = &sentinel; cp->ct_next = ctlalloc1(CTL_TEXT); if (!cp->ct_next) { ctlfree(cp); return NULL; } cp = cp->ct_next; cp->ct_page = page; cp->ctc_value = strdup(p); return sentinel.ct_next; } /* * read ~/.mgprc: there's no percentage sign */ static void read_rc(fp, filename) FILE *fp; char *filename; { char buf[BUFSIZ]; #if 0 struct ctrl *cp; #endif int lineno; if (2 <= parse_debug) fprintf(stderr, "read_rc(%s):\n", filename); lineno = 0; while (fgets(buf, sizeof(buf), fp) != NULL) { lineno++; if (buf[strlen(buf) - 1] == '\n') buf[strlen(buf) - 1] = '\0'; if (buf[0] == '#' || !buf[0]) continue; yyfilename = filename; yylineno = lineno; lex_init(buf); if (yyparse() || n_errors) { fprintf(stderr, "%s:%d: fatal syntax error detected\n", filename, lineno); exit(-1); } if (!root) { fprintf(stderr, "%s:%d: something bad happened\n", filename, lineno); exit(-1); } if (2 <= parse_debug) { fprintf(stderr, "%s:%d: %s\n", filename, lineno, buf); debug1(root); } switch (root->ct_op) { #if 0 case CTL_DEFFONT: /* safety check */ for (cp = root; cp; cp = cp->ct_next) { if (cp->ct_op == CTL_FONT) { fprintf(stderr, "%s:%d: %%font used in %%deffont, which is disallowed\n", filename, lineno); exit(-1); } } if (define_font(root) < 0) { fprintf(stderr, "%s:%d: could not define " "font \"%s\"\n", filename, lineno, root->ctc_value); exit(-1); } break; #endif #ifdef VFLIB case CTL_VFCAP: vfcap_name = root->ctc_value; break; #endif #ifdef FREETYPE case CTL_TFDIR: freetypefontdir = root->ctc_value; break; case CTL_TFONT0: freetypefont0 = root->ctc_value; break; case CTL_TMFONT0: freetypemfont0 = root->ctc_value; break; #endif case CTL_NOOP: /* done in grammar.y */ break; default: fprintf(stderr, "%s:%d: operator disallowed:\n\t", filename, lineno); debug0(root); exit(-1); } } } static void read_file(fp, filename, page, line, preamble) FILE *fp; char *filename; u_int *page; u_int *line; int preamble; { char buf[BUFSIZ]; char buf2[BUFSIZ]; struct ctrl **ch; struct ctrl *cp; struct ctrl *p; int line_cont; char *infilename; struct ctrl *filtermode; int filterfd = -1; char filtername[MAXPATHLEN]; pid_t filterpid = -1; void (*filtersig)() = (void (*)())NULL; int lineno; static char *searchpath[] = { "", /*mgp_fname*/ #ifdef MGPLIBDIR MGPLIBDIR "/", #endif NULL, }; if (2 <= parse_debug) fprintf(stderr, "read_file(%s):\n", filename); filtername[0] = '\0'; lineno = 0; if (!preamble) goto page; /* * default analysis in preamble */ while (fgets(buf, sizeof(buf), fp) != NULL) { lineno++; if (buf[strlen(buf) - 1] == '\n') buf[strlen(buf) - 1] = '\0'; if (buf[0] == '#') continue; if (buf[0] != '%') { fprintf(stderr, "%s:%d: no text allowed in preamble; " "ignored\n", filename, lineno); continue; } if (buf[1] == '%') continue; yyfilename = filename; yylineno = lineno; lex_init(buf + 1); if (yyparse() || n_errors) { fprintf(stderr, "%s:%d: fatal syntax error detected\n", filename, lineno); exit(-1); } if (!root) { fprintf(stderr, "%s:%d: something bad happened\n", filename, lineno); exit(-1); } if (2 <= parse_debug) debug1(root); switch (root->ct_op) { case CTL_PAGE: goto page; case CTL_INCLUDE: { FILE *infp; infilename = root->ctc_value; searchpath[0] = mgp_fname; infp = fsearchopen(infilename, "r", searchpath); if (infp == NULL) { fprintf(stderr, "%s:%d: can't open " "include file \"%s\"\n", filename, lineno, infilename); exit(-1); } read_file(infp, infilename, page, line, 1); fclose(infp); continue; } case CTL_DEFAULT: ch = &default_control[root->cti_value - 1]; if (*ch) ctlappend(*ch, root->ct_next); else *ch = root->ct_next; break; case CTL_TAB: { int i = root->cti_value; if (i < 0) { fprintf(stderr, "%s:%d: " "invalid tab index %d\n", filename, lineno, root->cti_value); exit(-1); } if (i >= MAXTAB) { /*XXX*/ /* must be a string */ /* find a free entry */ for (i = MAXTAB ; i < MAXTAB + MAXSTYLE ; i++) { if (!tab_control[i]) continue; if (strcmp(tab_control[i]->ctc_value, root->ctc_value) == 0) { ctlfree(tab_control[i]); tab_control[i] = NULL; break; } } for (i = MAXTAB ; i < MAXTAB + MAXSTYLE ; i++) { if (!tab_control[i]) break; } if (i == MAXTAB + MAXSTYLE) { fprintf(stderr, "%s:%d: " "too many styles\n", filename, lineno); exit(-1); } } ch = &tab_control[i]; if (*ch) ctlappend(*ch, root->ct_next); else if (i < MAXTAB) *ch = root->ct_next; else *ch = root; /* keep name as well */ } break; case CTL_DEFFONT: /* safety check */ for (cp = root; cp; cp = cp->ct_next) { if (cp->ct_op == CTL_FONT) { fprintf(stderr, "%s:%d: %%font used in %%deffont, which is disallowed\n", filename, lineno); exit(-1); } } if (define_font(root) < 0) { fprintf(stderr, "%s:%d: could not define " "font \"%s\"\n", filename, lineno, root->ctc_value); exit(-1); } break; default: fprintf(stderr, "%s:%d: invalid operator\n", filename, lineno); exit(-1); } } /* * page analysis */ page: line_cont = 0; filtermode = NULL; command: while (fgets(buf, sizeof(buf), fp) != NULL) { lineno++; if (filtermode && strncmp(buf, "%endfilter", 10) != 0) { write(filterfd, buf, strlen(buf)); continue; } { char *p, *q, *s; int cnt; /* counter for backslashes at the end of a line */ p = buf + strlen(buf); if (buf < p && p[-1] == '\n') { p--; *p = '\0'; } while (buf < p && p - buf < sizeof(buf) && p[-1] == '\\') { /* * check for quoted backslashes at the end of a line: * if it is so, then do NOT ignore the line break and * continue as usual */ s = p; cnt = 0; while (buf < s && s[-1] == '\\') { s--; cnt++; } if (cnt % 2 == 0) break; p--; if (fgets(buf2, sizeof(buf) - (p - buf), fp) == NULL) break; q = buf2; /* ignore blanks */ while (*q && isspace(*q)) q++; strncpy(p, q, sizeof(buf) - (p - buf)); p[sizeof(buf) - (p - buf) -1] = '\0'; p += strlen(p); if (buf < p && p[-1] == '\n') { p--; *p = '\0'; } } } if (buf[0] == '#') continue; if (buf[0] == '%') { /* this is directive */ int pb; int ct; int prevfiltermode; if (buf[1] == '%') continue; prevfiltermode = filtermode ? 1 : 0; yyfilename = filename; yylineno = lineno; lex_init(buf + 1); if (yyparse() || n_errors) { fprintf(stderr, "%s:%d: fatal syntax error detected !!!\n", filename, lineno); exit(-1); } if (!root) { fprintf(stderr, "%s:%d: something bad happened\n", filename, lineno); exit(-1); } if (2 <= parse_debug) debug1(root); cp = root; pb = ct = 0; for (p = cp; p; p = p->ct_next) { switch (p->ct_op) { case CTL_PAGE: pb++; break; case CTL_NODEF: page_attribute[*page].pg_flag |= PGFLAG_NODEF; break; case CTL_CONT: ct++; break; case CTL_FILTER: filtermode = p; break; case CTL_ENDFILTER: filtermode = NULL; break; case CTL_EMBED: embed_file(fp, p, &lineno); goto command; } } /* filter */ if (!prevfiltermode && filtermode) { int filtertmp; int pipefd[2]; if (mgp_flag & FL_NOFORK) { int i; if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "%s:%d: %%filter ", filename, lineno); for (i = 0; i < cp->cta_argc; i++) { fprintf(stderr, "%c%s", (i == 0) ? '"' : ' ', cp->cta_argv[i]); } fprintf(stderr, "\": " "directive skipped\n"); } filterfd = open("/dev/null", O_WRONLY); strcpy(filtername, "/dev/null"); continue; } sprintf(filtername, "/tmp/%d.%ld.%d", getpid(), (long)time(NULL), filterval++); filtertmp = open(filtername, O_CREAT|O_WRONLY, 0644); if (filtertmp < 0) { fprintf(stderr, "%s:%d: cannot open file tmp file " "for filter\n", filename, lineno); exit(-1); } if (pipe(pipefd) < 0) { fprintf(stderr, "%s:%d: cannot open pipe for " "filter\n", filename, lineno); exit(-1); } filterpid = fork(); if (filterpid < 0) { perror("fork"); exit(1); } else if (filterpid == 0) { close(pipefd[1]); close(STDIN_FILENO); dup2(pipefd[0], STDIN_FILENO); close(pipefd[0]); close(STDOUT_FILENO); dup2(filtertmp, STDOUT_FILENO); close(STDERR_FILENO); dup2(filtertmp, STDERR_FILENO); close(filtertmp); execvp(filtermode->cta_argv[0], (char **)filtermode->cta_argv); } else { close(filtertmp); close(pipefd[0]); filterfd = pipefd[1]; filtersig = signal(SIGCHLD, SIG_DFL); } continue; } else if (prevfiltermode && !filtermode && filtername[0]) { FILE *filterfp; int estat; if (mgp_flag & FL_NOFORK) { close(filterfd); filtername[0] = '\0'; continue; } close(filterfd); waitpid(filterpid, &estat, 0); signal(SIGCHLD, filtersig); filterfp = fopen(filtername, "r"); if (filterfp == NULL) { fprintf(stderr, "%s:%d: cant read " "filter output\n", filename, lineno); exit(-1); } read_file(filterfp, filtername, page, line, 0); fclose(filterfp); unlink(filtername); filtername[0] = '\0'; continue; } if (pb) { /* Seen pagebreak. */ page_attribute[*page].pg_linenum = *line; *page = *page + 1; *line = 0; continue; } if (ct) line_cont = 1; if (cp) { /* * append to the currently existing * page struct. */ ch = &page_control[*page][*line]; #if 0 if (!line_cont && (/* cp->ct_op == CTL_IMAGE || */ cp->ct_op == CTL_BAR)) { struct ctrl *cp1; cp1 = ctlalloc1(CTL_LINESTART); if (cp1) { if (!*ch) *ch = cp1; else ctlappend(*ch, cp1); } } #endif if (!*ch) *ch = cp; else ctlappend(*ch, cp); /* * special case: %image and %bar has to be * treated as independent item */ if (cp->ct_op == CTL_IMAGE || cp->ct_op == CTL_ANIM || cp->ct_op == CTL_BAR) { line_cont = 0; *line = *line + 1; } } } else { /* this is data */ /* * escape # and % by backslash (at the beginning * of a line) */ if (buf[0] == 0x5c && (buf[1] == 0x23 || buf[1] == 0x25)) memcpy(&buf[0], &buf[1], strlen(buf)); /* * clear escape sequences */ #if 1 if (clear_esc(buf) == NULL) { fprintf(stderr, "%s:%d: unknown escape" " sequence\n", filename, lineno); exit(-1); } #endif cp = parse_text(buf, *page); if (cp) { ch = &page_control[*page][*line]; if (!*ch) *ch = cp; else ctlappend(*ch, cp); } line_cont = 0; *line = *line + 1; } } /* Treat as we've seen pagebreak. See the above comment for detail. */ page_attribute[*page].pg_linenum = *line; #if 0 *page = *page + 1; *line = 0; #endif maxpage = *page; } /* * rather simple rewrites. */ static void secondpass() { u_int page; u_int l, text; struct ctrl **ch; struct ctrl *cp; struct ctrl *cp1; /* * add CTL_PAUSE to the last line of a page. * we don't add one at the last page, intentionally. */ for (page = 1; page < maxpage; page++) { l = page_attribute[page].pg_linenum; ch = &page_control[page][l + 1]; cp = ctlalloc1(CTL_PAUSE); if (cp) { cp->cti_value = 1; /* 1 indicates page end */ if (!*ch) *ch = cp; else ctlappend(*ch, cp); } page_attribute[page].pg_linenum++; } /* * split GAP into VGAP and HGAP. */ for (page = 1; page <= maxpage; page++) { text = 1; for (l = 0; l <= page_attribute[page].pg_linenum; l++) { for (cp = page_control[page][l]; cp; cp = cp->ct_next) { if (cp->ct_op == CTL_GAP) { cp->ct_op = CTL_VGAP; cp1 = ctlalloc1(CTL_HGAP); cp1->cti_value = cp->cti_value; cp1->ct_next = cp->ct_next; cp->ct_next = cp1->ct_next; } /* * check if this page contains only texts */ if (cp->ct_op == CTL_BIMAGE || cp->ct_op == CTL_BGRAD || cp->ct_op == CTL_IMAGE || #ifdef MNG cp->ct_op == CTL_ANIM || #endif /* MNG */ (cp->ct_op == CTL_PAUSE && l != page_attribute[page].pg_linenum)) { text = 0; } } } page_attribute[page].pg_text = text; } /* CTL_PREFIX in tab_control should be CTL_TABPREFIX. */ for (l = 0; l < MAXTAB + MAXSTYLE; l++) { for (cp = tab_control[l]; cp; cp = cp->ct_next) { if (cp->ct_op == CTL_PREFIX) cp->ct_op = CTL_TABPREFIX; if (cp->ct_op == CTL_PREFIXN) cp->ct_op = CTL_TABPREFIXN; } } } /* * rather complex rewrites. ordering is VERY important. */ static void thirdpass() { u_int page; u_int line; u_int l; struct ctrl **ch; struct ctrl *cp; struct ctrl *cp1; struct ctrl *cp2; struct ctrl *cpt; char *p; struct ctrl *carryover[MAXPAGE]; { /* * there are several control items that are to be carried * over to the next line. make them explicit so that there'll * be no bogus control items to be used when we go back a page. */ struct ctrl *tmpstr[10]; struct ctrl *tmpint[10]; struct ctrl *tmplong[10]; struct ctrl *tmpvoid[10]; struct ctrl *tmparea[10]; struct ctrl sentinel; int i; memset(carryover, 0, sizeof(carryover)); memset(tmpstr, 0, sizeof(tmpstr)); memset(tmpint, 0, sizeof(tmpint)); memset(tmplong, 0, sizeof(tmplong)); memset(tmpvoid, 0, sizeof(tmpvoid)); memset(tmparea, 0, sizeof(tmparea)); /* default value for page 1 */ tmpstr[0] = ctlalloc1(CTL_PREFIX); tmpstr[0]->ctc_value = strdup(""); #if defined(VFLIB) && defined(VFONT) tmpstr[1] = ctlalloc1(CTL_VFONT); tmpstr[1]->ctc_value = strdup(VFONT); /*XXX*/ #else tmpstr[1] = ctlalloc1(CTL_NOOP); tmpstr[1]->ctc_value = strdup(""); #endif tmpstr[2] = ctlalloc1(CTL_XFONT2); tmpstr[2]->ctc2_value1 = strdup(DEFAULT_X_FONT); tmpstr[2]->ctc2_value2 = strdup("iso8859-1"); #ifdef FREETYPE tmpstr[3] = ctlalloc1(CTL_TFONT); tmpstr[3]->ctc2_value1 = strdup(freetypefont0 ? freetypefont0 :"arial.ttf"); tmpstr[3]->ctc2_value2 = strdup("iso8859-1"); #else tmpstr[3] = ctlalloc1(CTL_NOOP); /* CTL_TFONT */ tmpstr[3]->ctc_value = strdup(""); #endif #ifdef FREETYPE_CHARSET16 tmpstr[4] = ctlalloc1(CTL_TMFONT); /* CTL_TMFONT */ tmpstr[4]->ctc_value = strdup("wadalab-gothic.ttf"); #else tmpstr[4] = ctlalloc1(CTL_NOOP); /* CTL_TMFONT */ tmpstr[4]->ctc_value = strdup(""); #endif tmpstr[5] = ctlalloc1(CTL_XFONT2); tmpstr[5]->ctc2_value1 = strdup("k14"); tmpstr[5]->ctc2_value2 = strdup("jisx0208.1983-*"); #ifdef USE_M17N if (! (mgp_flag & FL_NOM17N)) { tmpstr[6] = ctlalloc1(CTL_M17N); tmpstr[6]->ctc2_value1 = strdup("fontset"); tmpstr[6]->ctc2_value2 = NULL; tmpstr[7] = ctlalloc1(CTL_M17N); tmpstr[7]->ctc2_value1 = strdup("family"); tmpstr[7]->ctc2_value2 = NULL; tmpstr[8] = ctlalloc1(CTL_M17N); tmpstr[8]->ctc2_value1 = strdup("language"); tmpstr[8]->ctc2_value2 = NULL; } else #endif { tmpstr[6] = ctlalloc1(CTL_NOOP); tmpstr[6]->ctc_value = strdup(""); tmpstr[7] = ctlalloc1(CTL_NOOP); tmpstr[7]->ctc_value = strdup(""); tmpstr[8] = ctlalloc1(CTL_NOOP); tmpstr[8]->ctc_value = strdup(""); } tmplong[0] = ctlalloc1(CTL_FORE); get_color(DEFAULT_FORE, &tmplong[0]->ctl_value); tmplong[1] = ctlalloc1(CTL_BACK); get_color(DEFAULT_BACK, &tmplong[1]->ctl_value); tmplong[2] = ctlalloc1(CTL_CCOLOR); get_color(DEFAULT_FORE, &tmplong[2]->ctl_value); tmpint[0] = ctlalloc1(CTL_SIZE); tmpint[0]->ctf_value = DEFAULT_CHARSIZE; tmpint[1] = ctlalloc1(CTL_HGAP); tmpint[1]->cti_value = DEFAULT_HGAP; tmpint[2] = ctlalloc1(CTL_VGAP); tmpint[2]->cti_value = DEFAULT_VGAP; tmpint[3] = ctlalloc1(CTL_QUALITY); tmpint[3]->cti_value = DEFAULT_BQUALITY; #ifdef USE_XFT2 tmpint[4] = ctlalloc1(CTL_OPAQUE); tmpint[4]->cti_value = DEFAULT_OPAQUE; #endif tmpvoid[0] = ctlalloc1(CTL_LEFT); tmparea[0] = ctlalloc1(CTL_AREA); tmparea[0]->ctar_width = 100; tmparea[0]->ctar_height = 100; tmparea[0]->ctar_xoff = 0; tmparea[0]->ctar_yoff = 0; /* for page 1 */ cp = &sentinel; for (i = 0; i < 10; i++) { if (!tmpstr[i]) continue; cp->ct_next = ctlalloc1(tmpstr[i]->ct_op); if (ctl_words[tmpstr[i]->ct_op].ctl_vtype == T_STR2) { if (tmpstr[i]->ctc2_value1) { cp->ct_next->ctc2_value1 = strdup(tmpstr[i]->ctc2_value1); } else cp->ct_next->ctc2_value1 = NULL; if (tmpstr[i]->ctc2_value2) { cp->ct_next->ctc2_value2 = strdup(tmpstr[i]->ctc2_value2); } else cp->ct_next->ctc2_value2 = NULL; } else { if (tmpstr[i]->ctc_value) { cp->ct_next->ctc_value = strdup(tmpstr[i]->ctc_value); } else cp->ct_next->ctc_value = NULL; } cp = cp->ct_next; } for (i = 0; i < 10; i++) { if (!tmplong[i]) continue; cp->ct_next = ctlalloc1(tmplong[i]->ct_op); cp->ct_next->ctl_value = tmplong[i]->ctl_value; cp = cp->ct_next; } for (i = 0; i < 10; i++) { if (!tmpint[i]) continue; cp->ct_next = ctlalloc1(tmpint[i]->ct_op); cp->ct_next->ct_val = tmpint[i]->ct_val; cp = cp->ct_next; } for (i = 0; i < 10; i++) { if (!tmpvoid[i]) continue; cp->ct_next = ctlalloc1(tmpvoid[i]->ct_op); cp = cp->ct_next; } for (i = 0; i < 10; i++) { if (!tmparea[i]) continue; cp->ct_next = ctlalloc1(tmparea[i]->ct_op); cp->ct_next->ctar_width = tmparea[i]->ctar_width; cp->ct_next->ctar_height = tmparea[i]->ctar_height; cp->ct_next->ctar_xoff = tmparea[i]->ctar_xoff; cp->ct_next->ctar_yoff = tmparea[i]->ctar_yoff; cp = cp->ct_next; } carryover[0] = sentinel.ct_next; /* * parse through the pages, remember what kind of directives are there. */ for (page = 1; page <= maxpage; page++) { for (l = 0; l <= page_attribute[page].pg_linenum; l++) { for (cp = page_control[page][l]; cp; cp = cp->ct_next) { switch (cp->ct_op) { case CTL_PREFIX: tmpstr[0] = cp; break; case CTL_VFONT: tmpstr[1] = cp; break; case CTL_TFONT: tmpstr[3] = cp; break; #ifdef FREETYPE_CHARSET16 case CTL_TMFONT: tmpstr[4] = cp; break; #endif case CTL_XFONT2: if (strcmp(cp->ctc2_value2, "iso8859-1") == 0) { tmpstr[2] = cp; break; } { struct ctrl **cpe; /*empty cp*/ cpe = (struct ctrl **)NULL; for (i = 5; i < 10; i++) { if (!tmpstr[i]) { if (!cpe) cpe = &tmpstr[i]; continue; } if (strcmp(cp->ctc2_value2, tmpstr[i]->ctc2_value2) == 0) { tmpstr[i] = cp; goto xfont_ok; } } if (cpe) *cpe = cp; xfont_ok: break; } case CTL_FORE: tmplong[0] = cp; break; case CTL_BACK: tmplong[1] = cp; break; case CTL_CCOLOR: tmpint[2] = cp; break; case CTL_SIZE: tmpint[0] = cp; break; case CTL_HGAP: tmpint[1] = cp; break; case CTL_VGAP: tmpint[2] = cp; break; case CTL_QUALITY: tmpint[3] = cp; break; case CTL_OPAQUE: tmpint[4] = cp; break; case CTL_LEFT: tmpvoid[0] = cp; break; case CTL_RIGHT: tmpvoid[0] = cp; break; case CTL_CENTER: tmpvoid[0] = cp; break; case CTL_LEFTFILL: tmpvoid[0] = cp; break; case CTL_AREA: tmparea[0] = cp; break; } } } cp = &sentinel; for (i = 0; i < 10; i++) { if (!tmpstr[i]) continue; cp->ct_next = ctlalloc1(tmpstr[i]->ct_op); if (ctl_words[tmpstr[i]->ct_op].ctl_vtype == T_STR2) { if (tmpstr[i]->ctc2_value1) { cp->ct_next->ctc2_value1 = strdup(tmpstr[i]->ctc2_value1); } else cp->ct_next->ctc2_value1 = NULL; if (tmpstr[i]->ctc2_value2) { cp->ct_next->ctc2_value2 = strdup(tmpstr[i]->ctc2_value2); } else cp->ct_next->ctc2_value2 = NULL; } else { if (tmpstr[i]->ctc_value) { cp->ct_next->ctc_value = strdup(tmpstr[i]->ctc_value); } else cp->ct_next->ctc_value = NULL; } cp = cp->ct_next; } for (i = 0; i < 10; i++) { if (!tmplong[i]) continue; cp->ct_next = ctlalloc1(tmplong[i]->ct_op); cp->ct_next->ctl_value = tmplong[i]->ctl_value; cp = cp->ct_next; } for (i = 0; i < 10; i++) { if (!tmpint[i]) continue; cp->ct_next = ctlalloc1(tmpint[i]->ct_op); cp->ct_next->ct_val = tmpint[i]->ct_val; cp = cp->ct_next; } for (i = 0; i < 10; i++) { if (!tmpvoid[i]) continue; cp->ct_next = ctlalloc1(tmpvoid[i]->ct_op); cp = cp->ct_next; } for (i = 0; i < 10; i++) { if (!tmparea[i]) continue; cp->ct_next = ctlalloc1(tmparea[i]->ct_op); cp->ct_next->ctar_width = tmparea[i]->ctar_width; cp->ct_next->ctar_height = tmparea[i]->ctar_height; cp->ct_next->ctar_xoff = tmparea[i]->ctar_xoff; cp->ct_next->ctar_yoff = tmparea[i]->ctar_yoff; cp = cp->ct_next; } carryover[page] = sentinel.ct_next; } } /* add default directives to each line */ for (page = 1; page <= maxpage; page++) { if (page_attribute[page].pg_flag & PGFLAG_NODEF) continue; line = page_attribute[page].pg_linenum; for (l = 0; l <= line; l++) { int contseen; contseen = 0; ch = &page_control[page][l]; /* * if this line contains CTL_CONT, we don't add * default directive to this line */ for (cp = page_control[page][l]; cp; cp = cp->ct_next) { if (cp->ct_op == CTL_CONT) { contseen++; break; } } if (default_control[l] && !contseen) { ctlinsert(ch, ctlcopy(default_control[l])); } } } /* * add carryover directives to each page. * default directive has priority over the carryover items, * so carryover items should appear earlier than default directive. */ for (page = 1; page <= maxpage; page++) { ch = &page_control[page][0]; if (carryover[page - 1]) ctlinsert(ch, carryover[page - 1]); } /* * add CTL_LINEEND and CTL_LINESTART to each lines that contain * CTL_TEXT/CTL_IMAGE/CTL_BAR/CTL_ICON. * note that we must carefully handle CTL_CONT. */ { int textseen; int contseen; for (page = 1; page <= maxpage; page++) { line = page_attribute[page].pg_linenum; for (l = 0; l <= line; l++) { textseen = 0; for (cp = page_control[page][l]; cp; cp = cp->ct_next) { if (cp->ct_op == CTL_TEXT || cp->ct_op == CTL_IMAGE || cp->ct_op == CTL_BAR #ifdef MNG || cp->ct_op == CTL_ANIM #endif /* MNG */ || cp->ct_op == CTL_ICON) { textseen++; break; } } if (!textseen) continue; /* * check if the line #l includes CONT directive. * if it has, don't add LINESTART to the line #l. */ contseen = 0; for (cp = page_control[page][l]; cp; cp = cp->ct_next) { if (cp->ct_op == CTL_CONT) { contseen++; break; } } if (!contseen) { cp = ctlalloc1(CTL_LINESTART); if (cp) { for (ch = &page_control[page][l]; ch && *ch; ch = &((*ch)->ct_next)) { if ((*ch)->ct_op == CTL_TEXT || (*ch)->ct_op == CTL_IMAGE || (*ch)->ct_op == CTL_BAR #ifdef MNG || (*ch)->ct_op == CTL_ANIM #endif /* MNG */ || (*ch)->ct_op == CTL_ICON) { break; } } ctlinsert(ch, cp); } } /* * check if the line #(l+1) includes CONT directive. * if it has, don't add LINEEND to the line #l. */ contseen = 0; if (l + 1 <= line) { for (cp = page_control[page][l + 1]; cp; cp = cp->ct_next) { if (cp->ct_op == CTL_CONT) { contseen++; break; } } } if (!contseen) { cp2 = NULL; for (cp1 = page_control[page][l]; cp1; cp1 = cp1->ct_next) { if (cp1->ct_op == CTL_TEXT || cp1->ct_op == CTL_IMAGE || cp1->ct_op == CTL_BAR #ifdef MNG || cp1->ct_op == CTL_ANIM #endif /* MNG */ || cp1->ct_op == CTL_ICON) { cp2 = cp1; } } /* cp2 has the last TEXT/IMAGE/whatever */ if (cp2) { cp = ctlalloc1(CTL_LINEEND); if (cp) ctlinsert(&(cp2->ct_next), cp); } } } if (contseen){ /* we have extra cont in the last line */ for (cp2 = page_control[page][line-1]; cp2->ct_next; cp2 = cp2->ct_next); cp = ctlalloc1(CTL_LINEEND); if (cp) ctlinsert(&(cp2->ct_next), cp); } } } /* insert CTL_TAB */ for (page = 1; page <= maxpage; page++) { line = page_attribute[page].pg_linenum; for (l = 0; l <= line; l++) { int tab_depth = 0; /* * if we don't have CTL_LINESTART, we don't add * directives here. */ cp = page_control[page][l]; while (cp && cp->ct_op != CTL_LINESTART) cp = cp->ct_next; if (!cp) continue; /* cp2: CTL_LINESTART */ cp2 = cp1 = cp; while (cp && cp->ct_op != CTL_TEXT) { cp1 = cp; cp = cp->ct_next; } if (!cp) continue; if (cp1->ct_next != cp) continue; p = cp->ctc_value; if (p && *p == '\t') { p++; tab_depth++; while (*p == '\t') { tab_depth++; p++; } if (p) { char *tmp; tmp = cp->ctc_value; p = cp->ctc_value = strdup(p); free(tmp); } } #if 0 /* insert CTL_TAB items into CTL_LINESTART */ if (tab_control[tab_depth]) { ctlinsert(&cp1->ct_next, ctlcopy(tab_control[tab_depth])); } #else if (tab_control[tab_depth]) { ch = &page_control[page][l]; for (cpt = tab_control[tab_depth]; cpt; cpt = cpt->ct_next){ /* Thses ctrl items should be in CTL_LINESTART */ if (cpt->ct_op == CTL_IMAGE || cpt->ct_op == CTL_TABPREFIX || cpt->ct_op == CTL_ICON){ ctlinsert(&cp1->ct_next, ctlcopy1(cpt)); cp1 = cp1->ct_next; } else /* other ctrl items should be in the head of the ctrls */ ctlinsert(ch, ctlcopy1(cpt)); } } #endif /* special: style escape */ if (p && *p == '&') { char *p0; char *tmp; int i; p0 = p; while (*p && !isspace(*p)) p++; tmp = cp->ctc_value; if (!*p) cp->ctc_value = strdup(p); else { *p++ = '\0'; while (*p && isspace(*p)) p++; cp->ctc_value = strdup(p); } for (i = MAXTAB; i < MAXTAB + MAXSTYLE ; i++) { if (tab_control[i] && strcmp(p0 + 1, tab_control[i]->ctc_value) == 0) break; } if (i == MAXTAB + MAXSTYLE) { fprintf(stderr, "style %s not found\n", p0 + 1); } else { ctlinsert(&cp1->ct_next, ctlcopy(tab_control[i]->ct_next)); } free(tmp); } } } /* find where to put PREFIX. */ for (page = 1; page <= maxpage; page++) { line = page_attribute[page].pg_linenum; for (l = 0; l <= line; l++) { for (cp = page_control[page][l]; cp; cp = cp->ct_next) { if (cp->ct_op == CTL_LINESTART) break; } if (!cp) continue; cp1 = cp; /* cp1: CTL_LINESTART */ for (cp = cp1; cp->ct_next; cp = cp->ct_next) { if (cp->ct_next->ct_op == CTL_TEXT || cp->ct_next->ct_op == CTL_IMAGE #ifdef MNG || cp->ct_next->ct_op == CTL_ANIM #endif /* MNG */ || cp->ct_next->ct_op == CTL_ICON) { break; } } if (!cp) continue; cp2 = ctlalloc1(CTL_PREFIXPOS); if (!cp2) continue; cp2->ct_next = cp->ct_next; cp->ct_next = cp2; } } /* * CTL_FONT must be replaced with appropriate font def defined by * CTL_DEFFONT. */ for (page = 1; page <= maxpage; page++) { for (l = 0; l <= page_attribute[page].pg_linenum; l++) { for (cp = page_control[page][l]; cp; cp = cp->ct_next) { if (cp->ct_op == CTL_FONT) { cp->ct_op = CTL_NOOP; cp1 = find_font(cp->ctc_value); if (!cp1) { fprintf(stderr, "page %d line %d: font def for \"%s\" not found: ignored\n", page, l, cp->ctc_value); continue; } ctlinsert(&cp->ct_next, ctlcopy(cp1->ct_next)); } } } } /* * CTL_XFONT is now obsolete, use CTL_XFONT2. */ for (page = 1; page <= maxpage; page++) { for (l = 0; l <= page_attribute[page].pg_linenum; l++) { for (cp = page_control[page][l]; cp; cp = cp->ct_next) { if (cp->ct_op == CTL_XFONT) { p = cp->ctc_value; cp->ct_op = CTL_XFONT2; cp->ctc2_value1 = p; cp->ctc2_value2 = strdup("iso8859-1"); } } } } } void debug0(p) struct ctrl *p; { int i; fprintf(stderr, "%p: ", p); fprintf(stderr, " %s ", ctl_words[p->ct_op].ctl_string); switch (ctl_words[p->ct_op].ctl_vtype) { case T_STR: fprintf(stderr, "\"%s\"", p->ctc_value); break; case T_STR2: fprintf(stderr, "\"%s\" \"%s\"", p->ctc2_value1, p->ctc2_value2); break; case T_INT: fprintf(stderr, "%d", p->cti_value); break; case T_LONG: fprintf(stderr, "#%lx", p->ctl_value); break; case T_DOUBLE: fprintf(stderr, "#%g", p->ctf_value); break; case T_VOID: break; case T_SP: break; default: fprintf(stderr, "(UNDEFINED TYPE)"); } if (ctl_words[p->ct_op].ctl_vtype != T_SP) goto done; switch (p->ct_op) { case CTL_PAUSE: fprintf(stderr, "(%s)", p->cti_value ? "page end" : "normal"); break; case CTL_TAB: if (p->cti_value > MAXTAB) fprintf(stderr, "\"%s\"", p->ctc_value); else fprintf(stderr, "%d", p->cti_value); break; case CTL_SYSTEM: case CTL_XSYSTEM: case CTL_TSYSTEM: case CTL_FILTER: fprintf(stderr, "argc=%d term=%s flag=%d", p->cta_argc, p->cta_argv[p->cta_argc] ? "bad" : "good", p->cta_flag); for (i = 0; i < p->cta_argc; i++) fprintf(stderr, "%s ", p->cta_argv[i]); break; case CTL_BAR: fprintf(stderr, "color=#%lx width=%d start=%d length=%d", p->ctb_color, p->ctb_width, p->ctb_start, p->ctb_length); break; case CTL_BIMAGE: case CTL_IMAGE: fprintf(stderr, "file=%s colors=%d x=%d y=%d zoom=%d", p->ctm_fname, p->ctm_numcolor, p->ctm_ximagesize, p->ctm_yimagesize, p->ctm_zoomflag); break; case CTL_BGRAD: fprintf(stderr, "w=%d h=%d nc=%d dir=%d zoom=%d colors=%d", p->ctd_width, p->ctd_height, p->ctd_numcolor, p->ctd_dir, p->ctd_zoomflag, p->ctd_g_colors); break; case CTL_ICON: fprintf(stderr, "type=%s color=%x siz=%d", p->ctic_value, (int)p->ctic_color, (int) p->ctic_size); break; case CTL_VALIGN: fprintf(stderr, ((p->cti_value == VL_CENTER) ? "center" : ((p->cti_value == VL_TOP) ? "top" : ((p->cti_value == VL_BOTTOM) ? "bottom" : "???")))); break; case CTL_AREA: fprintf(stderr, "xoff=%d w=%d yoff=%d h=%d", p->ctar_xoff, p->ctar_width, p->ctar_yoff, p->ctar_height); break; default: fprintf(stderr, "???"); } done: fprintf(stderr, "\n"); } void debug1(p) struct ctrl *p; { while (p) { fprintf(stderr, "\t"); debug0(p); p = p->ct_next; } } static void debug() { int page, line; for (line = 0; line < MAXLINE; line ++) { if (!default_control[line]) continue; fprintf(stderr, "def line %d:\n", line); debug1(default_control[line]); } for (page = 0; page < MAXPAGE; page ++) { for (line = 0; line < MAXLINE; line ++) { if (!page_control[page][line]) continue; fprintf(stderr, "page %d line %d:\n", page, line); debug1(page_control[page][line]); } } } int chkfile(p) char *p; { char buf[BUFSIZ]; buf[0] = '\0'; if (findImage(p, buf) >= 0) { if (parse_debug) fprintf(stderr, "File %s found\n", p); return 0; } fprintf(stderr, "File %s not found\n", p); parse_error++; return -1; } /*------------------------------------------------------------*/ struct ctrl * ctllastitem(this) struct ctrl *this; { struct ctrl *p; assert(this); p = this; while (p && p->ct_next) p = p->ct_next; return p; } void ctlappend(to, this) struct ctrl *to; struct ctrl *this; { struct ctrl *p; assert(to); assert(this); p = ctllastitem(to); p->ct_next = this; } void ctlinsert(here, this) struct ctrl **here; struct ctrl *this; { struct ctrl *p; struct ctrl *q; assert(here); assert(this); p = *here; *here = this; q = ctllastitem(this); q->ct_next = p; } struct ctrl * ctlalloc1(op) u_int op; { struct ctrl *p; p = (struct ctrl *)malloc(sizeof(struct ctrl)); if (!p) { perror("malloc"); exit(-1); } memset(p, 0, sizeof(struct ctrl)); p->ct_op = op; p->ct_next = NULL; /*just to make sure*/ return p; } void ctlfree(this) struct ctrl *this; { struct ctrl *p; struct ctrl *q; assert(this); p = this; do { q = p->ct_next; free(p); p = q; } while (p); } struct ctrl * ctlcopy(this) struct ctrl *this; { struct ctrl *dst0; struct ctrl *dst; struct ctrl *src; src = this; if (!src) return NULL; dst = dst0 = ctlalloc1(0); memcpy(dst, src, sizeof(struct ctrl)); src = src->ct_next; while (src) { dst->ct_next = ctlalloc1(0); dst = dst->ct_next; memcpy(dst, src, sizeof(struct ctrl)); src = src->ct_next; } return dst0; } struct ctrl * ctlcopy1(src) struct ctrl *src; { struct ctrl *dst; if (!src) return NULL; dst = ctlalloc1(0); memcpy(dst, src, sizeof(struct ctrl)); dst->ct_next = NULL; return dst; } int ctlcmp(a, b) struct ctrl *a; struct ctrl *b; { int i; assert(a); assert(b); if (a->ct_op != b->ct_op) return 1; if (a->ct_flag != b->ct_flag) return 1; switch (ctl_words[a->ct_op].ctl_vtype) { case T_STR: return strcmp(a->ctc_value, b->ctc_value); case T_STR2: if (strcmp(a->ctc2_value1, b->ctc2_value1) == 0 && strcmp(a->ctc2_value2, b->ctc2_value2) == 0) { return 0; } else return 1; case T_INT: return (a->cti_value == b->cti_value) ? 0 : 1; case T_LONG: return (a->ctl_value == b->ctl_value) ? 0 : 1; case T_DOUBLE: return (a->ctf_value == b->ctf_value) ? 0 : 1; case T_VOID: return 0; case T_SP: break; default: fprintf(stderr, "UNDEFINED TYPE in ctlcmp()\n"); return 1; } switch (a->ct_op) { case CTL_TAB: case CTL_PAUSE: return (a->cti_value == b->cti_value) ? 0 : 1; case CTL_SYSTEM: case CTL_XSYSTEM: case CTL_TSYSTEM: case CTL_FILTER: return 1; case CTL_IMAGE: case CTL_BIMAGE: if (a->ctm_numcolor == b->ctm_numcolor && a->ctm_ximagesize == b->ctm_ximagesize && a->ctm_yimagesize == b->ctm_yimagesize && a->ctm_zoomflag == b->ctm_zoomflag) return strcmp(a->ctm_fname, b->ctm_fname); else return 1; case CTL_BGRAD: if (a->ctd_g_colors == b->ctd_g_colors && a->ctd_numcolor == b->ctd_numcolor && a->ctd_dir == b->ctd_dir && a->ctd_width == b->ctd_width && a->ctd_height == b->ctd_height && a->ctd_zoomflag == b->ctd_zoomflag) { for (i = 0; i < a->ctd_g_colors; i++) { if (memcmp(a->ctd_colors[0], b->ctd_colors[0], sizeof(struct g_color)) != 0) return 1; } return 0; } else return 1; case CTL_BAR: if (a->ctb_color == b->ctb_color && a->ctb_width == b->ctb_width && a->ctb_start == b->ctb_start && a->ctb_length == b->ctb_length) return 0; else return 1; case CTL_ICON: if (strcmp(a->ctic_value, b->ctic_value) == 0 && a->ctic_color == b->ctic_color && a->ctic_size == b->ctic_size) return 0; else return 1; default: assert(0); } } FILE * fsearchopen(fname, mode, path) char *fname; char *mode; char **path; { FILE *fp; char buf[MAXPATHLEN]; char *p; int i; i = -1; fp = NULL; while (1) { p = (i == -1) ? "" : path[i]; if (!p) break; strcpy(buf, p); if ((p = strrchr(buf, '/'))) { p[1] = '\0'; } strcat(buf, fname); fp = fopen(buf, mode); if (fp) break; i++; } return fp; } static int define_font(cp) struct ctrl *cp; { int i; /* find duplicated def */ for (i = 0; i < MAXFONTDEF; i++) { if (!fontdef_control[i]) continue; if (strcmp(fontdef_control[i]->ctc_value, cp->ctc_value) == 0) { ctlfree(fontdef_control[i]); fontdef_control[i] = NULL; goto defineit; } } /* find empty def */ for (i = 0; i < MAXFONTDEF; i++) { if (!fontdef_control[i]) break; } if (i == MAXFONTDEF) { return -1; } defineit: /* define it */ fontdef_control[i] = cp; return 0; } static struct ctrl * find_font(font) char *font; { int i; /* find duplicated def */ for (i = 0; i < MAXFONTDEF; i++) { if (!fontdef_control[i]) continue; if (strcmp(fontdef_control[i]->ctc_value, font) == 0) return fontdef_control[i]; } return NULL; } ����kit/plist.c�����������������������������������������������������������������������������������������0100644�0023745�0000000�00000020315�07662103751�0012455�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: plist.c,v 1.23 2003/05/19 07:29:45 nishida Exp $ */ #include "mgp.h" #define PL_X_MARGIN 10 static Window pl_titlewin = None; static Window pg_win = None; static Pixmap pg_tmp; static int pg_lastpage = -1; static struct ctrl *pg_lastcp = NULL; static int draw_kstring __P((Drawable, char *, int, int)); /* * Display Page List at the bottom of the window */ void pl_on(state) struct render_state *state; { XSetWindowAttributes wattr; int i, ny, pl_x; u_int pl_nx, pl_ny, pl_y; if (pl_titlewin || !plfs) return; /* number of pages in x-axis */ pl_nx = (window_width - 2 * PL_X_MARGIN) / pl_fw / 3; /* number of pages in y-axis */ pl_ny = maxpage / pl_nx + 1; /* page list coordinate */ pl_x = PL_X_MARGIN; /* keep 5 for timebar*/ pl_y = window_height - (pl_ny + 1) * pl_fh - (t_fin ? 5 : 0); pl_titlewin = XCreateSimpleWindow(display, window, 0, pl_y - pl_fh, window_width, pl_fh, 0, BlackPixel(display, 0), back_color[caching]); XSelectInput(display, pl_titlewin, StructureNotifyMask); for (i = 1; i <= maxpage; i++) { ny = (i - 1) / pl_nx; plwin[i] = XCreateSimpleWindow(display, window, pl_x + 3 * ((i - 1) % pl_nx) * pl_fw, pl_y + pl_fh * ny, 3 * pl_fw, pl_fh, 0, BlackPixel(display, 0), WhitePixel(display, 0)); wattr.do_not_propagate_mask = ButtonPressMask|ButtonReleaseMask; XChangeWindowAttributes(display, plwin[i], CWDontPropagate, &wattr); XSelectInput(display, plwin[i], ButtonPressMask|EnterWindowMask| LeaveWindowMask|StructureNotifyMask); } XMapSubwindows(display, window); for (i = 1; i <= maxpage; i++) pl_pdraw(state, i, gc_pl); } /* * Turn off the page list */ void pl_off(state) struct render_state *state; { int i; if (!pl_titlewin) return; XUnmapSubwindows(display, window); XDestroyWindow(display, pl_titlewin); pl_titlewin = None; for (i = 1; i <= maxpage; i++) { XDestroyWindow(display, plwin[i]); plwin[i] = None; } XMapSubwindows(display, window); XFlush(display); } /* * Draw page numbers in each small window * Enbold the current page */ void pl_pdraw(state, i, gc) struct render_state *state; int i; GC gc; { char buf[10]; if (!pl_titlewin) return; sprintf(buf, "%02d", i % 100); XDrawImageString(display, plwin[i], gc, (int)(pl_fw / 2), (int)(pl_fh / 1.2), buf, 2); if (i == state->page) XDrawString(display, plwin[i], gc, (int)(pl_fw / 2) + 1, (int)(pl_fh / 1.2), buf, 2); } /* * Show the title of the page when the mouse enters a window. * Turn it off if the page number is zero. */ void pl_title(page) u_int page; { char buf[BUFSIZ]; if (!pl_titlewin) return; XClearArea(display, pl_titlewin, 0, 0, window_width, pl_fh, 0); if (page == 0) return; sprintf(buf, "page %d: %s", page, page_title(page)); XSetForeground(display, gc_pta, ctrl_color[caching]); XSetForeground(display, gc_ptk, ctrl_color[caching]); XSetBackground(display, gc_pta, back_color[caching]); XSetBackground(display, gc_ptk, back_color[caching]); draw_kstring(pl_titlewin, buf, PL_X_MARGIN, pl_fh - plfs->max_bounds.descent); } /* * Returns a pointer to title of specified page. */ char * page_title(page) int page; { int l; char *p; struct ctrl *cp; p = ""; for (l = 0; l <= page_attribute[page].pg_linenum; l++) { cp = page_control[page][l]; while (cp && cp->ct_op != CTL_TEXT) cp = cp->ct_next; if (!cp) continue; if (cp->ctc_value && *cp->ctc_value) { p = cp->ctc_value; break; } } while (*p && isspace(*p)) p++; return p; } void pg_on() { if (pg_win) return; /* 5 for timebar*/ pg_win = XCreateSimpleWindow(display, window, 0, window_height - pl_fh - (t_fin ? 5 : 0), window_width, pl_fh, 0, BlackPixel(display, screen), back_color[caching]); XSelectInput(display, pg_win, StructureNotifyMask); XMapSubwindows(display, window); pg_tmp = XCreatePixmap(display, pg_win, window_width, pl_fh, depth); pg_lastpage = -1; pg_lastcp = NULL; } void pg_clean() { XClearArea(display, pg_win, 0, 0, window_width, pl_fh, 0); pg_lastpage = -1; pg_lastcp = NULL; } void pg_draw(state) struct render_state *state; { char buf[BUFSIZ], *p; int n; u_int page; int showlast; if (!pg_mode || !pg_win || !plfs) return; page = state->page; #if 0 if (page == pg_lastpage && state->cp == pg_lastcp) return; #endif if (page == pg_lastpage) return; if (!state->cp) { pg_clean(); return; } showlast = (state->cp->ct_op == CTL_PAUSE && state->cp->cti_value); XSetForeground(display, gc_pta, ctrl_color[caching]); XSetForeground(display, gc_ptk, ctrl_color[caching]); XSetBackground(display, gc_pta, back_color[caching]); XSetBackground(display, gc_ptk, back_color[caching]); pg_clean(); if (page > 1) { sprintf(buf, "\033$B\"+\033(B %s", page_title(page - 1)); draw_kstring(pg_win, buf, PL_X_MARGIN, pl_fh - plfs->max_bounds.descent); } if (page < maxpage) { sprintf(buf, "%s\033$B\"*\033(B", page_title(page + 1)); for (p = buf; *p; p++) if (*p == '\n') *p = ' '; n = draw_kstring(pg_tmp, buf, 0, pl_fh); sprintf(buf, "%s\033$B\"*\033(B", page_title(page + 1)); for (p = buf; *p; p++) if (*p == '\n') *p = ' '; draw_kstring(pg_win, buf, window_width - 10 - n, pl_fh - plfs->max_bounds.descent); } if (showlast == 0) { sprintf(buf, "-- %d/%d --", page, maxpage); n = draw_kstring(pg_tmp, buf, 0, pl_fh); /* * The contents of buf is not destroyed by draw_kstring * as it doesnot include Kanji sequence. */ draw_kstring(pg_win, buf, window_width / 2 - n / 2, pl_fh - plfs->max_bounds.descent); } pg_lastpage = state->page; pg_lastcp = state->cp; } void pg_off() { if (!pg_win) return; XUnmapSubwindows(display, window); XFreePixmap(display, pg_tmp); XDestroyWindow(display, pg_win); XMapSubwindows(display, window); XFlush(display); pg_win = None; pg_lastpage = -1; pg_lastcp = NULL; } static int draw_kstring(d, buf, x, y) Drawable d; char *buf; int x, y; { char *p; int x0 = x; p = buf + strlen(buf) - 1; if (*p == '\n') *p = '\0'; for (p = buf; *p; p++) { if (strncmp(p, "\033$@", 3) == 0 || strncmp(p, "\033$B", 3) == 0) { *p = '\0'; p += 3; /* draw 8bit char */ XDrawImageString(display, d, gc_pta, x, y, buf, strlen(buf)); x += XTextWidth(plfs, buf, strlen(buf)); buf = p--; } else if (strncmp(p, "\033(B", 3) == 0 || strncmp(p, "\033(J", 3) == 0) { *p = '\0'; p += 3; /* draw 16bit char */ XDrawImageString16(display, d, gc_ptk, x, y, (XChar2b *)buf, strlen(buf)/2); x += XTextWidth16(plkfs, (XChar2b *)buf, strlen(buf)/2); buf = p--; } } /* draw 8bit char */ if (*buf != '\0') { /* Assumed ASCII at the end of string */ XDrawImageString(display, d, gc_pta, x, y, buf, strlen(buf)); x += XTextWidth(plfs, buf, strlen(buf)); } return x - x0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/postscript.c������������������������������������������������������������������������������������0100644�0023745�0000000�00000012501�07020236634�0013525�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLER * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: postscript.c,v 1.9 1999/11/28 14:35:08 nishida Exp $ */ #include "mgp.h" int ps_boundingbox(fname, px1, py1, px2, py2) char *fname; int *px1; int *py1; int *px2; int *py2; { FILE *epsfp; char buf[BUFSIZ]; int x1, y1, x2, y2; epsfp = NULL; epsfp = fopen(fname, "r"); if (!epsfp) { fprintf(stderr, "failed to open postscript file %s\n", fname); goto fail; } /* magic number */ if (fgets(buf, sizeof(buf), epsfp) == NULL) { fprintf(stderr, "error reading %s: file empty?\n", fname); goto fail; } if (buf[0] != '%' || buf[1] != '!') { fprintf(stderr, "%s is not a postscript file, it seems\n", fname); goto fail; } while (1) { if (fgets(buf, sizeof(buf), epsfp) == NULL) break; if (buf[0] != '%') break; if (strncmp(buf, "%%EndComments", 12) == 0) break; if (sscanf(buf, "%%%%BoundingBox: %d %d %d %d", &x1, &y1, &x2, &y2) == 4) { if (px1) *px1 = x1; if (py1) *py1 = y1; if (px2) *px2 = x2; if (py2) *py2 = y2; fclose(epsfp); return 0; } } fprintf(stderr, "No BoundingBox in %s\n", fname); fail: if (epsfp) fclose(epsfp); return -1; } void image_zoomratio(state, xp, yp, zoomflag, width, height) struct render_state *state; float *xp, *yp; int zoomflag; int width; /* width of the image in file */ int height; /* height of the image in file */ { int xmode, ymode; double x, y; if (!xp || !yp) { fprintf(stderr, "internal error: " "invalid parameter to image_zoomratio\n"); exit(1); } xmode = zoomflag & Z_XMASK; ymode = (zoomflag & Z_YMASK) >> Z_YSHIFT; if (mgp_flag & FL_VERBOSE) { char *xmodestr, *ymodestr; xmodestr = ymodestr = "?"; switch (xmode) { case Z_ABSOLUTE: xmodestr = "abs"; break; case Z_NORMAL: xmodestr = "asis"; break; case Z_SCREEN: xmodestr = "screen"; break; case Z_SCREEN0: xmodestr = "screen0"; break; case Z_OBEY: xmodestr = "obey"; break; } switch (ymode) { case Z_ABSOLUTE: ymodestr = "abs"; break; case Z_NORMAL: ymodestr = "asis"; break; case Z_SCREEN: ymodestr = "screen"; break; case Z_SCREEN0: ymodestr = "screen0"; break; case Z_OBEY: ymodestr = "obey"; break; } fprintf(stderr, "computing zoom: screen=(%d,%d) " "image=(%d,%d) zoom param=(%0.2f/%s,%0.2f/%s)\n", state->width, state->height, width, height, *xp, xmodestr, *yp, ymodestr); } if (xmode == ymode && xmode == Z_OBEY) { fprintf(stderr, "internal error: " "x and y axis obey each other (ignore zoom factor)\n"); return; } x = (double)*xp / 100; y = (double)*yp / 100; if (xmode == Z_OBEY) /*DIRTY!*/ goto yfirst; switch (xmode) { case Z_ABSOLUTE: x = (double)*xp / 100; break; case Z_NORMAL: /* as is */ break; case Z_SCREEN: /* screen relative */ x = x * state->width / width; break; case Z_SCREEN0: /* original screen size specified */ x = state->width / (double)*xp; break; default: fprintf(stderr, "wrong zooming mode for x axis %d\n", xmode); exit(1); } yfirst: switch (ymode) { case Z_ABSOLUTE: y = (double)*yp / 100; break; case Z_NORMAL: break; case Z_SCREEN: y = y * state->height / height; break; case Z_SCREEN0: y = state->height / (double)*yp; break; case Z_OBEY: y = x; break; default: fprintf(stderr, "wrong zooming mode for y axis %d\n", ymode); exit(1); } if (xmode != Z_OBEY) goto finish; switch (xmode) { case Z_ABSOLUTE: x = 100 * x / width; break; case Z_NORMAL: /* as is */ break; case Z_SCREEN: /* screen relative */ x = state->width * x / width; break; case Z_SCREEN0: /* original screen size specified */ x = state->width / x; break; case Z_OBEY: x = y; break; default: fprintf(stderr, "wrong zooming mode for x axis %d\n", xmode); exit(1); } finish: if (mgp_flag & FL_VERBOSE) { fprintf(stderr, "resulting zoom=(%f,%f)\n", x, y); } *xp = (float)(x * 100); *yp = (float)(y * 100); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/print.c�����������������������������������������������������������������������������������������0100644�0023745�0000000�00000211601�10740733666�0012463�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLER * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: print.c,v 1.113 2008/01/08 17:49:42 nishida Exp $ */ /* * Paper size selection code is based on psutil.c by Angus J. C. Duggan */ #include "mgp.h" #ifdef USE_SETLOCALE #ifdef HAVE_LOCALE_H #include <locale.h> #endif #endif static u_int align = AL_LEFT; static char *curprefix = NULL; static char *tabprefix = NULL; static u_int lineheight; static u_int linewidth; static u_int gaplevel = 0; static int char_off = 0; /* y-offset of the chars (relative to the current line, used for super/subscript */ #define DEFAULT_PAPER_SIZE "a4" #define PRINT_ASCIIFONT "Times-Roman" #define PRINT_ASCIITHICKFONT "Helvetica" #define PRINT_KANJIFONT "Ryumin-Light-H" #define PRINT_KANJITHICKFONT "GothicBBB-Medium-H" static FILE *fp; static u_int reverse; static char outputfile[MAXVALLEN]; static int colorps = 0; static int painticon = 0; static u_int curlinenum; static u_int curpagenum=0; static u_int xprefix = 0; static u_int tabxprefix = 0; static u_int valign = VL_BOTTOM; /* by Arnd Schmitter 23.07.2004 */ static int lg; /* Counts the Recursionlevel in print_page() for new Pause-Mode */ static int PauseMode=0; /* Should Pause-Statements splitet into multiple Pages ? */ #ifdef FREETYPE static u_int usetfont = 0; #endif static struct imagepool { struct ctrl *image; int xoffset; int xsiz; int ysiz; int eps; int target_text; /* by A. Ito */ } imagepool[256]; /*enough?*/ static int nimagepool = 0; static struct textpool { int pfx; int xoffset; int yoffset; /* offset for super/subscript */ int xsiz; struct fontmap *font; int size; char *text; u_long fore; u_long back; char *charset; } textpool[1024]; /*enough?*/ static int ntextpool = 0; u_long fore; u_long back; #ifdef VFLIB char *vfcap_name = NULL; /*dummy*/ #endif #ifdef FREETYPE char *freetypefontdir = NULL; /*dummy*/ char *freetypefont0 = NULL; /*dummy*/ char *freetypemfont0 = NULL; /*dummy*/ #endif /* lang code */ #define ASCII 0 #define KANJI 1 #define NOPE -1 static int maxfontid = 0; static struct fontmap { int ctrl; int lang; char *font; char *psfont; int fontid; /* flag bit for generating font map */ int loaded; } fontmap[] = { #ifdef VFLIB { CTL_VFONT, KANJI, "goth", "GothicBBB-Medium-H" }, { CTL_VFONT, KANJI, "*", "Ryumin-Light-H" }, #endif /*VFLIB*/ #ifdef FREETYPE { CTL_TFONT, ASCII, "schlbk.ttf", "NewCenturySchlbk-Roman" }, { CTL_TFONT, ASCII, "schlbki.ttf", "NewCenturySchlbk-Italic" }, { CTL_TFONT, ASCII, "schlbkbd.ttf", "NewCenturySchlbk-Bold" }, { CTL_TFONT, ASCII, "schlbkbi.ttf", "NewCenturySchlbk-BoldItalic" }, { CTL_TFONT, ASCII, "times.ttf", "Times-Roman" }, { CTL_TFONT, ASCII, "timesi.ttf", "Times-Italic" }, { CTL_TFONT, ASCII, "timesbd.ttf", "Times-Bold" }, { CTL_TFONT, ASCII, "timesbi.ttf", "Times-BoldItalic" }, { CTL_TFONT, ASCII, "arial.ttf", "Helvetica" }, { CTL_TFONT, ASCII, "ariali.ttf", "Helvetica-Oblique" }, { CTL_TFONT, ASCII, "arialbd.ttf", "Helvetica-Bold" }, { CTL_TFONT, ASCII, "arialbi.ttf", "Helvetica-BoldOblique" }, { CTL_TFONT, ASCII, "cour.ttf", "Courier" }, { CTL_TFONT, ASCII, "couri.ttf", "Courier-Oblique" }, { CTL_TFONT, ASCII, "courbd.ttf", "Courier-Bold" }, { CTL_TFONT, ASCII, "courbi.ttf", "Courier-BoldOblique" }, { CTL_TFONT, ASCII, "symbol.ttf", "Symbol" }, { CTL_TFONT, ASCII, "*", "Helvetica" }, /*last resort*/ #ifdef FREETYPE_CHARSET16 { CTL_TMFONT, KANJI, "wadalab-gothic.ttf", "GothicBBB-Medium-H" }, { CTL_TMFONT, KANJI, "*", "Ryumin-Light-H" }, #endif #endif /*FREETYPE*/ { CTL_XFONT2, ASCII, "century schoolbook l-medium-r", "NewCenturySchlbk-Roman" }, { CTL_XFONT2, ASCII, "century schoolbook l-medium-i", "NewCenturySchlbk-Italic" }, { CTL_XFONT2, ASCII, "century schoolbook l-bold-r", "NewCenturySchlbk-Bold" }, { CTL_XFONT2, ASCII, "century schoolbook l-bold-i", "NewCenturySchlbk-BoldItalic" }, { CTL_XFONT2, ASCII, "times-medium-r", "Times-Roman" }, { CTL_XFONT2, ASCII, "times-medium-i", "Times-Italic" }, { CTL_XFONT2, ASCII, "times-bold-r", "Times-Bold" }, { CTL_XFONT2, ASCII, "times-bold-i", "Times-BoldItalic" }, { CTL_XFONT2, ASCII, "helvetica-medium-r", "Helvetica" }, { CTL_XFONT2, ASCII, "helvetica-medium-o", "Helvetica-Oblique" }, { CTL_XFONT2, ASCII, "helvetica-bold-r", "Helvetica-Bold" }, { CTL_XFONT2, ASCII, "helvetica-bold-o", "Helvetica-BoldOblique" }, { CTL_XFONT2, ASCII, "courier-medium-r", "Courier" }, { CTL_XFONT2, ASCII, "courier-medium-o", "Courier-Oblique" }, { CTL_XFONT2, ASCII, "courier-bold-r", "Courier-Bold" }, { CTL_XFONT2, ASCII, "courier-bold-i", "Courier-BoldOblique" }, { CTL_XFONT2, ASCII, "times*", "Times" }, { CTL_XFONT2, ASCII, "helvetica*", "Helvetica" }, { CTL_XFONT2, ASCII, "courier*", "Courier" }, { CTL_XFONT2, ASCII, "symbol*", "Symbol" }, { CTL_XFONT2, ASCII, "*", "Helvetica" }, /*last resort*/ { CTL_XFONT2, KANJI, "*", "Ryumin-Light-H" }, /*last resort*/ /*PSFONT*/ { CTL_PSFONT, ASCII, "Times-Roman", "Times-Roman" }, { CTL_PSFONT, ASCII, "Times-Italic", "Times-Italic" }, { CTL_PSFONT, ASCII, "Times-Bold", "Times-Bold" }, { CTL_PSFONT, ASCII, "Times-BoldItalic", "Times-BoldItalic" }, { CTL_PSFONT, ASCII, "Helvetica", "Helvetica" }, { CTL_PSFONT, ASCII, "Helvetica-BoldOblique", "Helvetica-BoldOblique" }, { CTL_PSFONT, ASCII, "Helvetica-Bold", "Helvetica-Bold" }, { CTL_PSFONT, ASCII, "Courier", "Courier" }, { CTL_PSFONT, ASCII, "Courier-Oblique", "Courier-Oblique" }, { CTL_PSFONT, ASCII, "Courier-Bold", "Courier-Bold" }, { CTL_PSFONT, ASCII, "Courier-BoldOblique", "Courier-BoldOblique" }, { CTL_PSFONT, ASCII, "AvantGarde-Book", "AvantGarde-Book" }, { CTL_PSFONT, ASCII, "AvantGarde-BookOblique", "AvantGarde-BookOblique" }, { CTL_PSFONT, ASCII, "AvantGarde-Demi", "AvantGarde-Demi" }, { CTL_PSFONT, ASCII, "AvantGarde-DemiQblique", "AvantGarde-DemiQblique" }, { CTL_PSFONT, ASCII, "Bookman-Demi", "Bookman-Demi" }, { CTL_PSFONT, ASCII, "Bookman-DemiItalic", "Bookman-DemiItalic" }, { CTL_PSFONT, ASCII, "Bookman-Light", "Bookman-Light" }, { CTL_PSFONT, ASCII, "Bookman-LightItalic", "Bookman-LightItalic" }, { CTL_PSFONT, ASCII, "Helvetica-Narrow", "Helvetica-Narrow" }, { CTL_PSFONT, ASCII, "Helvetic-NarrowOblique","Helvetic-NarrowOblique"}, { CTL_PSFONT, ASCII, "Helvetica-NarrowBold", "Helvetica-NarrowBold" }, { CTL_PSFONT, ASCII, "Helvetica-NarrowBoldOblique", "Helvetica-NarrowBoldOblique" }, { CTL_PSFONT, ASCII, "Helvetica-Oblique", "Helvetica-Oblique" }, { CTL_PSFONT, ASCII, "NewCenturySchlbk-Roman", "NewCenturySchlbk-Roman" }, { CTL_PSFONT, ASCII, "NewCenturySchlbk-Bold", "NewCenturySchlbk-Bold" }, { CTL_PSFONT, ASCII, "NewCenturySchlbk-Italic", "NewCenturySchlbk-Italic" }, { CTL_PSFONT, ASCII, "NewCenturySchlbk-BoldItalic", "NewCenturySchlbk-BoldItalic" }, { CTL_PSFONT, ASCII, "Palatino-Roman", "Palatino-Roman" }, { CTL_PSFONT, ASCII, "Palatino-Bold", "Palatino-Bold" }, { CTL_PSFONT, ASCII, "Palatino-Italic", "Palatino-Italic" }, { CTL_PSFONT, ASCII, "Palatino-BoldItalic", "Palatino-BoldItalic" }, { CTL_PSFONT, ASCII, "ZapfChancery-MediumItalic", "ZapfChancery-MediumItalic" }, { CTL_PSFONT, ASCII, "Symbol", "Symbol" }, { CTL_PSFONT, ASCII, "ZapfDingbats", "ZapfDingbats" }, { CTL_PSFONT, ASCII, "*", "Helvetica" }, /*Last Resort*/ { -1 }, }; static struct fontmap *curfont[10]; /*indexed by lang*/ static u_short kinsokutable[] = { 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x2126, 0x2127, 0x2128, 0x2129, 0x212a, 0x212b, 0x212c, 0x212d, 0x212e, 0x212f, 0x2130, 0x2133, 0x2134, 0x2135, 0x2136, 0x213c, 0x2147, 0x2149, 0x214b, 0x214d, 0x214f, 0x2151, 0x2153, 0x2155, 0x2157, 0x2159, 0x216b, 0x2242, 0x2244, 0 }; typedef struct papersize { char *name; /* name of paper size */ int height, width; /* height, width in points for LANDSCAPE */ } Paper; static Paper papersizes[] = { { "a3", 842, 1191 }, /* 29.7cm * 42cm */ { "a4", 595, 842 }, /* 21cm * 29.7cm */ { "a5", 421, 595 }, /* 14.85cm * 21cm */ { "b5", 516, 729 }, /* 18.2cm * 25.72cm */ { "A3", 842, 1191 }, /* 29.7cm * 42cm */ { "A4", 595, 842 }, /* 21cm * 29.7cm */ { "A5", 421, 595 }, /* 14.85cm * 21cm */ { "B5", 516, 729 }, /* 18.2cm * 25.72cm */ { "letter", 612, 792 }, /* 8.5in * 11in */ { "legal", 612, 1008 }, /* 8.5in * 14in */ { "ledger", 1224, 792 }, /* 17in * 11in */ { "tabloid", 792, 1224 }, /* 11in * 17in */ { "statement", 396, 612 }, /* 5.5in * 8.5in */ { "executive", 540, 720 }, /* 7.6in * 10in */ { "folio", 612, 936 }, /* 8.5in * 13in */ { "quarto", 610, 780 }, /* 8.5in * 10.83in */ { "10x14", 720, 1008 }, /* 10in * 14in */ { NULL, 0, 0 } }; static const char *latin1def = "[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright\n" " /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one\n" " /two /three /four /five /six /seven /eight /nine /colon /semicolon\n" " /less /equal /greater /question /at /A /B /C /D /E\n" " /F /G /H /I /J /K /L /M /N /O\n" " /P /Q /R /S /T /U /V /W /X /Y\n" " /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c\n" " /d /e /f /g /h /i /j /k /l /m\n" " /n /o /p /q /r /s /t /u /v /w\n" " /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright\n" " /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior\n" " /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf\n" " /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla\n" " /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde\n" " /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex\n" " /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring\n" " /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis\n" " /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave\n" " /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def\n"; static const char *latin2def = "[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright\n" " /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one\n" " /two /three /four /five /six /seven /eight /nine /colon /semicolon\n" " /less /equal /greater /question /at /A /B /C /D /E\n" " /F /G /H /I /J /K /L /M /N /O\n" " /P /Q /R /S /T /U /V /W /X /Y\n" " /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c\n" " /d /e /f /g /h /i /j /k /l /m\n" " /n /o /p /q /r /s /t /u /v /w\n" " /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n" " /space /Aogonek /breve /Lslash /currency /Lcaron /Sacute /section /dieresis /Scaron\n" " /Scedilla /Tcaron /Zacute /hyphen /Zcaron /Zdotaccent /degree /aogonek /ogonek /lslash\n" " /acute /lcaron /sacute /caron /cedilla /scaron /scedilla /tcaron /zacute /hungarumlaut\n" " /zcaron /zdotaccent /Racute /Aacute /Acircumflex /Abreve /Adieresis /Lacute /Cacute /Ccedilla\n" " /Ccaron /Eacute /Eogonek /Edieresis /Ecaron /Iacute /Icircumflex /Dcaron /Dbar /Nacute\n" " /Ncaron /Oacute /Ocircumflex /Ohungarumlaut /Odieresis /multiply /Rcaron /Uring /Uacute /Uhungarumlaut\n" " /Udieresis /Yacute /Tcedilla /germandbls /racute /aacute /acircumflex /abreve /adieresis /lacute\n" " /cacute /ccedilla /ccaron /eacute /eogonek /edieresis /ecaron /iacute /icircumflex /dcaron\n" " /dbar /nacute /ncaron /oacute /ocircumflex /ohungarumlaut /odieresis /divide /rcaron /uring\n" " /uacute /uhungarumlaut /udieresis /yacute /tcedilla /dotaccent] /isolatin2encoding exch def\n"; static struct encoding { char *name; char *defstr; } encodings[] = { { "iso-8859-1", "isolatin1encoding", }, { "latin1", "isolatin1encoding", }, { "iso-8859-2", "isolatin2encoding", }, { "latin2", "isolatin2encoding", }, { NULL, NULL, }, }; struct encoding *encoding = NULL; static Paper *paper; static int w_width, w_height; static int paper_xmargin = 10; static int paper_ymargin = 5; static Paper *findpaper __P((char *)); static void print_out __P((void)); static void scan_font __P((u_int)); static void print_page __P((u_int)); static void print_init __P((void)); static void print_pageinit __P((u_int)); static void process_direc_print __P((struct ctrl *cp)); static void scan_backcolor __P((u_int)); static void line_start __P((void)); static void line_end __P((void)); static void icon_output __P((struct textpool *)); static void line_skip __P((int, int)); static void print_bar __P((struct ctrl *)); static void print_icon __P((struct ctrl *)); static void print_line __P((char *, int)); static int iskinsokuchar __P((u_int)); static void print_string __P((char *, int)); static void print_fragment __P((u_char *, u_int, int, int)); static void text_remember __P((char *, int, int, int, int)); static void icon_remember __P((int, int, int, u_long)); static void image_remember __P((struct ctrl *, struct imagepool *)); static void image_load_print __P((char *, int, int, int, int, int, int)); static void print_usage __P((char *)); static void setpencolor __P((u_long)); static void print_full_image __P((XImage *, Visual *)); static void print_8_image __P((XImage *)); static void print_32_image __P((XImage *, Visual *)); static void print_eps __P((FILE *, char *, int, int, int, int, int)); static struct fontmap *findfont __P((int, int, char *)); static struct fontmap *findttfont __P((int, int, char *)); static char *fontstring __P((struct fontmap *)); static void loadfont __P((struct fontmap *, char *)); static int count_pause __P((u_int page)); /* Added 23.07.2004 by Arnd Schmitter */ /* image/ *.[ch] */ extern char *Paths[]; extern int NumPaths; extern char *expandPath __P((char *)); extern int findImage __P((char *, char *)); static Paper * findpaper(name) char *name; { Paper *pp; for (pp = papersizes; pp->name; pp++) { if (strcmp(pp->name, name) == 0) return pp; } return (Paper *)NULL; } static void print_out() { u_int i; u_int width, height; width = window_width; height = window_height; window_width = w_width; window_height = w_height; char_size[0] = window_height * DEFAULT_CHARSIZE / 100; sup_off = DEFAULT_SUPOFF; sub_off = DEFAULT_SUBOFF; sup_scale = DEFAULT_SUPSCALE; if (outputfile[0]) { if ((fp = fopen(outputfile, "w")) == NULL) { perror("fopen"); exit(-1); } } else fp = stdout; print_init(); for (i = 1; i <= maxpage; i ++) { scan_font(i); } for (i = 1; i <= maxpage; i ++) { lg=0; /* Set the recursionlevel to 0 for each new page (Arnd Schmitter 23.07.2004) */ print_page(i); } fclose(fp); window_width = width; window_height = height; } static void scan_font(page) u_int page; { u_int line; struct ctrl *cp; struct fontmap *font; int code; if (mgp_flag & FL_VERBOSE) fprintf(fp, "%% scan_font page %d\n", page); for (line = 0; line <= page_attribute[page].pg_linenum; line++) { /* process normal control */ for (cp = page_control[page][line]; cp; cp = cp->ct_next) { switch(cp->ct_op) { #ifdef VFLIB case CTL_VFONT: font = findfont(cp->ct_op, KANJI, cp->ctc_value); if (font) curfont[KANJI] = font; break; #endif /*VFLIB*/ case CTL_PSFONT: font = findfont(cp->ct_op,ASCII,cp->ctc_value); if(font) curfont[ASCII] = font; break; #ifdef FREETYPE case CTL_TFONT: font = findfont(cp->ct_op, ASCII, cp->ctc_value); if (font) curfont[ASCII] = font; break; #ifdef FREETYPE_CHARSET16 case CTL_TMFONT: font = findfont(cp->ct_op, KANJI, cp->ctc_value); if (font) curfont[KANJI] = font; break; #endif /*FREETYPE_CHARSET16*/ #endif case CTL_XFONT2: if (strcmp(cp->ctc2_value2, "iso8859-1") == 0) code = ASCII; else if (strncmp(cp->ctc2_value2, "jisx0208", 8) == 0) { code = KANJI; } else { fprintf(stderr, "unsupported XFONT registry %s\n", cp->ctc2_value2); exit(1); } font = findfont(cp->ct_op, code, cp->ctc2_value1); if (font) curfont[code] = font; break; case CTL_XFONT: fprintf(stderr, "obsolete directive XFONT\n"); exit(1); case CTL_TEXT: if (strstr(cp->ctc_value, "\033$B") || strstr(cp->ctc_value, "\033$@")) { if (curfont[KANJI]) { loadfont(curfont[KANJI], curfont[KANJI]->font); } else { fprintf(stderr, "unable to find proper font for %s\n", "kanji"); exit(1); } } if (curfont[ASCII]) { loadfont(curfont[ASCII], curfont[ASCII]->font); } else { fprintf(stderr, "unable to find proper font for %s\n", "ascii"); exit(1); } default: break; } } } memset(curfont, 0, sizeof(curfont)); } /* * This Function counts the Number of Pause-Statements. */ static int count_pause(page) u_int page; { int count=0; u_int line; struct ctrl*cp; for (line = 0; line <= page_attribute[page].pg_linenum; line++) { curlinenum = line; /* process normal control */ for (cp = page_control[page][line]; cp; cp = cp->ct_next) { if(cp->ct_op == CTL_PAUSE) { count++; } } } return count; } static void print_page(page) u_int page; { u_int line; struct ctrl *cp; int ret=0; /* A Pause Command was found */ int lc = 0; /* Counter to prevent infinite recursion loops at Pause-Statements */ int pcount; /* Stores the Number of Pause Statements for a Page */ /* Modified by Arnd Schmitter 23.07.2004: * when in PauseMode for emulationg %pause in PS file (option "-m") * this function is called recursively to print the beginning of * the page again up to current %pause statement */ /*curpagenum = page;*/ curpagenum++; scan_backcolor(page); print_pageinit(curpagenum); /* End of Modification */ for (line = 0; line <= page_attribute[page].pg_linenum; line++) { curlinenum = line; /* process normal control */ for (cp = page_control[page][line]; cp; cp = cp->ct_next) { if ((PauseMode) && (cp->ct_op == CTL_PAUSE)) if (lc >= lg) ret=1; else (lc)++; else process_direc_print(cp); if (ret) goto pause; /* If a Pause has been found exit Loop immedeatly */ } } pause: fprintf(fp, "grestore\n\n"); fprintf(fp, "showpage\n\n"); /* If a Pause has been found -> Restart this Page */ if (ret) { lg++; /* If we are in Pause-Mode check if we are called because of the last CTL_PAUSE at End of Page */ /* At the Endo of the Last Page is no PAUSE Statemtent. So we have to use all Statements in the Page */ pcount=count_pause(page); if ((pcount != lg)||(page == (maxpage))) print_page(page); } } static void print_init() { char **p; char *aligns[] = { "center", "left", "right", NULL }; /* Added by Arnd Schmitter 23.07.2004 */ /* If we split Pages with Pause Statements the number of absolute Pages gets greater then maxpage */ u_int i; int absolute_pages = maxpage+1; if (PauseMode) { for (i = 0; i < maxpage; i++) { absolute_pages+=count_pause(i)-1; } } /*fprintf(stderr,"Pages %d\n",absolute_pages);*/ fprintf(fp, "%%!PS-Adobe-2.0\n"); fprintf(fp, "%%%%Creator: mgp2ps\n"); fprintf(fp, "%%%%Title: %s\n", mgp_fname); fprintf(fp, "%%%%Pages: %d\n", absolute_pages); fprintf(fp, "%%%%BoundingBox: 0 0 %d %d\n", paper->height, paper->width); fprintf(fp, "%%%%DocumentPaperSizes: %s\n", paper->name); fprintf(fp, "%%%%Orientation: Landscape\n"); fprintf(fp, "%%%%EndComments\n"); /* define constants */ fprintf(fp, "/XMARGIN %d def /YMARGIN %d def " "/WIDTH %d def /HEIGHT %d def\n", paper_xmargin, paper_ymargin, window_width, window_height); fprintf(fp, "/XBODY WIDTH XMARGIN 2 mul sub def\n"); fprintf(fp, "/vertgap %d def /horizgap %d def\n", vert_gap[0], horiz_gap[0]); fprintf(fp, "/resety {/ymin 0 def /ymax 0 def} def\n"); fprintf(fp, "/setymax {dup ymax gt {dup /ymax exch def} if pop} def\n"); fprintf(fp, "/setymin {dup ymin lt {dup /ymin exch def} if pop} def\n"); fprintf(fp, "/calcy {dup ( ) eq\n" " {0 setymax 0 setymin pop}\n" " {pop charsize 0.7 mul setymax charsize -0.15 mul setymin}\n" " ifelse\n" "} def\n"); fprintf(fp, "resety\n"); /* define writebox */ fprintf(fp, "/writebox {\n"); fprintf(fp, " XMARGIN YMARGIN -1 mul moveto " "0 HEIGHT -1 mul rlineto\n"); fprintf(fp, " WIDTH 0 rlineto 0 HEIGHT rlineto\n"); fprintf(fp, " WIDTH -1 mul 0 rlineto stroke\n"); fprintf(fp, "} def\n"); /* define writeboxfill */ fprintf(fp, "/writeboxfill {\n"); fprintf(fp, " newpath XMARGIN YMARGIN -1 mul moveto " "0 HEIGHT -1 mul rlineto\n"); fprintf(fp, " WIDTH 0 rlineto 0 HEIGHT rlineto\n"); fprintf(fp, " WIDTH -1 mul 0 rlineto closepath eofill stroke\n"); fprintf(fp, "} def\n"); /* ypos = ypos - (charsize * (1 + vert_gap / 100)) + little margin */ fprintf(fp, "/NL {\n"); fprintf(fp, " charsize imgsize gt\n"); fprintf(fp, " ymax ymin sub /csize exch def\n"); fprintf(fp, " csize 0 eq {/csize charsize def} if\n"); fprintf(fp, " { vertgap 100 div 1 add csize mul }\n"); fprintf(fp, " { vertgap 100 div csize mul imgsize add }\n"); fprintf(fp, " ifelse\n"); fprintf(fp, " ypos exch sub /ypos exch def\n"); /* we can get similar results to xft2 by doing this */ if (!gaplevel) fprintf(fp, " HEIGHT 90 div ypos exch sub /ypos exch def\n"); fprintf(fp, "} bind def\n"); /* show with line wrapping */ fprintf(fp, "/initcharsize { /charsize 0 def /imgsize 0 def resety} def\n"); fprintf(fp, "initcharsize\n"); fprintf(fp, "/setcharsize {\n"); fprintf(fp, " dup charsize gt { dup /charsize exch def } if pop\n"); fprintf(fp, "} def\n"); fprintf(fp, "/setimgsize {\n"); fprintf(fp, " dup imgsize gt { dup /imgsize exch def } if pop\n"); fprintf(fp, "} def\n"); fprintf(fp, "/updatetotlen {\n"); fprintf(fp, " dup totlen exch sub /totlen exch def\n"); fprintf(fp, "} bind def\n"); fprintf(fp, "/updatefillzero {\n"); fprintf(fp, " inmargin {\n"); fprintf(fp, " currentpoint pop /fillzero exch def\n"); fprintf(fp, " /inmargin false def\n"); fprintf(fp, " } if\n"); fprintf(fp, "} bind def\n"); /* centering */ fprintf(fp, "/centerdefxpos {\n"); fprintf(fp, " totlen XBODY gt\n"); fprintf(fp, " { XMARGIN }\n"); fprintf(fp, " { XBODY totlen sub 2 div XMARGIN add }\n"); fprintf(fp, " ifelse /xpos exch def\n"); fprintf(fp, "} bind def\n"); /* leftfill */ fprintf(fp, "/leftdefxpos {\n"); fprintf(fp, " /xpos fillzero def\n"); fprintf(fp, "} bind def\n"); /* rightfill */ fprintf(fp, "/rightdefxpos {\n"); fprintf(fp, " totlen XBODY gt\n"); fprintf(fp, " { XMARGIN }\n"); fprintf(fp, " { XBODY totlen sub XMARGIN add }\n"); fprintf(fp, " ifelse /xpos exch def\n"); fprintf(fp, "} bind def\n"); /* check newline */ for (p = aligns; *p; p++) { fprintf(fp, "/%snewlinecheck {\n", *p); fprintf(fp, " currentpoint pop add XMARGIN XBODY add gt {\n"); #if 1 fprintf(fp, " NL %sdefxpos xpos ypos charsize 2 div sub moveto\n", *p); #else fprintf(fp, " NL %sdefxpos xpos ypos charsize sub moveto\n", *p); #endif fprintf(fp, " } if\n"); fprintf(fp, "} bind def\n"); } /* a spell for EPS */ fprintf(fp, "%%\n"); fprintf(fp, "/BeginEPSF {%%def\n"); fprintf(fp, " /b4_Inc_state save def\n"); fprintf(fp, " /dict_count countdictstack def\n"); fprintf(fp, " /op_count count 1 sub def\n"); fprintf(fp, " userdict begin\n"); fprintf(fp, " /showpage {}def\n"); fprintf(fp, " 0 setgray 0 setlinecap\n"); fprintf(fp, " 1 setlinewidth 0 setlinejoin\n"); fprintf(fp, " 10 setmiterlimit [] 0 setdash\n"); fprintf(fp, " newpath\n"); fprintf(fp, " /languagelevel where\n"); fprintf(fp, " {pop languagelevel\n"); fprintf(fp, " 1 ne\n"); fprintf(fp, " {false setstrokeadjust\n"); fprintf(fp, " false setoverprint\n"); fprintf(fp, " }if\n"); fprintf(fp, " }if\n"); fprintf(fp, "}bind def\n"); fprintf(fp, "%%\n"); fprintf(fp, "/EndEPSF {%%def\n"); fprintf(fp, " count op_count sub {pop}repeat\n"); fprintf(fp, " countdictstack\n"); fprintf(fp, " dict_count sub {end}repeat\n"); fprintf(fp, " b4_Inc_state restore\n"); fprintf(fp, "}bind def\n"); fprintf(fp, "%%\n"); /* emit character encoding definition, if necessary */ if (encoding && strcmp(encoding->defstr, "isolatin1encoding") == 0) fprintf(fp, "%s", latin1def); if (encoding && strcmp(encoding->defstr, "isolatin2encoding") == 0) fprintf(fp, "%s", latin2def); } static void print_pageinit(page) u_int page; { window_width = paper->width - paper_xmargin * 2; window_height = paper->height - paper_ymargin * 2; fprintf(fp, "%%%%Page: %d %d\n", page, page); #if 1 /*XXX*/ fprintf(fp, "/ypos YMARGIN -1 mul 4 sub def\n"); fprintf(fp, "/xpos 0 def\n"); #else fprintf(fp, "/ypos YMARGIN -1 mul def\n"); fprintf(fp, "/xpos XMARGIN def\n"); #endif fprintf(fp, "initcharsize\n"); if (!colorps) fprintf(fp, "90 rotate newpath writebox\n"); else { setpencolor(back); fprintf(fp, "90 rotate newpath writeboxfill\n"); } fprintf(fp, "gsave\n"); } static void process_direc_print(cp) struct ctrl *cp; { struct fontmap *font; int code; switch(cp->ct_op) { case CTL_SIZE: char_size[0] = window_height * cp->ctf_value / 100; fprintf(fp, "%d setcharsize\n", char_size[0]); break; case CTL_PSFONT: font = findfont(cp->ct_op,ASCII,cp->ctc_value); if(font) curfont[ASCII] = font; break; #ifdef VFLIB case CTL_VFONT: font = findfont(cp->ct_op, KANJI, cp->ctc_value); if (font) curfont[KANJI] = font; break; #endif /*VFLIB*/ #ifdef FREETYPE case CTL_TFONT: font = findfont(cp->ct_op, ASCII, cp->ctc_value); if (font) curfont[ASCII] = font; break; #ifdef FREETYPE_CHARSET16 case CTL_TMFONT: font = findfont(cp->ct_op, KANJI, cp->ctc_value); if (font) curfont[KANJI] = font; break; #endif /*FREETYPE_CHARSET16*/ #endif case CTL_XFONT2: if (strcmp(cp->ctc2_value2, "iso8859-1") == 0) code = ASCII; else if (strncmp(cp->ctc2_value2, "jisx0208", 8) == 0) code = KANJI; else { fprintf(stderr, "unsupported XFONT registry %s\n", cp->ctc2_value2); exit(1); } font = findfont(cp->ct_op, code, cp->ctc2_value1); if (font) curfont[code] = font; break; case CTL_XFONT: fprintf(stderr, "internal error: " "obsolete directive CTL_XFONT\n"); exit(1); case CTL_VGAP: vert_gap[0] = cp->cti_value; fprintf(fp, "/vertgap %d def\n", cp->cti_value); break; case CTL_HGAP: horiz_gap[0] = cp->cti_value; fprintf(fp, "/horizgap %d def\n", cp->cti_value); break; case CTL_GAP: vert_gap[0] = horiz_gap[0] = cp->cti_value; fprintf(fp, "/vertgap %d def ", cp->cti_value); fprintf(fp, "/horizgap %d def\n", cp->cti_value); break; case CTL_CENTER: align = AL_CENTER; break; case CTL_LEFT: align = AL_LEFT; break; case CTL_LEFTFILL: align = AL_LEFTFILL0; break; case CTL_RIGHT: align = AL_RIGHT; break; case CTL_IMAGE: image_remember(cp, &imagepool[nimagepool]); line_skip(imagepool[nimagepool].xsiz, imagepool[nimagepool].ysiz); /* placeholder */ textpool[ntextpool].pfx = 0; textpool[ntextpool].xoffset = 0; textpool[ntextpool].xsiz = imagepool[nimagepool].xsiz; textpool[ntextpool].size = imagepool[nimagepool].ysiz; textpool[ntextpool].font = 0; /*image*/ textpool[ntextpool].text = NULL; textpool[ntextpool].fore = fore; /*XXX*/ textpool[ntextpool].back = back; /*XXX*/ ntextpool++; nimagepool++; break; case CTL_BAR: print_bar(cp); break; case CTL_PREFIX: curprefix = cp->ctc_value; break; case CTL_PREFIXN: xprefix = window_width * cp->ctf_value / 100; break; case CTL_TABPREFIX: tabprefix = cp->ctc_value; break; case CTL_TABPREFIXN: tabxprefix = window_width * cp->ctf_value / 100; break; case CTL_PREFIXPOS: if (tabprefix) print_line(tabprefix, 1); else if (curprefix) print_line(curprefix, 1); break; case CTL_TEXT: { if (!cp->ctc_value) break; print_line(cp->ctc_value, 0); if (align == AL_LEFTFILL0) align = AL_LEFTFILL1; /* disable super/subscript for next line */ if (char_off != 0) { char_size[0]=nonscaled_size[0]; char_off=0; } break; } case CTL_ICON: print_icon(cp); break; case CTL_LINESTART: line_start(); break; case CTL_LINEEND: line_end(); if (align == AL_LEFTFILL1) align = AL_LEFTFILL0; break; case CTL_FORE: fore = cp->ctl_value; break; #if 0 /* it's not necessary */ case CTL_BACK: back = cp->ctl_value; break; #endif /* * MARK and AGAIN processing by A.Ito, 14 Jul. 2000 */ case CTL_MARK: fprintf(fp,"/markx xpos def /marky ypos def\n"); break; case CTL_AGAIN: fprintf(fp,"markx marky moveto /xpos markx def /ypos marky def\n"); break; case CTL_VALIGN: valign = cp->cti_value; break; case CTL_AREA: window_width = (paper->width - paper_xmargin * 2) * cp->ctar_width / 100; window_height = (paper->height - paper_ymargin * 2) * cp->ctar_height / 100; fprintf(fp, "grestore\ngsave\n"); fprintf(fp, "%f dup scale\n", cp->ctar_height / 100.0); fprintf(fp, "WIDTH XMARGIN 2 mul sub %f mul 0 translate\n", (double)cp->ctar_xoff / cp->ctar_height); fprintf(fp, "/XBODY WIDTH XMARGIN 2 mul sub %f mul def\n", (double)cp->ctar_width / cp->ctar_height); fprintf(fp, "/ypos YMARGIN -1 mul 4 sub HEIGHT %f mul sub def\n", (double)cp->ctar_yoff / cp->ctar_height); fprintf(fp, "/xpos 0 def\n"); break; case CTL_OPAQUE: if (cp->cti_value > 100){ fprintf(stderr, "%%opaque: value should be 0-100\n"); cp->cti_value = 100; } fprintf(fp, "%f setgray\n", 1.0 - (float)cp->cti_value /100.0); break; /* setup for super/subscript */ case CTL_SETSUP: if (cp->cti3_value1 > 100 || cp->cti3_value1 < 10){ sup_off = DEFAULT_SUPOFF; }else{ sup_off = cp->cti3_value1 / 100.; } if (cp->cti3_value2 > 100 || cp->cti3_value2 < 10){ sub_off = DEFAULT_SUBOFF; }else{ sub_off = cp->cti3_value2 / 100.; } if (cp->cti3_value3 > 100 || cp->cti3_value3 < 10){ sup_scale = DEFAULT_SUPSCALE; }else{ sup_scale = cp->cti3_value3 / 100.; } break; /* subscript */ case CTL_SUB: /* save old size and set new one */ nonscaled_size[0] = char_size[0]; char_size[0] = char_size[0] * sup_scale; char_off = nonscaled_size[0] * (-sub_off); fprintf(fp, "%d setcharsize\n", char_size[0]); break; /* superscript */ case CTL_SUP: /* save old size and set new one */ nonscaled_size[0] = char_size[0]; char_size[0] = char_size[0] * sup_scale; char_off = nonscaled_size[0] * sup_off; fprintf(fp, "%d setcharsize\n", char_size[0]); break; default: break; } } static void scan_backcolor(u_int page) { struct ctrl *cp; u_int line; for (line = 0; line <= page_attribute[page].pg_linenum; line++) { for (cp = page_control[page][line]; cp; cp = cp->ct_next) switch(cp->ct_op) { case CTL_BACK: back = cp->ctl_value; break; default: break; } } } static void line_start() { linewidth = 0; nimagepool = 0; ntextpool = 0; } static void line_end() { int i; char *alignstr; switch (align) { case AL_CENTER: alignstr = "center"; break; case AL_LEFT: case AL_LEFTFILL0: case AL_LEFTFILL1: alignstr = "left"; break; case AL_RIGHT: alignstr = "right"; break; default: alignstr = ""; break; } /* * line output starts here */ if (mgp_flag & FL_VERBOSE) fprintf(fp, "%% a line starts here\n"); /* * if we have nothing on the line, skip it */ if (!ntextpool && !nimagepool){ fprintf(fp, "initcharsize %d setcharsize\n", char_size[0]); goto done; } /* * push strings in reverse order. */ fprintf(fp, "initcharsize\n"); fprintf(fp, "0 %% sentinel for text width computation\n"); fprintf(fp, "gsave newpath 0 0 moveto\n"); for (i = ntextpool - 1; 0 <= i; i--) { if (!textpool[i].text) { fprintf(fp, "%d add\n", textpool[i].xsiz); continue; } #if 0 loadfont(textpool[i].font, textpool[i].charset); #endif fprintf(fp, "%d setcharsize %d %s %s calcy\n", textpool[i].size, textpool[i].size, fontstring(textpool[i].font), textpool[i].text); fprintf(fp, "%d setcharsize %d %s %s " "1 copy stringwidth pop 3 2 roll add\n", textpool[i].size, textpool[i].size, fontstring(textpool[i].font), textpool[i].text); } fprintf(fp, "grestore\n"); if (mgp_flag & FL_VERBOSE) { fprintf(fp, "%% stack should have: str3 str2 str1 width\n"); fprintf(fp, "%% alignment: %s\n", alignstr); } /* * now show those chars with line wrapping. brief logic is: * * position adjust; * foreach i (item in textpool) { * if (item exceeds the right edge) { * carriage return; * position adjust; * } * show; * } */ fprintf(fp, "/totlen exch def\n"); fprintf(fp, "/totlen totlen %d add def\n", tabxprefix ? tabxprefix:xprefix); fprintf(fp, "/inmargin true def /fillzero XMARGIN def\n"); fprintf(fp, "%sdefxpos ", alignstr); /* * to determine text base line, we need to set imgsize first. pretty ugly.. */ { struct ctrl *cp1; for (i = 0; i < nimagepool; i++) { cp1 = imagepool[i].image; if (cp1) fprintf(fp, "%d setimgsize\n", imagepool[i].ysiz); /*XXX*/ } } fprintf(fp, "/yypos ypos charsize imgsize gt \n"); switch(valign){ case VL_TOP: fprintf(fp, " { 0 } { 0 } ifelse sub def\n"); break; case VL_BOTTOM: fprintf(fp, " { 0 } { imgsize charsize sub } ifelse sub def\n"); break; case VL_CENTER: fprintf(fp, " { 0 } { imgsize charsize sub 2 div } ifelse sub def\n"); break; } fprintf(fp, "/xpos xpos %d add def\n", tabxprefix ? tabxprefix:xprefix); fprintf(fp, "xpos yypos ymax sub moveto\n"); for (i = 0; i < ntextpool; i++) { if (textpool[i].text) { #if 0 loadfont(textpool[i].font, textpool[i].charset); #endif fprintf(fp, "%d %s 1 copy stringwidth pop ", textpool[i].size, fontstring(textpool[i].font)); } else fprintf(fp, "%d ", textpool[i].xsiz); fprintf(fp, "updatetotlen "); if (textpool[i].text) fprintf(fp, "%snewlinecheck ", alignstr); else fprintf(fp, "pop "); if (colorps && (i == 0 || (textpool[i - 1].fore != textpool[i].fore) || (textpool[i - 1].back != textpool[i].back))) { fprintf(fp, "\n"); setpencolor(textpool[i].fore); } if (textpool[i].text) { if (!textpool[i].pfx) fprintf(fp, "updatefillzero "); /* for super/subscript: modify the current y-position */ if (textpool[i].yoffset != 0) fprintf(fp, "currentpoint %d add moveto ", textpool[i].yoffset); fprintf(fp, "show\n"); /* for super/subscript: reset the old y-position */ if (textpool[i].yoffset != 0) fprintf(fp, "currentpoint %d sub moveto ", textpool[i].yoffset); } else { fprintf(fp, "\n"); if (textpool[i].font) { /* icon */ icon_output(&textpool[i]); } else { /* image */ fprintf(fp, "%d 0 rmoveto\n", textpool[i].xsiz); } } fprintf(fp, "/xpos%d currentpoint pop def\n", i); } ntextpool = 0; { struct ctrl *cp1; for (i = 0; i < nimagepool; i++) { if (mgp_flag & FL_VERBOSE) fprintf(fp, "%% emit the content of imagepool\n"); cp1 = imagepool[i].image; #if 0 if (!cp1) { fprintf(fp, "/xpos xpos%d def xpos ypos moveto\n", imagepool[i].target_text); continue; } image_load_print(cp1->ctm_fname, cp1->ctm_numcolor, cp1->ctm_ximagesize, cp1->ctm_yimagesize, 0, cp1->ctm_zoomflag); fprintf(fp, "%d setimgsize\n", imagepool[i].ysiz); /*XXX*/ #else if (cp1) { image_load_print(cp1->ctm_fname, cp1->ctm_numcolor, cp1->ctm_ximagesize, cp1->ctm_yimagesize, 0, cp1->ctm_zoomflag, cp1->ctm_rotate); } fprintf(fp, "/xpos xpos%d def xpos ypos moveto\n", imagepool[i].target_text); #endif } nimagepool = 0; } done: fprintf(fp, "NL\n"); tabprefix = NULL; tabxprefix = 0; } static void icon_output(tp) struct textpool *tp; { int isize = tp->size; int csize = tp->xsiz; int ixoff, iyoff; int paintit; iyoff = (csize - isize) / 6; /*XXX*/ ixoff = tp->xoffset + (csize - isize) / 2; /* XXX */ paintit = (painticon || colorps); switch ((int)tp->font) { /*XXX*/ case 0: /* XXX: image is not supported yet */ break; case 1: /* this is box */ fprintf(fp, "currentpoint "); if (paintit) fprintf(fp, "currentpoint newpath moveto "); fprintf(fp, "%d %d rmoveto ", ixoff, iyoff); fprintf(fp, "0 %d rlineto ", isize); fprintf(fp, "%d 0 rlineto ", isize); fprintf(fp, "0 %d rlineto ", -isize); fprintf(fp, "%d 0 rlineto ", -isize); if (paintit) fprintf(fp, "closepath eofill "); fprintf(fp, "stroke moveto\n"); fprintf(fp, "%d 0 rmoveto\n", ixoff * 2 + isize); break; case 2: /* this is arc */ fprintf(fp, "currentpoint "); if (paintit) fprintf(fp, "currentpoint newpath moveto "); fprintf(fp, "%d %d rmoveto ", ixoff + isize, iyoff + isize/2); fprintf(fp, "currentpoint exch %d add exch %d 0 360 arc ", -isize/2, isize/2); if (paintit) fprintf(fp, "closepath eofill "); fprintf(fp, "stroke moveto\n"); fprintf(fp, "%d 0 rmoveto\n", ixoff * 2 + isize); break; case 3: fprintf(fp, "currentpoint "); if (paintit) fprintf(fp, "currentpoint newpath moveto "); fprintf(fp, "%d %d rmoveto ", ixoff, iyoff); fprintf(fp, "%d 0 rlineto ", isize); fprintf(fp, "%d %d rlineto ", -isize/2, isize); fprintf(fp, "%d %d rlineto ", -isize/2, -isize); if (paintit) fprintf(fp, "closepath eofill "); fprintf(fp, "stroke moveto\n"); fprintf(fp, "%d 0 rmoveto\n", ixoff * 2 + isize); break; case 4: fprintf(fp, "currentpoint "); if (paintit) fprintf(fp, "currentpoint newpath moveto "); fprintf(fp, "%d %d rmoveto ", ixoff, iyoff + isize); fprintf(fp, "%d 0 rlineto ", isize); fprintf(fp, "%d %d rlineto ", -isize/2, -isize); fprintf(fp, "%d %d rlineto ", -isize/2, isize); if (paintit) fprintf(fp, "closepath eofill "); fprintf(fp, "stroke moveto\n"); fprintf(fp, "%d 0 rmoveto\n", ixoff * 2 + isize); break; case 5: fprintf(fp, "currentpoint "); if (paintit) fprintf(fp, "currentpoint newpath moveto "); fprintf(fp, "%d %d rmoveto ", ixoff, iyoff); fprintf(fp, "0 %d rlineto ", isize); fprintf(fp, "%d %d rlineto ", isize, -isize/2); fprintf(fp, "%d %d rlineto ", -isize, -isize/2); if (paintit) fprintf(fp, "closepath eofill "); fprintf(fp, "stroke moveto\n"); fprintf(fp, "%d 0 rmoveto\n", ixoff * 2 + isize); break; case 6: fprintf(fp, "currentpoint "); if (paintit) fprintf(fp, "currentpoint newpath moveto "); fprintf(fp, "%d %d rmoveto ", ixoff + isize, iyoff); fprintf(fp, "0 %d rlineto ", isize); fprintf(fp, "%d %d rlineto ", -isize, -isize/2); fprintf(fp, "%d %d rlineto ", isize, -isize/2); if (paintit) fprintf(fp, "closepath eofill "); fprintf(fp, "stroke moveto\n"); fprintf(fp, "%d 0 rmoveto\n", ixoff * 2 + isize); break; case 7: fprintf(fp, "currentpoint "); if (paintit) fprintf(fp, "currentpoint newpath moveto "); fprintf(fp, "%d %d rmoveto ", ixoff, iyoff + isize/2); fprintf(fp, "%d %d rlineto ", isize/2, isize/2); fprintf(fp, "%d %d rlineto ", isize/2, -isize/2); fprintf(fp, "%d %d rlineto ", -isize/2, -isize/2); fprintf(fp, "%d %d rlineto ", -isize/2, isize/2); if (paintit) fprintf(fp, "closepath eofill "); fprintf(fp, "stroke moveto\n"); fprintf(fp, "%d 0 rmoveto\n", ixoff * 2 + isize); break; } } static void line_skip(x, y) int x; int y; { linewidth += x; lineheight = (lineheight < y) ? y : lineheight; } static void print_bar(cp) struct ctrl *cp; { struct ctrl_bar pbar; pbar.ct_width = cp->ctb_width * w_height / 1000; pbar.ct_start = cp->ctb_start * w_width / 100; pbar.ct_length = cp->ctb_length * w_width / 100; fprintf(fp, "%%bar color %d %d %d\n", cp->ctb_width, cp->ctb_start, cp->ctb_length); fprintf(fp, "XMARGIN ypos moveto\n"); fprintf(fp, "%d 0 rmoveto\n", pbar.ct_start); fprintf(fp, "%d %d rlineto\n", 0, pbar.ct_width * -1); fprintf(fp, "%d %d rlineto\n", pbar.ct_length, 0); fprintf(fp, "%d %d rlineto\n", 0, pbar.ct_width); fprintf(fp, "%d %d rlineto stroke\n", pbar.ct_length * -1, 0); fprintf(fp, "/ypos ypos %d sub def\n", cp->ctb_width + VERT_GAP(char_size[0]) / 2); fprintf(fp, "xpos ypos moveto\n"); linewidth = 0; } static void print_icon(cp) struct ctrl *cp; { int i; int itype, isize; static struct ctl_words icon_words[] = { { 1, 'x', "box", 3 }, { 2, 'x', "arc", 3 }, { 3, 'x', "delta1", 6 }, { 4, 'x', "delta2", 6 }, { 5, 'x', "delta3", 6 }, { 6, 'x', "delta4", 6 }, { 7, 'x', "dia", 3 }, { 0, 'x', NULL, 0 } }; for (i = 0; icon_words[i].ctl_strlen != 0; i++) { if (!strncasecmp(cp->ctic_value, icon_words[i].ctl_string, strlen(cp->ctic_value))) break; } itype = icon_words[i].ctl_type; isize = char_size[0] * cp->ctic_size / 100; icon_remember(itype, isize, linewidth, cp->ctic_color); linewidth += char_size[0]; } static void print_line(data, pfx) char *data; int pfx; { if (data && *data) print_string(data, pfx); } static int iskinsokuchar(code) u_int code; { u_short *kinsoku; for (kinsoku = kinsokutable; *kinsoku; kinsoku++) { if (code == *kinsoku) return 1; } return 0; } static void print_string(data, pfx) char *data; int pfx; { u_char *p, *q; int kanji = 0; u_int code2; p = (u_char *)data; while (*p && *p != '\n') { if (p[0] == 0x1b && p[1] == '$' && (p[2] == 'B' || p[2] == '@')) { kanji = 1; p += 3; continue; } if (p[0] == 0x1b && p[1] == '(' && (p[2] == 'B' || p[2] == 'J')) { kanji = 0; p += 3; continue; } #if 0 if (!kanji && isspace(p[0])) { p++; linewidth += continue; } #endif if (kanji) { for (q = p + 2; 0x21 <= q[0] && q[0] <= 0x7e; q += 2) { code2 = q[0] * 256 + q[1]; if (!iskinsokuchar(code2)) break; } } else { q = p; while (*q && isprint(*q) && !isspace(*q)) q++; if (q == p) q++; else { /* append spaces to the end of the word. */ while (*q && isspace(*q)) q++; } } print_fragment(p, q - p, kanji, pfx); p = q; } } static void print_fragment(data, len, kanjimode, pfx) u_char *data; u_int len; int kanjimode; int pfx; { u_char *p; char *q; char buf[4096]; u_int code; int textstartpos = 0; #define OPENBRACE(kanji) ((kanji) ? '<' : '(') #define CLOSEBRACE(kanji) ((kanji) ? '>' : ')') #define DANGERLETTER(x) \ ((x) == '(' || (x) == ')' || (x) == '\\') p = data; if (kanjimode) { q = &buf[1]; while (len) { code = p[0] * 256 + p[1]; sprintf(q, "%04x ", code); p += 2; len -= 2; q += 5; } buf[0] = OPENBRACE(kanjimode); *q++ = CLOSEBRACE(kanjimode); *q = '\0'; text_remember(buf, KANJI, char_size[0], textstartpos, pfx); } else { /* must take care of escaping those "dangerous" letters */ q = &buf[0]; *q++ = OPENBRACE(kanjimode); while (len) { if (DANGERLETTER(p[0])) *q++ = '\\'; *q++ = *p++; len--; } *q++ = CLOSEBRACE(kanjimode); *q++ = '\0'; text_remember(buf, ASCII, char_size[0], textstartpos, pfx); } /* by A.Ito 14 Jul. 2000 */ /* placeholder */ imagepool[nimagepool].image = NULL; #if 1 imagepool[nimagepool].target_text = ntextpool-1; #else imagepool[nimagepool].target_text = nimagepool; #endif nimagepool++; } static char * checkeps(fname) char *fname; { static char epsfile[MAXPATHLEN]; static char fullname[MAXPATHLEN]; char *p; /* rewrite file suffix, if it is not "ps" nor "eps". */ strcpy(epsfile, fname); p = strrchr(epsfile, '.'); if (p) { if (strcmp(p, ".ps") != 0 && strcmp(p, ".eps") != 0 && strcmp(p, ".idraw") != 0) { /* try "basename.eps" */ strcpy(p, ".eps"); } } fullname[0] = '\0'; if (findImage(epsfile, fullname) == 0) return fullname; else return NULL; } static void text_remember(text, ctype, fontsize, offset, pfx) char *text; int ctype; int fontsize; int offset; int pfx; { /*XXX*/ if (strcmp(text, "()") == 0) return; if (!curfont[ctype]) { fprintf(stderr, "cannot find proper font, skipping\n"); return; } textpool[ntextpool].pfx = pfx; textpool[ntextpool].xoffset = offset; textpool[ntextpool].yoffset = char_off; textpool[ntextpool].xsiz = linewidth - offset; textpool[ntextpool].size = fontsize; textpool[ntextpool].font = curfont[ctype]; textpool[ntextpool].text = strdup(text); textpool[ntextpool].fore = fore; textpool[ntextpool].back = back; ntextpool++; } static void icon_remember(icon, fontsize, offset, color) int icon; int fontsize; int offset; u_long color; { textpool[ntextpool].pfx = 1; textpool[ntextpool].xoffset = offset; textpool[ntextpool].xsiz = char_size[0]; textpool[ntextpool].size = fontsize; textpool[ntextpool].font = (struct fontmap *)icon; /*XXX*/ textpool[ntextpool].text = NULL; textpool[ntextpool].fore = color; textpool[ntextpool].back = back; /*XXX*/ ntextpool++; } /* !TODO: move rotation code into some library */ /* rotate image by 90 degrees (counter clockwise) */ static void rotate_image_p90(image) Image *image; { unsigned int row, column, pl = image->pixlen; unsigned int new_height = image->width, new_width = image->height, new_linelen = new_width * pl; byte *src, *tgt, *col_head; Pixel d; /* allocate buffer for new image */ byte *rot_data = lmalloc(new_linelen * new_height); /* do the rotation */ for (row = 0, src = image->data, col_head = rot_data + (new_height - 1) * new_linelen; row < image->height; row++, col_head += pl) { for (column = 0, tgt = col_head; column < image->width; column++, src += pl, tgt -= new_linelen) { d = memToVal(src, pl); valToMem(d, tgt, pl); } } /* swap to rotated image, exchange height and width and point to rotated data */ image->height = new_height; image->width = new_width; lfree(image->data); image->data = rot_data; } /* rotate image by -90 degrees (clockwise) */ static void rotate_image_m90(image) Image *image; { unsigned int row, column, pl = image->pixlen; unsigned int new_height = image->width, new_width = image->height, new_linelen = new_width * pl; byte *src, *tgt; Pixel d; /* allocate buffer for new image */ byte *rot_data = lmalloc(new_linelen * new_height); /* do the rotation */ for (row = 0, src = image->data; row < image->height; row++) { for (column = 0, tgt = rot_data + new_linelen - (row + 1) * pl; column < image->width; column++, src += pl, tgt += new_linelen) { d = memToVal(src, pl); valToMem(d, tgt, pl); } } /* swap to rotated image, exchange height and width and point to rotated data */ image->height = new_height; image->width = new_width; lfree(image->data); image->data = rot_data; return; } /* rotate image by 180 degrees */ static void rotate_image_180(image) Image *image; { unsigned int row, column, pl = image->pixlen; unsigned int new_height = image->height, new_width = image->width, new_linelen = new_width * pl; byte *src, *tgt; Pixel d; /* allocate buffer for new image */ byte *rot_data = lmalloc(new_linelen * new_height); /* do the rotation */ for (row = 0, src = image->data; row < image->height; row++) { for (column = 0, tgt = rot_data + (new_height - row) * new_linelen - pl; column < image->width; column++, src += pl, tgt -= pl) { d = memToVal(src, pl); valToMem(d, tgt, pl); } } /* swap to rotated image, exchange height and width and point to rotated data */ image->height = new_height; image->width = new_width; lfree(image->data); image->data = rot_data; return; } static void image_remember(cp, pool) struct ctrl *cp; struct imagepool *pool; { char *epsname; Image *myimage; float xzoom, yzoom; int x1, y1, x2, y2, width, height, swidth, sheight; struct render_state state; if ((epsname = checkeps(cp->ctm_fname))){ if (ps_boundingbox(epsname, &x1, &y1, &x2, &y2) < 0) goto noneps; width = x2 - x1; height = y2 - y1; } else { myimage = loadImage(cp->ctm_fname, mgp_flag & FL_VERBOSE); if (!myimage) { fprintf(stderr, "failed to open %s\n", cp->ctm_fname); exit(1); } switch (cp->ctm_rotate) { case 0: /* Do nothing */ break; case -90: case 270: rotate_image_m90(myimage); break; case 90: rotate_image_p90(myimage); break; case -180: case 180: rotate_image_180(myimage); break; default: fprintf(stderr, "rotation by %d degrees not supported.\n", rotate); cleanup(-1); } width = myimage->width; height = myimage->height; freeImage(myimage); } xzoom = (!cp->ctm_ximagesize ? 100 : cp->ctm_ximagesize); yzoom = (!cp->ctm_yimagesize ? 100 : cp->ctm_yimagesize); state.width = window_width; state.height = window_height; image_zoomratio(&state, &xzoom, &yzoom, cp->ctm_zoomflag, width, height); swidth = (int) width * xzoom / 100; sheight = (int) height * yzoom / 100; pool->xsiz = swidth; pool->ysiz = sheight; pool->xoffset = linewidth; pool->image = cp; return; noneps: myimage = loadImage(cp->ctm_fname, mgp_flag & FL_VERBOSE); if (!myimage) { fprintf(stderr, "failed to open %s\n", cp->ctm_fname); exit(1); } switch (cp->ctm_rotate) { case 0: /* Do nothing */ break; case -90: case 270: rotate_image_m90(myimage); break; case 90: rotate_image_p90(myimage); break; case -180: case 180: rotate_image_180(myimage); break; default: fprintf(stderr, "rotation by %d degrees not supported.\n", rotate); cleanup(-1); } pool->xsiz = myimage->width; pool->ysiz = myimage->height; freeImage(myimage); pool->xoffset = linewidth; pool->image = cp; } static void image_load_print(filename, numcolor, ximagesize, yimagesize, backflag, zoomflag, rotate) char *filename; int numcolor; int ximagesize; int yimagesize; int backflag; int zoomflag; int rotate; { Image *myimage, *image; Pixmap mypixmap; XImageInfo *ximageinfo; XImage *print_image; int width, height; float xzoomrate, yzoomrate; static Cursor curs; u_int print_width, print_height; struct render_state state; int xpos = 0; if (zoomflag == 2) ximagesize = yimagesize = 0; /* hook for eps */ { char *p; FILE *epsfp; p = checkeps(filename); if (p) { epsfp = fopen(p, "r"); print_eps(epsfp, p, numcolor, ximagesize, yimagesize, backflag, zoomflag); fclose(epsfp); return; } } if (!curs) curs = XCreateFontCursor(display, XC_watch); XDefineCursor(display, window, curs); XFlush(display); screen = DefaultScreen(display); if ((myimage = loadImage(filename, verbose)) == NULL) exit(-1); /* fail to load image data */ switch (rotate) { case 0: /* Do nothing */ break; case -90: case 270: rotate_image_m90(myimage); break; case 90: rotate_image_p90(myimage); break; case -180: case 180: rotate_image_180(myimage); break; default: fprintf(stderr, "rotation by %d degrees not supported.\n", rotate); cleanup(-1); } width = myimage->width; height = myimage->height; if (numcolor) myimage = reduce(myimage, numcolor, verbose); #if 0 if (ximagesize != 0 && yimagesize != 0) { if (!zoomflag) { xzoomrate = (float) window_width * ximagesize / width; yzoomrate = (float) window_height * yimagesize / height; } else { xzoomrate = (float) ximagesize; yzoomrate = (float) yimagesize; } image = myimage; myimage = zoom(image, xzoomrate, yzoomrate, verbose); freeImage(image); } else xzoomrate = yzoomrate = 100.0; #else xzoomrate = (float) ximagesize; yzoomrate = (float) yimagesize; state.width = window_width; state.height = window_height; image_zoomratio(&state, &xzoomrate, &yzoomrate, zoomflag, width, height); image = myimage; myimage = zoom(image, xzoomrate, yzoomrate, verbose); freeImage(image); width = myimage->width; height = myimage->height; #endif if (! (ximageinfo= imageToXImage(display, screen, visual, depth, myimage, 0, 0, 0, verbose))) { fprintf(stderr, "Cannot convert Image to XImage\n"); exit(1); } mypixmap = ximageToPixmap(display, RootWindow(display, 0), ximageinfo); if (!mypixmap) { fprintf(stderr, "Cannot create image in server\n"); exit(1); } switch (align) { case AL_LEFT: case AL_LEFTFILL0: case AL_LEFTFILL1: xpos = 0; break; case AL_CENTER: xpos = (window_width - width) / 2; break; case AL_RIGHT: xpos = window_width - width; break; } print_width = myimage->width; print_height = myimage->height; print_image = XGetImage(display, mypixmap, 0, 0, print_width, print_height, AllPlanes, ZPixmap); fprintf(fp, "gsave\n"); /* fixed by A.Ito */ fprintf(fp, "xpos ypos %d sub translate\n", print_height); fprintf(fp, "%d %d scale\n", print_width, print_height); fprintf(fp, "%d %d 8\n", print_width, print_height); fprintf(fp, "[%d 0 0 %d 0 %d]\n", print_width, -1 * print_height, print_height); fprintf(fp, "{currentfile\n"); fprintf(fp, "%d string readhexstring pop}\n", print_width * 3); fprintf(fp, "false 3\n"); fprintf(fp, "colorimage\n"); /* XXX is there any generic way of doing this? */ switch (print_image->bits_per_pixel) { case 8: print_8_image(print_image); break; case 16: print_full_image(print_image, visual); break; case 32: print_32_image(print_image, visual); break; default: fprintf(stderr, "Sorry unsupported visual %d\n", print_image->bits_per_pixel); exit(-1); } fprintf(fp, "grestore\n"); XFreePixmap(display, mypixmap); freeXImage(myimage, ximageinfo); freeImage(myimage); XUndefineCursor(display, window); XFlush(display); } static void print_usage(name) char *name; { fprintf(stderr, "Usage: %s [-mcirVt] [-f psfile] [-p paper] " "[-x xmargin] [-y ymargin] [-e encoding] mgpfile\n", name); exit(0); } #if 0 static int set_position() { u_int x; switch(align) { case AL_CENTER: x = (window_width - linewidth)/ 2; break; case AL_LEFT: case AL_LEFTFILL0: case AL_LEFTFILL1: x = 0; break; case AL_RIGHT: x = window_width - linewidth; break; default: x = 0; break; } return x; } #endif static void setpencolor(c) u_long c; { /* * update the color of the pen. * XXX background is ignored at this moment */ XColor color; color.pixel = c; XQueryColor(display, colormap, &color); #if 0 if (color.red == color.green && color.green == color.blue) { /* XXX: invert white-to-gray colors */ color.red = 65535 - color.red; color.green = 65535 - color.green; color.blue = 65535 - color.blue; } #endif fprintf(fp, "%f %f %f setrgbcolor %% #%08x depth %d\n", color.red / 65535.0, color.green / 65535.0, color.blue / 65535.0, (int) color.pixel, depth); } static void print_full_image(print_image, visual) XImage *print_image; Visual *visual; { u_int x, y; u_int r, g, b; u_int count = 0; u_int width, height, byte_width; u_short *data; data = (u_short *)print_image->data; width = print_image->width; height = print_image->height; byte_width = print_image->bytes_per_line / sizeof(u_short); for (y = 0; y < height; y ++) { for (x = 0; x < width; x ++) { r = ((data[x + y * byte_width] & visual->red_mask) >> 11) & 0xff; g = ((data[x + y * byte_width] & visual->green_mask) >> 5) & 0xff; b = (data[x + y * byte_width] & visual->blue_mask) & 0xff; if (reverse) fprintf(fp, "%02x%02x%02x", ~(r << 3) & 0xff, ~(g << 2) & 0xff, ~(b << 3) & 0xff); else fprintf(fp, "%02x%02x%02x", r << 3, g << 2, b << 3); count ++; if (count == 10) { count = 0; fprintf(fp, "\n"); } } } } static void print_32_image(print_image, visual) XImage *print_image; Visual *visual; { u_int x, y; u_int r, g, b; u_int count = 0; u_int width, height; u_short *data; data = (u_short *)print_image->data; width = print_image->width; height = print_image->height; for (y = 0; y < height; y ++) { for (x = 0; x < width; x ++) { unsigned long pix; pix = XGetPixel(print_image, x, y); r = ((pix & visual->red_mask) >> 16) & 0xff; g = ((pix & visual->green_mask) >> 8) & 0xff; b = pix & visual->blue_mask & 0xff; if (reverse) fprintf(fp, "%02x%02x%02x", ~r & 0xff, ~g & 0xff, ~b & 0xff); else fprintf(fp, "%02x%02x%02x", r, g, b); count ++; if (count == 10) { count = 0; fprintf(fp, "\n"); } } } } static void print_8_image(print_image) XImage *print_image; { u_int x, y; u_int count = 0; u_char *data; u_int width, height, byte_width; data = (u_char *)print_image->data; width = print_image->width; height = print_image->height; byte_width = print_image->bytes_per_line / sizeof(u_char); for (y = 0; y < height; y ++) { for (x = 0; x < width; x ++) { if (reverse) fprintf(fp, "%02x%02x%02x", ~data[x + y * byte_width] & 0xff, ~data[x + y * byte_width] & 0xff, ~data[x + y * byte_width] & 0xff); else fprintf(fp, "%02x%02x%02x", data[x + y * byte_width], data[x + y * byte_width], data[x + y * byte_width]); count ++; if (count == 10) { count = 0; fprintf(fp, "\n"); } } } } static void print_eps(epsfp, filename, numcolor, ximagesize, yimagesize, backflag, zoomflag) FILE *epsfp; char *filename; int numcolor; int ximagesize; int yimagesize; int backflag; int zoomflag; { char line1[BUFSIZ]; char line2[BUFSIZ]; char line[BUFSIZ]; int x1, y1, x2, y2, height, width, sheight, swidth; int xpos = 0; float xzoomrate, yzoomrate; double xscale, yscale; int noboundingbox; struct render_state state; if (fgets(line1, sizeof(line1), epsfp) == NULL) { fprintf(stderr, "no first line in %s.\n", filename); exit(1); } if (strncmp(line1, "%!", 2) != 0) { fprintf(stderr, "non eps file %s used as eps.\n", filename); exit(1); } noboundingbox = 1; while (1) { if (fgets(line2, sizeof(line2), epsfp) == NULL) break; if (line2[0] != '%') break; if (strncmp(line2, "%%EndComments", 12) == 0) break; if (sscanf(line2, "%%%%BoundingBox: %d %d %d %d", &x1, &y1, &x2, &y2) == 4) { noboundingbox = 0; break; } } if (noboundingbox) { fprintf(stderr, "no bounding box in %s.\n", filename); exit(1); } /* width/height of original image */ width = x2 - x1; height = y2 - y1; ximagesize = (!ximagesize ? 100 : ximagesize); yimagesize = (!yimagesize ? 100 : yimagesize); #if 0 /* scaling factor */ switch (zoomflag) { case 0: /* relative to screen size */ xscale = (double)window_width * ximagesize / width / 100; yscale = (double)window_height * yimagesize / height / 100; break; case 1: /* relative to the loaded image */ xscale = (double)ximagesize / 100; yscale = (double)yimagesize / 100; break; case 2: /* relative to screen pixels: don't know how to handle */ xscale = 1.0; yscale = 1.0; break; } #else xzoomrate = (float) ximagesize; yzoomrate = (float) yimagesize; state.width = window_width; state.height = window_height; image_zoomratio(&state, &xzoomrate, &yzoomrate, zoomflag, width, height); xscale = xzoomrate / 100.0; yscale = yzoomrate / 100.0; #endif /* scaled image size */ swidth = (int)(xscale * width); sheight = (int)(yscale * height); switch (align) { case AL_LEFT: case AL_LEFTFILL0: case AL_LEFTFILL1: xpos = 0; break; case AL_CENTER: xpos = (window_width - swidth) / 2; break; case AL_RIGHT: xpos = window_width - swidth; break; } fprintf(fp, "BeginEPSF\n"); /* fprintf(fp, "%d XMARGIN add ypos translate\n", xpos); */ /* by A.Ito */ fprintf(fp, "xpos ypos translate\n"); fprintf(fp, "%f %f scale\n", xscale, yscale); fprintf(fp, "%d %d translate\n", -1 * x1, -1 * y2); fprintf(fp, "%%%%BeginDocument: %s\n", filename); fputs(line1, fp); fputs(line2, fp); while (fgets(line, sizeof(line), epsfp)) { if (strncmp(line, "%%PageBoundingBox:", 18) == 0 || strncmp(line, "%%Trailer", 9) == 0) line[1] = '#'; fputs(line, fp); } fprintf(fp, "%%%%EndDocument\n"); fprintf(fp, "EndEPSF\n"); } /*------------------------------------------------------------*/ int main(argc, argv) int argc; char **argv; { u_int opt; extern char *optarg; extern int optind; char *progname; static char pathbuf[MAXPATHLEN]; #ifdef USE_SETLOCALE setlocale(LC_CTYPE, ""); #endif progname = argv[0]; /* set default paper size */ paper = findpaper(DEFAULT_PAPER_SIZE); while ((opt = getopt(argc, argv, "mciVrf:x:y:p:e:X:Ptg:")) != -1) { switch (opt) { case 'm': /* Added by Arnd Schmitter 23.07.2004 */ PauseMode=1; break; case 'c': colorps++; break; case 'i': painticon++; break; case 'f': strcpy(outputfile, optarg); break; case 'r': reverse = 1; break; case 'V': mgp_flag |= FL_VERBOSE; break; case 'x': paper_xmargin = atoi(optarg); break; case 'y': paper_ymargin = atoi(optarg); break; case 'p': paper = findpaper(optarg); if (!paper) { fprintf(stderr, "Paper size '%s' not recognised. Using %s instead.\n", optarg, DEFAULT_PAPER_SIZE); paper = findpaper(DEFAULT_PAPER_SIZE); } break; case 'e': for (encoding = &encodings[0]; encoding->name; encoding++) { if (strcmp(encoding->name, optarg) == 0) break; } if (!encoding->name) { fprintf(stderr, "unknown encoding %s\n", optarg); exit(1); } break; case 'P': parse_debug++; break; case 't': #ifdef FREETYPE usetfont = 1; #else fprintf(stderr, "you can't use this function with this version\n"); exit(-1); #endif break; case 'X': if (strcmp(optarg, "freetype") == 0) mgp_flag |= FL_NOFREETYPE; else { fprintf(stderr, "unknown rendering engine %s\n", optarg); } break; case 'g': gaplevel = atoi(optarg); break; default: print_usage(progname); /*NOTREACHED*/ } } w_width = paper->width - paper_xmargin * 2; w_height = paper->height - paper_ymargin * 2; argc -= optind; argv += optind; if (argc != 1) { print_usage(progname); /*NOTREACHED*/ } mgp_fname = argv[0]; /* setting up the search path. */ { char *p; loadPathsAndExts(); strncpy(pathbuf, mgp_fname, sizeof(pathbuf)); if ((p = rindex(pathbuf, '/'))) { *p = '\0'; Paths[NumPaths++]= expandPath(pathbuf); } } init_win1(NULL); load_file(mgp_fname); init_win2(); fore = 0UL; back = (1UL << depth) - 1; print_out(); exit(0); } static struct fontmap * findfont(ctrl, lang, font) int ctrl; int lang; char *font; { struct fontmap *p, *q; char *star; if (!font[0]) return NULL; #ifdef FREETYPE if (mgp_flag & FL_NOFREETYPE && ctrl == CTL_TFONT) return NULL; if (lang == ASCII && usetfont) if ((p = findttfont(ctrl, lang, font))) goto found; #endif for (p = fontmap; 0 <= p->ctrl; p++) { if (p->ctrl != ctrl || p->lang != lang) continue; star = strchr(p->font, '*'); if (!star && strcmp(p->font, font) == 0) goto found; if (star && strncmp(p->font, font, star - p->font) == 0) { if(strcmp(font,"k14")==0) goto found; if(ctrl ==CTL_PSFONT) fprintf(stderr,"PSFONT: %s not found\n",font); goto found; } } return NULL; found: if (p->fontid) return p; p->fontid = ++maxfontid; if (mgp_flag & FL_VERBOSE) { char fonttype; switch (ctrl) { #ifdef FREETYPE case CTL_TFONT: fonttype = 't'; break; #endif #ifdef VFLIB case CTL_VFONT: fonttype = 'v'; break; #endif #if 0 case CTL_XFONT: fonttype = 'x'; break; #endif case CTL_XFONT2: fonttype = 'x'; break; case CTL_PSFONT: fonttype = 'p'; break; default: fonttype = '?'; break; } fprintf(fp, "%% %cfont \"%s\" seen, mapped to ps font \"%s\"\n", fonttype, font, p->psfont); if (strcmp(font, p->font) != 0) { fprintf(fp, "%%\t(wildcard match against \"%s\")\n", p->font); } } /* use the same font index for same PS font names */ for (q = fontmap; 0 <= q->ctrl; q++) { if (strcmp(p->psfont, q->psfont) == 0) q->fontid = maxfontid; } return p; } static char * fontstring(font) struct fontmap *font; { static char fontname[10]; sprintf(fontname, "F%03d", font->fontid); return fontname; } static void loadfont(font, name) struct fontmap *font; char *name; { if (!font) { fprintf(stderr, "unable to find proper font for %s\n", name); exit(1); } if (font->loaded) return; /* define font calling sequence */ if (mgp_flag & FL_VERBOSE) { fprintf(fp, "%% loading font \"%s\" for %s\n", font->psfont, font->font); } if (font->lang == ASCII && encoding) { /* * Symbol font does not need latin1-encoding */ if (strcmp(font->psfont, "Symbol") == 0) { fprintf(fp, "/%s%s\n" " /%s findfont\n" " dup length dict begin\n" " {1 index /FID ne {def} {pop " "pop} ifelse} forall\n" " currentdict end\n" "definefont pop\n", fontstring(font), "t", font->psfont); } else { fprintf(fp, "/%s%s\n" " /%s findfont\n" " dup length dict begin\n" " {1 index /FID ne {def} {pop pop} ifelse} forall\n" " /Encoding %s def\n" " currentdict end\n" "definefont pop\n", fontstring(font), "t", font->psfont, encoding->defstr); } fprintf(fp, "/%s {/%s%s findfont exch scalefont setfont} def\n", fontstring(font), fontstring(font), "t"); } else { fprintf(fp, "/%s {/%s findfont exch scalefont setfont} def\n", fontstring(font), font->psfont); } font->loaded = 1; } void cleanup(int sig) { /* dummy */ } #ifdef FREETYPE /* get fontname from ttffile for ttfps */ static struct fontmap * findttfont(ctrl, lang, font) int ctrl; int lang; char *font; { TT_Error error; TT_Face face; TT_Face_Properties properties; u_short platform, encoding, language, id; u_short string_len; struct fontmap *pfont; char *string; char pathname[256]; int i, n, found = 0; static TT_Engine engine; static int initdone = 0, findex = 0; static struct fontmap **loadedfont; if (!font) return NULL; /* already registed? */ for (i = 0; i < findex; i ++){ if (!strcmp(font, loadedfont[i]->font)) return loadedfont[i]; } if (!initdone){ /* Initialize engine */ if ((error = TT_Init_FreeType(&engine))){ fprintf(stderr, "Error while initializing engine, code = %d.\n", (int)error); exit(-1); } initdone ++; } error = TT_Open_Face(engine, font, &face); if (error) { /* add freetypefontdir and try again */ snprintf(pathname, sizeof(pathname), "%s/%s", freetypefontdir, font); error = TT_Open_Face(engine, pathname, &face); if (error) return NULL; } TT_Get_Face_Properties(face, &properties); n = properties.num_Names; for (i = 0; i < n; i++) { TT_Get_Name_ID(face, i, &platform, &encoding, &language, &id); TT_Get_Name_String(face, i, &string, &string_len); /* this check may be weak.. */ if (*string && id == 6){ found = 1; break; } } if (!found) return NULL; /* create fontmap */ pfont = (struct fontmap *)malloc(sizeof(struct fontmap)); pfont->ctrl = ctrl; pfont->lang = lang; pfont->font = font; pfont->psfont = strdup(string); pfont->fontid = 0; pfont->loaded = 0; /* regist loaded font */ if (!findex) loadedfont = (struct fontmap **)malloc(sizeof(struct fontmap *)); else loadedfont = (struct fontmap **)realloc(loadedfont, sizeof(struct fontmap *) * (findex +1)); loadedfont[findex++] = pfont; return pfont; } #endif /* FREETYPE */ �������������������������������������������������������������������������������������������������������������������������������kit/scanner.l���������������������������������������������������������������������������������������0100644�0023745�0000000�00000016762�10722061660�0012770�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%{ /* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: scanner.l,v 1.28 2007/11/24 17:47:28 nishida Exp $ */ /* * partly derived from lbl libpcap source code, which has the following * copyright notice: */ /* * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code distributions * retain the above copyright notice and this paragraph in its entirety, (2) * distributions including binary code include the above copyright notice and * this paragraph in its entirety in the documentation or other materials * provided with the distribution, and (3) all advertising materials mentioning * features or use of this software display the following acknowledgement: * ``This product includes software developed by the University of California, * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of * the University nor the names of its contributors may be used to endorse * or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * */ #include "mgp.h" #include "tokdefs.h" static int stoi __P((char *)); static inline int xdtoi __P((int)); #ifdef FLEX_SCANNER #define YY_NO_UNPUT #undef YY_INPUT #define YY_INPUT(buf, result, max)\ {\ char *src = in_buffer;\ int i;\ \ if (*src == 0)\ result = YY_NULL;\ else {\ for (i = 0; *src && i < max; ++i)\ buf[i] = *src++;\ in_buffer += i;\ result = i;\ }\ } #else #undef getc #define getc(fp) (*in_buffer == 0 ? EOF : *in_buffer++) #endif /*#define yylval mgp_lval*/ extern YYSTYPE yylval; extern int n_errors; #ifdef HAVE_STDARG_H /* GCC complains if we declare this function in traditional style */ extern void yyerror(char *, ...); #else extern void yyerror(char *); #endif static char *in_buffer; %} N (-[0-9]+|[0-9]+|(0x|0X)[0-9A-Fa-f]+) JISIN (\033$B|\033$@) ASCIIIN (\033\(B|\033\(J) ASTR [\040-\176]* ASTRN [\040\041\043-\176]* JSTR {JISIN}([\041-\176][\041-\176])*{ASCIIIN} XSTR [\240-\377]* %a 6000 %p 4000 %o 8000 %% (NOOP|noop) return KW_NOOP; (DEFAULT|default) return KW_DEFAULT; (TAB|tab) return KW_TAB; (SIZE|size) return KW_SIZE; (FORE|fore) return KW_FORE; (BACK|back) return KW_BACK; (LEFT|left) return KW_LEFT; (LEFTFILL|leftfill) return KW_LEFTFILL; (CENTER|center) return KW_CENTER; (RIGHT|right) return KW_RIGHT; (SHRINK|shrink) return KW_SHRINK; (LCUTIN|lcutin) return KW_LCUTIN; (RCUTIN|rcutin) return KW_RCUTIN; (CONT|cont) return KW_CONT; (NODEFAULT|nodefault) return KW_NODEF; (XFONT|xfont) return KW_XFONT; (VFONT|vfont) return KW_VFONT; (TFONT|tfont) return KW_TFONT; (TMFONT|tmfont) return KW_TMFONT; (IMAGE|image) return KW_IMAGE; (NEWIMAGE|newimage) return KW_NEWIMAGE; (BIMAGE|bimage) return KW_BIMAGE; (PAGE|page) return KW_PAGE; (HGAP|hgap) return KW_HGAP; (VGAP|vgap) return KW_VGAP; (GAP|gap) return KW_GAP; (PAUSE|pause) return KW_PAUSE; (PREFIX|prefix) return KW_PREFIX; (AGAIN|again) return KW_AGAIN; (CCOLOR|ccolor) return KW_CCOLOR; (BAR|bar) return KW_BAR; (INCLUDE|include) return KW_INCLUDE; (BGRAD|bgrad) return KW_BGRAD; (TEXT|text) return KW_TEXT; (LINESTART|linestart) return KW_LINESTART; (LINEEND|lineend) return KW_LINEEND; (MARK|mark) return KW_MARK; (SYSTEM|system) return KW_SYSTEM; (XSYSTEM|xsystem) return KW_XSYSTEM; (TSYSTEM|tsystem) return KW_TSYSTEM; (FILTER|filter) return KW_FILTER; (ENDFILTER|endfilter) return KW_ENDFILTER; (BQUALITY|bquality) return KW_QUALITY; (ICON|icon) return KW_ICON; (VFCAP|vfcap) return KW_VFCAP; (TFDIR|tfdir) return KW_TFDIR; (DEFFONT|deffont) return KW_DEFFONT; (TFONT0|tfont0) return KW_TFONT0; (TMFONT0|tmfont0) return KW_TMFONT0; (FONT|font) return KW_FONT; (EMBED|embed) return KW_EMBED; (ENDEMBED|endembed) return KW_ENDEMBED; (CHARSET|charset) return KW_CHARSET; (PCACHE|pcache) return KW_PCACHE; (ANIM|anim) return KW_ANIM; (VALIGN|valign) return KW_VALIGN; (AREA|area) return KW_AREA; (OPAQUE|opaque) return KW_OPAQUE; (SUP|sup) return KW_SUP; (SUB|sub) return KW_SUB; (SETSUP|setsup) return KW_SETSUP; (M17N|m17n) return KW_M17N; (PSFONT|psfont) return KW_PSFONT; [ \n\t] ; "," return COMMA; [0-9][0-9]*x[0-9][0-9]* { yylval.s = strdup((char *)yytext); return WINSIZ; } {N} { yylval.i = stoi((char *)yytext); return NUM; } [0-9][0-9]*\.[0-9][0-9]* { yylval.d = atof((char *)yytext); return DOUBLE; } [-_.A-Za-z][-_.<>A-Za-z0-9]* { yylval.s = strdup((char *)yytext); return ID; } \"({XSTR}|{ASTRN})({JSTR}{ASTRN}|{XSTR})*\" { yylval.s = strdup((char *)yytext) + 1; if (strlen(yylval.s)) yylval.s[strlen(yylval.s) - 1] = '\0'; return STR; } \"({XSTR}|{ASTRN})*\" { if (mgp_flag & FL_NOFORK) { yyerror("invalid character <%c>", *(char *)yytext); } else { yylval.s = strdup((char *)yytext) + 1; if (strlen(yylval.s)) yylval.s[strlen(yylval.s) - 1] = '\0'; return STR; } } . { yyerror("invalid character <%c>", *(char *)yytext); } %% void lex_init(buf) char *buf; { n_errors = 0; in_buffer = buf; } /* * Also define a yywrap. Note that if we're using flex, it will * define a macro to map this identifier to pcap_wrap. */ int yywrap() { return 1; } /* Hex digit to integer. */ static inline int xdtoi(c) register int c; { if (isdigit(c)) return c - '0'; else if (islower(c)) return c - 'a' + 10; else return c - 'A' + 10; } /* * Convert string to integer. Just like atoi(), but checks for * preceding 0x or 0 and uses hex or octal instead of decimal. */ static int stoi(s) char *s; { int base = 10; int n = 0; int sign; sign = 1; if (*s == '0') { if (s[1] == 'x' || s[1] == 'X') { s += 2; base = 16; } else { base = 8; s += 1; } } else if (*s == '-') { sign = -1; s++; } while (*s) n = n * base + xdtoi(*s++); return n * sign; } ��������������kit/tfont.c�����������������������������������������������������������������������������������������0100644�0023745�0000000�00000046321�10722057604�0012455�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: tfont.c,v 1.45 2007/11/24 17:29:40 nishida Exp $ */ #include "mgp.h" #ifdef FREETYPE int tfcachesize = 3000; /*XXX*/ #define TFFONT_NUM 128 #define TFHASH_SIZE 255 #define TFCACHE_HASH(c, siz) ((c ^ siz) % TFHASH_SIZE) static TT_Raster_Map bitmap; static TT_Face_Properties properties[TFFONT_NUM]; static TT_Face face[TFFONT_NUM]; static TT_Glyph glyph[TFFONT_NUM]; static TT_Instance instance[TFFONT_NUM]; static TT_Glyph_Metrics metrics; static TT_Error error; static TT_Engine engine; static XImage *xim; static char *tf_curname[4]; /* contains iso8859-[2-4] fonts */ static char *tf_mcurname = NULL; static int tfcinitdone; static int tfcachecnt; static struct tfont tfclru; static struct tfont tfcache[TFHASH_SIZE]; static int tffontcnt = 0; static int tfcachehit = 0; static int tfcachemiss = 0; static int tfcuridx = -1; static char tfloadedfont[1024][TFFONT_NUM]; static int tfloadedregistry[TFFONT_NUM]; #define TFC_INSHASH(tfc) { \ struct tfont *h, *n; \ h = &tfcache[TFCACHE_HASH(tfc->code, tfc->size)]; \ n = h->next; tfc->next = n; n->prev = tfc; \ h->next = tfc; tfc->prev = h; \ } #define TFC_DELHASH(tfc) { \ struct tfont *n, *p; \ n = tfc->next; p = tfc->prev; \ n->prev = p; p->next = n; \ } #define TFC_INSLRU(tfc) { \ struct tfont *p; \ p = tfclru.lruprev; tfc->lruprev = p; p->lrunext = tfc; \ tfclru.lruprev = tfc; tfc->lrunext = &tfclru; \ } #define TFC_DELLRU(tfc) { \ struct tfont *n, *p; \ n = tfc->lrunext; p = tfc->lruprev; \ n->lruprev = p; p->lrunext = n; \ } static void tfc_init __P((void)); static void tfc_free __P((struct tfont *)); static struct tfont *tfc_lookup __P((u_int, u_int, char*, int)); static struct tfont *tfc_alloc __P((u_int, u_int, char *, char *)); static short CharToUnicode __P((u_int, char *)); static short jistosjis __P((u_int)); static TT_Error LoadTrueTypeChar __P((int, int)); #define TTFLOOR(x) ((x) & -64) #define TTCEIL(x) (((x) + 63) & -64) static void tfc_init() { u_int i; struct tfont *tfc; /* Initialize engine */ if ((error = TT_Init_FreeType(&engine))) { fprintf(stderr, "Error while initializing engine, code = %d.\n", (int)error); cleanup(-1); } tfc = tfcache; for (tfc = tfcache, i = 0; i < TFHASH_SIZE; tfc++, i++) tfc->next = tfc->prev = tfc; tfclru.lrunext = tfclru.lruprev = &tfclru; tfcinitdone ++; latin_unicode_map_init(); #ifdef FREETYPE_CHARSET16 unicode_map_init(); #endif } static void tfc_free(tfc) struct tfont *tfc; { TFC_DELHASH(tfc); TFC_DELLRU(tfc); free(tfc->fontname); free(tfc->dbitmap); free(tfc); tfcachecnt--; } int tfc_setsize(char_size) u_int char_size; { if (!tfcinitdone) return -1; if (tfcuridx < 0 || tffontcnt <= tfcuridx) { if (verbose) fprintf(stderr, "tfc_setsize: font index out of bound\n"); return -1; } error = TT_Set_Instance_CharSize(instance[tfcuridx], (char_size * 0.75) * 64); if (error) { fprintf(stderr, "Could not set device resolutions for \"%s\".\n", tfloadedfont[tfcuridx]); return -1; } return 0; } struct tfont * tfc_get(code, size, force, registry, charset16) u_int code, size; int force; char *registry; int charset16; { struct tfont *tfc, *ntfc; int regid; if (!tfcinitdone) tfc_init(); if (charset16) tfc = tfc_lookup(code, size, tf_mcurname, 0); else { if (code >= 0xa0 && ((!registry || !registry[0]) && mgp_charset)){ regid = get_regid(mgp_charset); } else regid = get_regid(registry); tfc = tfc_lookup(code, size, tf_curname[regid], regid); } if (tfc == NULL) { /* XXX */ if (tfcachecnt >= tfcachesize) { if (!force) return NULL; tfc = tfclru.lrunext; while (tfcachecnt >= tfcachesize) { if (tfc == &tfclru) break; ntfc = tfc->lrunext; if (tfc->ref == 0) tfc_free(tfc); tfc = ntfc; } } if (charset16) tfc = tfc_alloc(code, size, tf_mcurname, registry); else tfc = tfc_alloc(code, size, tf_curname[regid], registry); } return tfc; } void tfc_setfont(name, charset16, registry) char *name; int charset16; /*2-octet charset?*/ char *registry; { char *fontname = NULL; u_int i, regid = 0; int res = 96; /* XXX */ char pathname[MAXPATHLEN]; int trial; TT_Face tface; if (!tfcinitdone) tfc_init(); if (TFFONT_NUM <= tffontcnt) { fprintf(stderr, "internal error: " "too many fonts opened (increase TFFONT_NUM)\n"); cleanup(-1); } if (!name || !name[0]) { if (freetypefont0 && freetypefont0[0]) { if (verbose) { fprintf(stderr, "tfc_setfont: " "font name not given, " "using last resort (%s)\n", freetypefont0); } name = freetypefont0; } else { if (verbose) { fprintf(stderr, "tfc_setfont: " "font name not given, fail\n"); } goto fail; } } /* check font cache first */ for (trial = 0; trial < 2; trial++) { switch (trial) { case 0: fontname = name; break; case 1: snprintf(pathname, sizeof(pathname), "%s/%s", freetypefontdir, name); fontname = pathname; break; } for (i = 0; i < tffontcnt; i ++) { if (!strcmp(fontname, tfloadedfont[i])) { /* already loaded */ #if 0 if (verbose) { fprintf(stderr, "font cache hit for \"%s\"\n", fontname); } #endif tfcuridx = i; if (charset16) tf_mcurname = tfloadedfont[i]; else { regid = get_regid(registry); tf_curname[regid] = tfloadedfont[i]; } #if 0 tfc_setsize(char_size); #endif return; } } } /* try to load font */ for (trial = 0; trial < 3; trial++) { switch (trial) { case 0: fontname = name; break; case 1: snprintf(pathname, sizeof(pathname), "%s/%s", freetypefontdir, name); fontname = pathname; break; case 2: if (!freetypefont0 || !freetypefont0[0]) continue; fontname = freetypefont0; /* already loaded? */ for (i = 0; i < tffontcnt; i ++) { if (!strcmp(fontname, tfloadedfont[i])){ tfcuridx = i; if (verbose) fprintf(stderr, "font \"%s\" already loaded: %d\n", fontname, tffontcnt); goto cached; } } break; } /* Load face */ if (verbose) fprintf(stderr, "trying to open font \"%s\"\n", fontname); error = TT_Open_Face(engine, fontname, &tface); if (!error) break; } if (trial == 2) { if (verbose) { fprintf(stderr, "font \"%s\" not found, " "last resort font \"%s\" was used\n", name, freetypefont0); } } else if (trial == 3) { if (verbose) { fprintf(stderr, "could not load font \"%s\", " "using other rendering engine\n", name); } goto fail; } if (verbose) { fprintf(stderr, "font \"%s\" opened successfully\n", fontname); } /* get registry id */ if ((regid = get_regid(registry)) < 0){ fprintf(stderr, "font \"%s\" has irregal registry\n", fontname); goto fail2; } tfloadedregistry[tffontcnt] = regid; strcpy(tfloadedfont[tffontcnt], fontname); tfcuridx = tffontcnt; face[tfcuridx] = tface; tffontcnt++; /* get face properties and allocate preload arrays */ error = TT_Get_Face_Properties(face[tfcuridx], &properties[tfcuridx]); if (error) { fprintf(stderr, "Could not create face property for " "\"%s\" (err 0x%04x).\n", fontname, (int)error); goto fail2; } /* create glyph */ error = TT_New_Glyph(face[tfcuridx], &glyph[tfcuridx]); if (error) { fprintf(stderr, "Could not create glyph container for " "\"%s\" (err 0x%04x).\n", fontname, (int)error); goto fail2; } /* create instance */ error = TT_New_Instance(face[tfcuridx], &instance[tfcuridx]); if (error) { fprintf(stderr, "Could not create instance for " "\"%s\" (err 0x%04x).\n", fontname, (int)error); goto fail2; } error = TT_Set_Instance_Resolutions(instance[tfcuridx], res, res); if (error) { fprintf(stderr, "Could not set device resolutions for " "\"%s\" (err 0x%04x).\n", fontname, (int)error); goto fail2; } cached: if (charset16) tf_mcurname = tfloadedfont[tfcuridx]; else { if (registry) tf_curname[regid] = tfloadedfont[tfcuridx]; else { /* this should be default font */ for (i = 0; i < 4; i ++) tf_curname[i] = tfloadedfont[tfcuridx]; } } if (tfc_setsize(char_size[caching]) < 0) goto fail2; /* success */ return; fail2: TT_Close_Face(tface); tffontcnt--; fail: if (!charset16){ tf_curname[regid] = ""; tfcuridx = -1; } else tf_mcurname = ""; return; } static struct tfont * tfc_lookup(code, size, fontname, regid) u_int code, size; char *fontname; int regid; { u_int i; struct tfont *tfc, *htfc; if (!fontname) return NULL; for (i = 0; i < tffontcnt; i ++) { if (!strcmp(fontname, tfloadedfont[i])) tfcuridx = i; } htfc = &tfcache[TFCACHE_HASH(code, size)]; for (tfc = htfc->next; tfc != htfc; tfc = tfc->next) { if (tfc->code == code && tfc->size == size && tfc->regid == regid && strcmp(tfc->fontname, fontname) == 0) { tfcachehit++; TFC_DELLRU(tfc); TFC_INSLRU(tfc); return tfc; } } tfcachemiss++; return NULL; } static struct tfont * tfc_alloc(code, size, fontname, registry) u_int code, size; char *fontname; char *registry; { struct tfont *tfc; short unicode; /* if no font was ever loaded, try loading the last resort font */ if (!tffontcnt) { if (verbose) fprintf(stderr, "no fontcount\n"); tfc_setfont(NULL, 0, NULL); } /* font out of bounds, suggests no font was available */ if (tfcuridx < 0 || tffontcnt <= tfcuridx) { if (verbose) fprintf(stderr, "tfc_alloc: font index out of bound\n"); return NULL; } if (fontname == NULL) return NULL; /* This is required! */ if (tfc_setsize(char_size[caching]) < 0) return NULL; tfc = (struct tfont *)malloc(sizeof(*tfc)); if (tfc == NULL) { fprintf(stderr, "tfc_alloc: malloc failed\n"); return NULL; } #if 1 unicode = CharToUnicode(code, registry); #else unicode = code; #endif if (!unicode) return NULL; if ((error = LoadTrueTypeChar(unicode, 0))) { fprintf(stderr, "LoadTrueTypeChar fail %d\n", (int)error); fprintf(stderr, "fontfile: \"%s\" char: '%c' (0x%04x)\n", tfloadedfont[tfcuridx], isprint(unicode) ? unicode : '?', unicode); return NULL; } TT_Get_Glyph_Metrics(glyph[tfcuridx], &metrics); /* * TT_Get_Glyph_Pixmap generates pixmap starting from FreeType * origin (leftmost side, baseline). Because of this 3rd and 4th * arguments are necessary. * For X axis (3rd argument), we have to take metrics.bearingX as * offset. Y axis must be shifted if there's descent box (image * below the baseline). 4th argument is specified for that. */ bitmap.rows = (metrics.bbox.yMax - metrics.bbox.yMin) >> 6; bitmap.rows += 2; /* insurance to cope with number-round error */ bitmap.width = metrics.bbox.xMax - metrics.bbox.xMin; bitmap.width >>= 6; bitmap.width += 2; /* insurance to cope with number-round error */ bitmap.cols = (bitmap.width+3) & -4; bitmap.flow = TT_Flow_Down; bitmap.size = (long)bitmap.cols * bitmap.rows; bitmap.bitmap = (void *)malloc((int)bitmap.size); memset(bitmap.bitmap, 0, bitmap.size); /* be very careful about CEIL/FLOOR. */ TT_Get_Glyph_Pixmap(glyph[tfcuridx], &bitmap, TTCEIL(-metrics.bearingX), TTCEIL(metrics.bbox.yMax - metrics.bbox.yMin - metrics.bearingY)); tfc->code = code; tfc->size = size; tfc->width = bitmap.width; tfc->bwidth = bitmap.cols; tfc->height = bitmap.rows; /* * ascent must be derived from descent, to avoid number-rounding * errors. */ tfc->descent = TTCEIL(metrics.bbox.yMax - metrics.bbox.yMin - metrics.bearingY) >> 6; tfc->ascent = bitmap.rows - tfc->descent; tfc->xoff = metrics.bearingX >> 6; tfc->fontname = strdup(fontname); tfc->charlen = metrics.advance >> 6; tfc->xmax = metrics.bbox.xMax >> 6; tfc->ref = 0; tfc->dbitmap = bitmap.bitmap; tfc->regid = get_regid(registry); if (!tfc->charlen) tfc->charlen = 1; TFC_INSHASH(tfc); TFC_INSLRU(tfc); tfcachecnt++; return tfc; } static short CharToUnicode(code, registry) u_int code; char *registry; { TT_CharMap char_map; unsigned short i, n; unsigned short platform, encoding; unsigned int regid; char p; /* First, look for a Unicode charmap */ #ifdef HAVE_TT_FACE_PROPERTIES_CHARMAPS n = properties[tfcuridx].num_CharMaps; #else n = TT_Get_CharMap_Count(face[tfcuridx]); #endif #if 1 if (verbose) { fprintf(stderr, "%d charmaps for font %s code %04x\n", n, tfloadedfont[tfcuridx], code & 0xffff); } #endif for (i = 0; i < n; i++) { TT_Get_CharMap_ID(face[tfcuridx], i, &platform, &encoding); if ((platform == 3 && encoding == 1) || (platform == 0 && encoding == 0)) { TT_Get_CharMap(face[tfcuridx], i, &char_map); #ifdef FREETYPE_CHARSET16 if (code > 256 && strncmp(registry, "jisx0208.1983-", 14) != 0) { /* * unicode_map assumes JIS X0208. * it is not usable for other encodings. * try the next CharMap available. */ continue; } if (code > 256) code = unicode_map[code]; #endif /* FREETYPE_CHARSET16 */ #if 1 /* latin2-4 encoding processing */ if (code > 0xa0 && code < 256) { int tempregid; if (registry) tempregid = get_regid(registry) -1; else { if (mgp_charset) tempregid = get_regid(mgp_charset)-1; } if (tempregid >= 0) { regid = tempregid; if (latin_unicode_map[regid][code]) code = latin_unicode_map[regid][code]; } } #endif /* * For freetype 1.4, suggested by mituharu@math.s.chiba-u.ac.jp */ #if TT_FREETYPE_MAJOR == 1 && TT_FREETYPE_MINOR == 4 return TT_Char_Index(char_map, (u_short) code); #else return TT_Char_Index(char_map, (short) code); #endif } #ifdef FREETYPE_CHARSET16 else { /* * very adhoc processing for truetype fonts generated by cb2ttj. */ if ((platform == 3 && encoding == 2) || (platform == 1 && encoding == 1)) { if (code < 256) continue; TT_Get_CharMap(face[tfcuridx], i, &char_map); return TT_Char_Index(char_map, (u_short) jistosjis(code)); } else { if (platform == 1 && encoding == 0) { if (code >= 0xa0) continue; TT_Get_CharMap(face[tfcuridx], i, &char_map); return TT_Char_Index(char_map, (short) code); } #endif else { /* symbol font */ if (platform == 3 && encoding == 0) { code |= 0xf000; TT_Get_CharMap(face[tfcuridx], i, &char_map); return TT_Char_Index(char_map, code); } } #ifdef FREETYPE_CHARSET16 } } #endif } fprintf(stderr, "Sorry, but the fontfile \"%s\" doesn't " "contain any Unicode mapping table\n", tfloadedfont[tfcuridx]); return 0; } static TT_Error LoadTrueTypeChar(int idx, int hint) { int flags; flags = TTLOAD_SCALE_GLYPH; if (hint) flags |= TTLOAD_HINT_GLYPH; return TT_Load_Glyph(instance[tfcuridx], glyph[tfcuridx], idx, flags); } /* * NOTE: this is upper-layer's responsibility to adjust the (bx, by) * so that the font bitmap fits into the given XImage. * see draw_onechar_tf() for the code. */ XImage * tfc_image(tfc, fore, back, xim, bx, by) struct tfont *tfc; long fore, back; XImage *xim; int bx, by; { int x, y; static XColor col[5]; u_char d, *s; u_long p; XColor *bcol = NULL, *bc; u_int charlen; charlen = tfc->charlen; if (back == -1) { u_long r, g, b; int dots; dots = charlen * tfc->height; bcol = malloc(sizeof(XColor) * dots); if (bcol == NULL) return NULL; bc = bcol; for (y = 0; y < tfc->height; y++) { for (x = 0; x < charlen; x++, bc++) { bc->pixel = XGetPixel(xim, bx + tfc->xoff + x, by - tfc->ascent + y); bc->flags = DoRed|DoGreen|DoBlue; } } XQueryColors(display, colormap, bcol, dots); r = g = b = 0; for (y = 0; y < tfc->height; y++) { for (x = 0; x < charlen; x++) { r += bcol[x].red; g += bcol[x].green; b += bcol[x].blue; } } r /= dots; g /= dots; b /= dots; bc = &col[0]; if (bc->red == r && bc->green == g && bc->blue == b) bc->pixel = back; else { bc->pixel = ~back; bc->red = r; bc->green = g; bc->blue = b; } } if (fore != col[4].pixel || back != col[0].pixel) { col[4].pixel = fore; col[4].flags = DoRed|DoGreen|DoBlue; if (back != -1) { col[3].pixel = back; col[3].flags = DoRed|DoGreen|DoBlue; XQueryColors(display, colormap, &col[3], 2); col[0] = col[3]; } else { XQueryColor(display, colormap, &col[4]); } for (x = 3; x > 0; x--) { col[x].red = (col[4].red *x + col[0].red *(4-x)) /4; col[x].green = (col[4].green*x + col[0].green*(4-x)) /4; col[x].blue = (col[4].blue *x + col[0].blue *(4-x)) /4; if (!XAllocColor(display, colormap, &col[x])) { if (verbose) printf("tfc_image: cannot allocate color for level %d (using %d)\n", x, x + 1); col[x].pixel = col[x + 1].pixel; } else regist_alloc_colors(&font_clr, &col[x].pixel, 1); } } /* XXX: need optimization */ s = tfc->dbitmap; bc = bcol; for (y = 0; y < tfc->height; y++) { for (x = 0; x < tfc->bwidth; x++) { d = *s++; if (d && x < tfc->width) { p = col[d].pixel; XPutPixel(xim, bx + tfc->xoff + x, by - tfc->ascent + y, p); } } } if (mgp_flag & FL_GLYPHEDGE) { /* * for debugging treatment of font metrics, for 16bpp displays */ /* pixmap bounding box */ for (y = 0; y < tfc->height; y++) { XPutPixel(xim, bx + tfc->xoff, by - tfc->ascent + y, 0xffff); XPutPixel(xim, bx + tfc->xoff + tfc->width - 1, by - tfc->ascent + y, 0xffff); } for (x = 0; x < tfc->width; x++) { XPutPixel(xim, bx + tfc->xoff + x, by - tfc->ascent, 0xffff); XPutPixel(xim, bx + tfc->xoff + x, by - tfc->ascent + tfc->height - 1, 0xffff); } /* origin */ XPutPixel(xim, bx, by, 0xaaaa); /* baseline */ for (x = 0; x < tfc->width; x++) XPutPixel(xim, bx + tfc->xoff + x, by, 0xaaaa); } if (bcol) free(bcol); return xim; } static short jistosjis(code) u_int code; { u_char c1 = code >> 8; u_char c2 = code % 256; int rowOffset = c1 < 95 ? 112: 176; int cellOffset = c1 % 2 ? (c2 > 95 ? 32 : 31) : 126; return (((c1 + 1) >> 1) + rowOffset) * 256 + c2 + cellOffset; } #endif /* FRRETYPE */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/unimap.c����������������������������������������������������������������������������������������0100644�0023745�0000000�00000647157�07131346563�0012637�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ /* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: unimap.c,v 1.2 2000/07/07 12:30:43 nishida Exp $ */ #include "mgp.h" #ifdef FREETYPE_CHARSET16 void unicode_map_init(){ unicode_map[0x2121] = 0x3000; unicode_map[0x2122] = 0x3001; unicode_map[0x2123] = 0x3002; unicode_map[0x2124] = 0xFF0C; unicode_map[0x2125] = 0xFF0E; unicode_map[0x2126] = 0x30FB; unicode_map[0x2127] = 0xFF1A; unicode_map[0x2128] = 0xFF1B; unicode_map[0x2129] = 0xFF1F; unicode_map[0x212A] = 0xFF01; unicode_map[0x212B] = 0x309B; unicode_map[0x212C] = 0x309C; unicode_map[0x212D] = 0x00B4; unicode_map[0x212E] = 0xFF40; unicode_map[0x212F] = 0x00A8; unicode_map[0x2130] = 0xFF3E; unicode_map[0x2131] = 0xFFE3; unicode_map[0x2132] = 0xFF3F; unicode_map[0x2133] = 0x30FD; unicode_map[0x2134] = 0x30FE; unicode_map[0x2135] = 0x309D; unicode_map[0x2136] = 0x309E; unicode_map[0x2137] = 0x3003; unicode_map[0x2138] = 0x4EDD; unicode_map[0x2139] = 0x3005; unicode_map[0x213A] = 0x3006; unicode_map[0x213B] = 0x3007; unicode_map[0x213C] = 0x30FC; unicode_map[0x213D] = 0x2015; unicode_map[0x213E] = 0x2010; unicode_map[0x213F] = 0xFF0F; unicode_map[0x2140] = 0x005C; unicode_map[0x2141] = 0x301C; unicode_map[0x2142] = 0x2016; unicode_map[0x2143] = 0xFF5C; unicode_map[0x2144] = 0x2026; unicode_map[0x2145] = 0x2025; unicode_map[0x2146] = 0x2018; unicode_map[0x2147] = 0x2019; unicode_map[0x2148] = 0x201C; unicode_map[0x2149] = 0x201D; unicode_map[0x214A] = 0xFF08; unicode_map[0x214B] = 0xFF09; unicode_map[0x214C] = 0x3014; unicode_map[0x214D] = 0x3015; unicode_map[0x214E] = 0xFF3B; unicode_map[0x214F] = 0xFF3D; unicode_map[0x2150] = 0xFF5B; unicode_map[0x2151] = 0xFF5D; unicode_map[0x2152] = 0x3008; unicode_map[0x2153] = 0x3009; unicode_map[0x2154] = 0x300A; unicode_map[0x2155] = 0x300B; unicode_map[0x2156] = 0x300C; unicode_map[0x2157] = 0x300D; unicode_map[0x2158] = 0x300E; unicode_map[0x2159] = 0x300F; unicode_map[0x215A] = 0x3010; unicode_map[0x215B] = 0x3011; unicode_map[0x215C] = 0xFF0B; unicode_map[0x215D] = 0x2212; unicode_map[0x215E] = 0x00B1; unicode_map[0x215F] = 0x00D7; unicode_map[0x2160] = 0x00F7; unicode_map[0x2161] = 0xFF1D; unicode_map[0x2162] = 0x2260; unicode_map[0x2163] = 0xFF1C; unicode_map[0x2164] = 0xFF1E; unicode_map[0x2165] = 0x2266; unicode_map[0x2166] = 0x2267; unicode_map[0x2167] = 0x221E; unicode_map[0x2168] = 0x2234; unicode_map[0x2169] = 0x2642; unicode_map[0x216A] = 0x2640; unicode_map[0x216B] = 0x00B0; unicode_map[0x216C] = 0x2032; unicode_map[0x216D] = 0x2033; unicode_map[0x216E] = 0x2103; unicode_map[0x216F] = 0xFFE5; unicode_map[0x2170] = 0xFF04; unicode_map[0x2171] = 0x00A2; unicode_map[0x2172] = 0x00A3; unicode_map[0x2173] = 0xFF05; unicode_map[0x2174] = 0xFF03; unicode_map[0x2175] = 0xFF06; unicode_map[0x2176] = 0xFF0A; unicode_map[0x2177] = 0xFF20; unicode_map[0x2178] = 0x00A7; unicode_map[0x2179] = 0x2606; unicode_map[0x217A] = 0x2605; unicode_map[0x217B] = 0x25CB; unicode_map[0x217C] = 0x25CF; unicode_map[0x217D] = 0x25CE; unicode_map[0x217E] = 0x25C7; unicode_map[0x2221] = 0x25C6; unicode_map[0x2222] = 0x25A1; unicode_map[0x2223] = 0x25A0; unicode_map[0x2224] = 0x25B3; unicode_map[0x2225] = 0x25B2; unicode_map[0x2226] = 0x25BD; unicode_map[0x2227] = 0x25BC; unicode_map[0x2228] = 0x203B; unicode_map[0x2229] = 0x3012; unicode_map[0x222A] = 0x2192; unicode_map[0x222B] = 0x2190; unicode_map[0x222C] = 0x2191; unicode_map[0x222D] = 0x2193; unicode_map[0x222E] = 0x3013; unicode_map[0x223A] = 0x2208; unicode_map[0x223B] = 0x220B; unicode_map[0x223C] = 0x2286; unicode_map[0x223D] = 0x2287; unicode_map[0x223E] = 0x2282; unicode_map[0x223F] = 0x2283; unicode_map[0x2240] = 0x222A; unicode_map[0x2241] = 0x2229; unicode_map[0x224A] = 0x2227; unicode_map[0x224B] = 0x2228; unicode_map[0x224C] = 0x00AC; unicode_map[0x224D] = 0x21D2; unicode_map[0x224E] = 0x21D4; unicode_map[0x224F] = 0x2200; unicode_map[0x2250] = 0x2203; unicode_map[0x225C] = 0x2220; unicode_map[0x225D] = 0x22A5; unicode_map[0x225E] = 0x2312; unicode_map[0x225F] = 0x2202; unicode_map[0x2260] = 0x2207; unicode_map[0x2261] = 0x2261; unicode_map[0x2262] = 0x2252; unicode_map[0x2263] = 0x226A; unicode_map[0x2264] = 0x226B; unicode_map[0x2265] = 0x221A; unicode_map[0x2266] = 0x223D; unicode_map[0x2267] = 0x221D; unicode_map[0x2268] = 0x2235; unicode_map[0x2269] = 0x222B; unicode_map[0x226A] = 0x222C; unicode_map[0x2272] = 0x212B; unicode_map[0x2273] = 0x2030; unicode_map[0x2274] = 0x266F; unicode_map[0x2275] = 0x266D; unicode_map[0x2276] = 0x266A; unicode_map[0x2277] = 0x2020; unicode_map[0x2278] = 0x2021; unicode_map[0x2279] = 0x00B6; unicode_map[0x227E] = 0x25EF; unicode_map[0x2330] = 0xFF10; unicode_map[0x2331] = 0xFF11; unicode_map[0x2332] = 0xFF12; unicode_map[0x2333] = 0xFF13; unicode_map[0x2334] = 0xFF14; unicode_map[0x2335] = 0xFF15; unicode_map[0x2336] = 0xFF16; unicode_map[0x2337] = 0xFF17; unicode_map[0x2338] = 0xFF18; unicode_map[0x2339] = 0xFF19; unicode_map[0x2341] = 0xFF21; unicode_map[0x2342] = 0xFF22; unicode_map[0x2343] = 0xFF23; unicode_map[0x2344] = 0xFF24; unicode_map[0x2345] = 0xFF25; unicode_map[0x2346] = 0xFF26; unicode_map[0x2347] = 0xFF27; unicode_map[0x2348] = 0xFF28; unicode_map[0x2349] = 0xFF29; unicode_map[0x234A] = 0xFF2A; unicode_map[0x234B] = 0xFF2B; unicode_map[0x234C] = 0xFF2C; unicode_map[0x234D] = 0xFF2D; unicode_map[0x234E] = 0xFF2E; unicode_map[0x234F] = 0xFF2F; unicode_map[0x2350] = 0xFF30; unicode_map[0x2351] = 0xFF31; unicode_map[0x2352] = 0xFF32; unicode_map[0x2353] = 0xFF33; unicode_map[0x2354] = 0xFF34; unicode_map[0x2355] = 0xFF35; unicode_map[0x2356] = 0xFF36; unicode_map[0x2357] = 0xFF37; unicode_map[0x2358] = 0xFF38; unicode_map[0x2359] = 0xFF39; unicode_map[0x235A] = 0xFF3A; unicode_map[0x2361] = 0xFF41; unicode_map[0x2362] = 0xFF42; unicode_map[0x2363] = 0xFF43; unicode_map[0x2364] = 0xFF44; unicode_map[0x2365] = 0xFF45; unicode_map[0x2366] = 0xFF46; unicode_map[0x2367] = 0xFF47; unicode_map[0x2368] = 0xFF48; unicode_map[0x2369] = 0xFF49; unicode_map[0x236A] = 0xFF4A; unicode_map[0x236B] = 0xFF4B; unicode_map[0x236C] = 0xFF4C; unicode_map[0x236D] = 0xFF4D; unicode_map[0x236E] = 0xFF4E; unicode_map[0x236F] = 0xFF4F; unicode_map[0x2370] = 0xFF50; unicode_map[0x2371] = 0xFF51; unicode_map[0x2372] = 0xFF52; unicode_map[0x2373] = 0xFF53; unicode_map[0x2374] = 0xFF54; unicode_map[0x2375] = 0xFF55; unicode_map[0x2376] = 0xFF56; unicode_map[0x2377] = 0xFF57; unicode_map[0x2378] = 0xFF58; unicode_map[0x2379] = 0xFF59; unicode_map[0x237A] = 0xFF5A; unicode_map[0x2421] = 0x3041; unicode_map[0x2422] = 0x3042; unicode_map[0x2423] = 0x3043; unicode_map[0x2424] = 0x3044; unicode_map[0x2425] = 0x3045; unicode_map[0x2426] = 0x3046; unicode_map[0x2427] = 0x3047; unicode_map[0x2428] = 0x3048; unicode_map[0x2429] = 0x3049; unicode_map[0x242A] = 0x304A; unicode_map[0x242B] = 0x304B; unicode_map[0x242C] = 0x304C; unicode_map[0x242D] = 0x304D; unicode_map[0x242E] = 0x304E; unicode_map[0x242F] = 0x304F; unicode_map[0x2430] = 0x3050; unicode_map[0x2431] = 0x3051; unicode_map[0x2432] = 0x3052; unicode_map[0x2433] = 0x3053; unicode_map[0x2434] = 0x3054; unicode_map[0x2435] = 0x3055; unicode_map[0x2436] = 0x3056; unicode_map[0x2437] = 0x3057; unicode_map[0x2438] = 0x3058; unicode_map[0x2439] = 0x3059; unicode_map[0x243A] = 0x305A; unicode_map[0x243B] = 0x305B; unicode_map[0x243C] = 0x305C; unicode_map[0x243D] = 0x305D; unicode_map[0x243E] = 0x305E; unicode_map[0x243F] = 0x305F; unicode_map[0x2440] = 0x3060; unicode_map[0x2441] = 0x3061; unicode_map[0x2442] = 0x3062; unicode_map[0x2443] = 0x3063; unicode_map[0x2444] = 0x3064; unicode_map[0x2445] = 0x3065; unicode_map[0x2446] = 0x3066; unicode_map[0x2447] = 0x3067; unicode_map[0x2448] = 0x3068; unicode_map[0x2449] = 0x3069; unicode_map[0x244A] = 0x306A; unicode_map[0x244B] = 0x306B; unicode_map[0x244C] = 0x306C; unicode_map[0x244D] = 0x306D; unicode_map[0x244E] = 0x306E; unicode_map[0x244F] = 0x306F; unicode_map[0x2450] = 0x3070; unicode_map[0x2451] = 0x3071; unicode_map[0x2452] = 0x3072; unicode_map[0x2453] = 0x3073; unicode_map[0x2454] = 0x3074; unicode_map[0x2455] = 0x3075; unicode_map[0x2456] = 0x3076; unicode_map[0x2457] = 0x3077; unicode_map[0x2458] = 0x3078; unicode_map[0x2459] = 0x3079; unicode_map[0x245A] = 0x307A; unicode_map[0x245B] = 0x307B; unicode_map[0x245C] = 0x307C; unicode_map[0x245D] = 0x307D; unicode_map[0x245E] = 0x307E; unicode_map[0x245F] = 0x307F; unicode_map[0x2460] = 0x3080; unicode_map[0x2461] = 0x3081; unicode_map[0x2462] = 0x3082; unicode_map[0x2463] = 0x3083; unicode_map[0x2464] = 0x3084; unicode_map[0x2465] = 0x3085; unicode_map[0x2466] = 0x3086; unicode_map[0x2467] = 0x3087; unicode_map[0x2468] = 0x3088; unicode_map[0x2469] = 0x3089; unicode_map[0x246A] = 0x308A; unicode_map[0x246B] = 0x308B; unicode_map[0x246C] = 0x308C; unicode_map[0x246D] = 0x308D; unicode_map[0x246E] = 0x308E; unicode_map[0x246F] = 0x308F; unicode_map[0x2470] = 0x3090; unicode_map[0x2471] = 0x3091; unicode_map[0x2472] = 0x3092; unicode_map[0x2473] = 0x3093; unicode_map[0x2521] = 0x30A1; unicode_map[0x2522] = 0x30A2; unicode_map[0x2523] = 0x30A3; unicode_map[0x2524] = 0x30A4; unicode_map[0x2525] = 0x30A5; unicode_map[0x2526] = 0x30A6; unicode_map[0x2527] = 0x30A7; unicode_map[0x2528] = 0x30A8; unicode_map[0x2529] = 0x30A9; unicode_map[0x252A] = 0x30AA; unicode_map[0x252B] = 0x30AB; unicode_map[0x252C] = 0x30AC; unicode_map[0x252D] = 0x30AD; unicode_map[0x252E] = 0x30AE; unicode_map[0x252F] = 0x30AF; unicode_map[0x2530] = 0x30B0; unicode_map[0x2531] = 0x30B1; unicode_map[0x2532] = 0x30B2; unicode_map[0x2533] = 0x30B3; unicode_map[0x2534] = 0x30B4; unicode_map[0x2535] = 0x30B5; unicode_map[0x2536] = 0x30B6; unicode_map[0x2537] = 0x30B7; unicode_map[0x2538] = 0x30B8; unicode_map[0x2539] = 0x30B9; unicode_map[0x253A] = 0x30BA; unicode_map[0x253B] = 0x30BB; unicode_map[0x253C] = 0x30BC; unicode_map[0x253D] = 0x30BD; unicode_map[0x253E] = 0x30BE; unicode_map[0x253F] = 0x30BF; unicode_map[0x2540] = 0x30C0; unicode_map[0x2541] = 0x30C1; unicode_map[0x2542] = 0x30C2; unicode_map[0x2543] = 0x30C3; unicode_map[0x2544] = 0x30C4; unicode_map[0x2545] = 0x30C5; unicode_map[0x2546] = 0x30C6; unicode_map[0x2547] = 0x30C7; unicode_map[0x2548] = 0x30C8; unicode_map[0x2549] = 0x30C9; unicode_map[0x254A] = 0x30CA; unicode_map[0x254B] = 0x30CB; unicode_map[0x254C] = 0x30CC; unicode_map[0x254D] = 0x30CD; unicode_map[0x254E] = 0x30CE; unicode_map[0x254F] = 0x30CF; unicode_map[0x2550] = 0x30D0; unicode_map[0x2551] = 0x30D1; unicode_map[0x2552] = 0x30D2; unicode_map[0x2553] = 0x30D3; unicode_map[0x2554] = 0x30D4; unicode_map[0x2555] = 0x30D5; unicode_map[0x2556] = 0x30D6; unicode_map[0x2557] = 0x30D7; unicode_map[0x2558] = 0x30D8; unicode_map[0x2559] = 0x30D9; unicode_map[0x255A] = 0x30DA; unicode_map[0x255B] = 0x30DB; unicode_map[0x255C] = 0x30DC; unicode_map[0x255D] = 0x30DD; unicode_map[0x255E] = 0x30DE; unicode_map[0x255F] = 0x30DF; unicode_map[0x2560] = 0x30E0; unicode_map[0x2561] = 0x30E1; unicode_map[0x2562] = 0x30E2; unicode_map[0x2563] = 0x30E3; unicode_map[0x2564] = 0x30E4; unicode_map[0x2565] = 0x30E5; unicode_map[0x2566] = 0x30E6; unicode_map[0x2567] = 0x30E7; unicode_map[0x2568] = 0x30E8; unicode_map[0x2569] = 0x30E9; unicode_map[0x256A] = 0x30EA; unicode_map[0x256B] = 0x30EB; unicode_map[0x256C] = 0x30EC; unicode_map[0x256D] = 0x30ED; unicode_map[0x256E] = 0x30EE; unicode_map[0x256F] = 0x30EF; unicode_map[0x2570] = 0x30F0; unicode_map[0x2571] = 0x30F1; unicode_map[0x2572] = 0x30F2; unicode_map[0x2573] = 0x30F3; unicode_map[0x2574] = 0x30F4; unicode_map[0x2575] = 0x30F5; unicode_map[0x2576] = 0x30F6; unicode_map[0x2621] = 0x0391; unicode_map[0x2622] = 0x0392; unicode_map[0x2623] = 0x0393; unicode_map[0x2624] = 0x0394; unicode_map[0x2625] = 0x0395; unicode_map[0x2626] = 0x0396; unicode_map[0x2627] = 0x0397; unicode_map[0x2628] = 0x0398; unicode_map[0x2629] = 0x0399; unicode_map[0x262A] = 0x039A; unicode_map[0x262B] = 0x039B; unicode_map[0x262C] = 0x039C; unicode_map[0x262D] = 0x039D; unicode_map[0x262E] = 0x039E; unicode_map[0x262F] = 0x039F; unicode_map[0x2630] = 0x03A0; unicode_map[0x2631] = 0x03A1; unicode_map[0x2632] = 0x03A3; unicode_map[0x2633] = 0x03A4; unicode_map[0x2634] = 0x03A5; unicode_map[0x2635] = 0x03A6; unicode_map[0x2636] = 0x03A7; unicode_map[0x2637] = 0x03A8; unicode_map[0x2638] = 0x03A9; unicode_map[0x2641] = 0x03B1; unicode_map[0x2642] = 0x03B2; unicode_map[0x2643] = 0x03B3; unicode_map[0x2644] = 0x03B4; unicode_map[0x2645] = 0x03B5; unicode_map[0x2646] = 0x03B6; unicode_map[0x2647] = 0x03B7; unicode_map[0x2648] = 0x03B8; unicode_map[0x2649] = 0x03B9; unicode_map[0x264A] = 0x03BA; unicode_map[0x264B] = 0x03BB; unicode_map[0x264C] = 0x03BC; unicode_map[0x264D] = 0x03BD; unicode_map[0x264E] = 0x03BE; unicode_map[0x264F] = 0x03BF; unicode_map[0x2650] = 0x03C0; unicode_map[0x2651] = 0x03C1; unicode_map[0x2652] = 0x03C3; unicode_map[0x2653] = 0x03C4; unicode_map[0x2654] = 0x03C5; unicode_map[0x2655] = 0x03C6; unicode_map[0x2656] = 0x03C7; unicode_map[0x2657] = 0x03C8; unicode_map[0x2658] = 0x03C9; unicode_map[0x2721] = 0x0410; unicode_map[0x2722] = 0x0411; unicode_map[0x2723] = 0x0412; unicode_map[0x2724] = 0x0413; unicode_map[0x2725] = 0x0414; unicode_map[0x2726] = 0x0415; unicode_map[0x2727] = 0x0401; unicode_map[0x2728] = 0x0416; unicode_map[0x2729] = 0x0417; unicode_map[0x272A] = 0x0418; unicode_map[0x272B] = 0x0419; unicode_map[0x272C] = 0x041A; unicode_map[0x272D] = 0x041B; unicode_map[0x272E] = 0x041C; unicode_map[0x272F] = 0x041D; unicode_map[0x2730] = 0x041E; unicode_map[0x2731] = 0x041F; unicode_map[0x2732] = 0x0420; unicode_map[0x2733] = 0x0421; unicode_map[0x2734] = 0x0422; unicode_map[0x2735] = 0x0423; unicode_map[0x2736] = 0x0424; unicode_map[0x2737] = 0x0425; unicode_map[0x2738] = 0x0426; unicode_map[0x2739] = 0x0427; unicode_map[0x273A] = 0x0428; unicode_map[0x273B] = 0x0429; unicode_map[0x273C] = 0x042A; unicode_map[0x273D] = 0x042B; unicode_map[0x273E] = 0x042C; unicode_map[0x273F] = 0x042D; unicode_map[0x2740] = 0x042E; unicode_map[0x2741] = 0x042F; unicode_map[0x2751] = 0x0430; unicode_map[0x2752] = 0x0431; unicode_map[0x2753] = 0x0432; unicode_map[0x2754] = 0x0433; unicode_map[0x2755] = 0x0434; unicode_map[0x2756] = 0x0435; unicode_map[0x2757] = 0x0451; unicode_map[0x2758] = 0x0436; unicode_map[0x2759] = 0x0437; unicode_map[0x275A] = 0x0438; unicode_map[0x275B] = 0x0439; unicode_map[0x275C] = 0x043A; unicode_map[0x275D] = 0x043B; unicode_map[0x275E] = 0x043C; unicode_map[0x275F] = 0x043D; unicode_map[0x2760] = 0x043E; unicode_map[0x2761] = 0x043F; unicode_map[0x2762] = 0x0440; unicode_map[0x2763] = 0x0441; unicode_map[0x2764] = 0x0442; unicode_map[0x2765] = 0x0443; unicode_map[0x2766] = 0x0444; unicode_map[0x2767] = 0x0445; unicode_map[0x2768] = 0x0446; unicode_map[0x2769] = 0x0447; unicode_map[0x276A] = 0x0448; unicode_map[0x276B] = 0x0449; unicode_map[0x276C] = 0x044A; unicode_map[0x276D] = 0x044B; unicode_map[0x276E] = 0x044C; unicode_map[0x276F] = 0x044D; unicode_map[0x2770] = 0x044E; unicode_map[0x2771] = 0x044F; unicode_map[0x2821] = 0x2500; unicode_map[0x2822] = 0x2502; unicode_map[0x2823] = 0x250C; unicode_map[0x2824] = 0x2510; unicode_map[0x2825] = 0x2518; unicode_map[0x2826] = 0x2514; unicode_map[0x2827] = 0x251C; unicode_map[0x2828] = 0x252C; unicode_map[0x2829] = 0x2524; unicode_map[0x282A] = 0x2534; unicode_map[0x282B] = 0x253C; unicode_map[0x282C] = 0x2501; unicode_map[0x282D] = 0x2503; unicode_map[0x282E] = 0x250F; unicode_map[0x282F] = 0x2513; unicode_map[0x2830] = 0x251B; unicode_map[0x2831] = 0x2517; unicode_map[0x2832] = 0x2523; unicode_map[0x2833] = 0x2533; unicode_map[0x2834] = 0x252B; unicode_map[0x2835] = 0x253B; unicode_map[0x2836] = 0x254B; unicode_map[0x2837] = 0x2520; unicode_map[0x2838] = 0x252F; unicode_map[0x2839] = 0x2528; unicode_map[0x283A] = 0x2537; unicode_map[0x283B] = 0x253F; unicode_map[0x283C] = 0x251D; unicode_map[0x283D] = 0x2530; unicode_map[0x283E] = 0x2525; unicode_map[0x283F] = 0x2538; unicode_map[0x2840] = 0x2542; unicode_map[0x3021] = 0x4E9C; unicode_map[0x3022] = 0x5516; unicode_map[0x3023] = 0x5A03; unicode_map[0x3024] = 0x963F; unicode_map[0x3025] = 0x54C0; unicode_map[0x3026] = 0x611B; unicode_map[0x3027] = 0x6328; unicode_map[0x3028] = 0x59F6; unicode_map[0x3029] = 0x9022; unicode_map[0x302A] = 0x8475; unicode_map[0x302B] = 0x831C; unicode_map[0x302C] = 0x7A50; unicode_map[0x302D] = 0x60AA; unicode_map[0x302E] = 0x63E1; unicode_map[0x302F] = 0x6E25; unicode_map[0x3030] = 0x65ED; unicode_map[0x3031] = 0x8466; unicode_map[0x3032] = 0x82A6; unicode_map[0x3033] = 0x9BF5; unicode_map[0x3034] = 0x6893; unicode_map[0x3035] = 0x5727; unicode_map[0x3036] = 0x65A1; unicode_map[0x3037] = 0x6271; unicode_map[0x3038] = 0x5B9B; unicode_map[0x3039] = 0x59D0; unicode_map[0x303A] = 0x867B; unicode_map[0x303B] = 0x98F4; unicode_map[0x303C] = 0x7D62; unicode_map[0x303D] = 0x7DBE; unicode_map[0x303E] = 0x9B8E; unicode_map[0x303F] = 0x6216; unicode_map[0x3040] = 0x7C9F; unicode_map[0x3041] = 0x88B7; unicode_map[0x3042] = 0x5B89; unicode_map[0x3043] = 0x5EB5; unicode_map[0x3044] = 0x6309; unicode_map[0x3045] = 0x6697; unicode_map[0x3046] = 0x6848; unicode_map[0x3047] = 0x95C7; unicode_map[0x3048] = 0x978D; unicode_map[0x3049] = 0x674F; unicode_map[0x304A] = 0x4EE5; unicode_map[0x304B] = 0x4F0A; unicode_map[0x304C] = 0x4F4D; unicode_map[0x304D] = 0x4F9D; unicode_map[0x304E] = 0x5049; unicode_map[0x304F] = 0x56F2; unicode_map[0x3050] = 0x5937; unicode_map[0x3051] = 0x59D4; unicode_map[0x3052] = 0x5A01; unicode_map[0x3053] = 0x5C09; unicode_map[0x3054] = 0x60DF; unicode_map[0x3055] = 0x610F; unicode_map[0x3056] = 0x6170; unicode_map[0x3057] = 0x6613; unicode_map[0x3058] = 0x6905; unicode_map[0x3059] = 0x70BA; unicode_map[0x305A] = 0x754F; unicode_map[0x305B] = 0x7570; unicode_map[0x305C] = 0x79FB; unicode_map[0x305D] = 0x7DAD; unicode_map[0x305E] = 0x7DEF; unicode_map[0x305F] = 0x80C3; unicode_map[0x3060] = 0x840E; unicode_map[0x3061] = 0x8863; unicode_map[0x3062] = 0x8B02; unicode_map[0x3063] = 0x9055; unicode_map[0x3064] = 0x907A; unicode_map[0x3065] = 0x533B; unicode_map[0x3066] = 0x4E95; unicode_map[0x3067] = 0x4EA5; unicode_map[0x3068] = 0x57DF; unicode_map[0x3069] = 0x80B2; unicode_map[0x306A] = 0x90C1; unicode_map[0x306B] = 0x78EF; unicode_map[0x306C] = 0x4E00; unicode_map[0x306D] = 0x58F1; unicode_map[0x306E] = 0x6EA2; unicode_map[0x306F] = 0x9038; unicode_map[0x3070] = 0x7A32; unicode_map[0x3071] = 0x8328; unicode_map[0x3072] = 0x828B; unicode_map[0x3073] = 0x9C2F; unicode_map[0x3074] = 0x5141; unicode_map[0x3075] = 0x5370; unicode_map[0x3076] = 0x54BD; unicode_map[0x3077] = 0x54E1; unicode_map[0x3078] = 0x56E0; unicode_map[0x3079] = 0x59FB; unicode_map[0x307A] = 0x5F15; unicode_map[0x307B] = 0x98F2; unicode_map[0x307C] = 0x6DEB; unicode_map[0x307D] = 0x80E4; unicode_map[0x307E] = 0x852D; unicode_map[0x3121] = 0x9662; unicode_map[0x3122] = 0x9670; unicode_map[0x3123] = 0x96A0; unicode_map[0x3124] = 0x97FB; unicode_map[0x3125] = 0x540B; unicode_map[0x3126] = 0x53F3; unicode_map[0x3127] = 0x5B87; unicode_map[0x3128] = 0x70CF; unicode_map[0x3129] = 0x7FBD; unicode_map[0x312A] = 0x8FC2; unicode_map[0x312B] = 0x96E8; unicode_map[0x312C] = 0x536F; unicode_map[0x312D] = 0x9D5C; unicode_map[0x312E] = 0x7ABA; unicode_map[0x312F] = 0x4E11; unicode_map[0x3130] = 0x7893; unicode_map[0x3131] = 0x81FC; unicode_map[0x3132] = 0x6E26; unicode_map[0x3133] = 0x5618; unicode_map[0x3134] = 0x5504; unicode_map[0x3135] = 0x6B1D; unicode_map[0x3136] = 0x851A; unicode_map[0x3137] = 0x9C3B; unicode_map[0x3138] = 0x59E5; unicode_map[0x3139] = 0x53A9; unicode_map[0x313A] = 0x6D66; unicode_map[0x313B] = 0x74DC; unicode_map[0x313C] = 0x958F; unicode_map[0x313D] = 0x5642; unicode_map[0x313E] = 0x4E91; unicode_map[0x313F] = 0x904B; unicode_map[0x3140] = 0x96F2; unicode_map[0x3141] = 0x834F; unicode_map[0x3142] = 0x990C; unicode_map[0x3143] = 0x53E1; unicode_map[0x3144] = 0x55B6; unicode_map[0x3145] = 0x5B30; unicode_map[0x3146] = 0x5F71; unicode_map[0x3147] = 0x6620; unicode_map[0x3148] = 0x66F3; unicode_map[0x3149] = 0x6804; unicode_map[0x314A] = 0x6C38; unicode_map[0x314B] = 0x6CF3; unicode_map[0x314C] = 0x6D29; unicode_map[0x314D] = 0x745B; unicode_map[0x314E] = 0x76C8; unicode_map[0x314F] = 0x7A4E; unicode_map[0x3150] = 0x9834; unicode_map[0x3151] = 0x82F1; unicode_map[0x3152] = 0x885B; unicode_map[0x3153] = 0x8A60; unicode_map[0x3154] = 0x92ED; unicode_map[0x3155] = 0x6DB2; unicode_map[0x3156] = 0x75AB; unicode_map[0x3157] = 0x76CA; unicode_map[0x3158] = 0x99C5; unicode_map[0x3159] = 0x60A6; unicode_map[0x315A] = 0x8B01; unicode_map[0x315B] = 0x8D8A; unicode_map[0x315C] = 0x95B2; unicode_map[0x315D] = 0x698E; unicode_map[0x315E] = 0x53AD; unicode_map[0x315F] = 0x5186; unicode_map[0x3160] = 0x5712; unicode_map[0x3161] = 0x5830; unicode_map[0x3162] = 0x5944; unicode_map[0x3163] = 0x5BB4; unicode_map[0x3164] = 0x5EF6; unicode_map[0x3165] = 0x6028; unicode_map[0x3166] = 0x63A9; unicode_map[0x3167] = 0x63F4; unicode_map[0x3168] = 0x6CBF; unicode_map[0x3169] = 0x6F14; unicode_map[0x316A] = 0x708E; unicode_map[0x316B] = 0x7114; unicode_map[0x316C] = 0x7159; unicode_map[0x316D] = 0x71D5; unicode_map[0x316E] = 0x733F; unicode_map[0x316F] = 0x7E01; unicode_map[0x3170] = 0x8276; unicode_map[0x3171] = 0x82D1; unicode_map[0x3172] = 0x8597; unicode_map[0x3173] = 0x9060; unicode_map[0x3174] = 0x925B; unicode_map[0x3175] = 0x9D1B; unicode_map[0x3176] = 0x5869; unicode_map[0x3177] = 0x65BC; unicode_map[0x3178] = 0x6C5A; unicode_map[0x3179] = 0x7525; unicode_map[0x317A] = 0x51F9; unicode_map[0x317B] = 0x592E; unicode_map[0x317C] = 0x5965; unicode_map[0x317D] = 0x5F80; unicode_map[0x317E] = 0x5FDC; unicode_map[0x3221] = 0x62BC; unicode_map[0x3222] = 0x65FA; unicode_map[0x3223] = 0x6A2A; unicode_map[0x3224] = 0x6B27; unicode_map[0x3225] = 0x6BB4; unicode_map[0x3226] = 0x738B; unicode_map[0x3227] = 0x7FC1; unicode_map[0x3228] = 0x8956; unicode_map[0x3229] = 0x9D2C; unicode_map[0x322A] = 0x9D0E; unicode_map[0x322B] = 0x9EC4; unicode_map[0x322C] = 0x5CA1; unicode_map[0x322D] = 0x6C96; unicode_map[0x322E] = 0x837B; unicode_map[0x322F] = 0x5104; unicode_map[0x3230] = 0x5C4B; unicode_map[0x3231] = 0x61B6; unicode_map[0x3232] = 0x81C6; unicode_map[0x3233] = 0x6876; unicode_map[0x3234] = 0x7261; unicode_map[0x3235] = 0x4E59; unicode_map[0x3236] = 0x4FFA; unicode_map[0x3237] = 0x5378; unicode_map[0x3238] = 0x6069; unicode_map[0x3239] = 0x6E29; unicode_map[0x323A] = 0x7A4F; unicode_map[0x323B] = 0x97F3; unicode_map[0x323C] = 0x4E0B; unicode_map[0x323D] = 0x5316; unicode_map[0x323E] = 0x4EEE; unicode_map[0x323F] = 0x4F55; unicode_map[0x3240] = 0x4F3D; unicode_map[0x3241] = 0x4FA1; unicode_map[0x3242] = 0x4F73; unicode_map[0x3243] = 0x52A0; unicode_map[0x3244] = 0x53EF; unicode_map[0x3245] = 0x5609; unicode_map[0x3246] = 0x590F; unicode_map[0x3247] = 0x5AC1; unicode_map[0x3248] = 0x5BB6; unicode_map[0x3249] = 0x5BE1; unicode_map[0x324A] = 0x79D1; unicode_map[0x324B] = 0x6687; unicode_map[0x324C] = 0x679C; unicode_map[0x324D] = 0x67B6; unicode_map[0x324E] = 0x6B4C; unicode_map[0x324F] = 0x6CB3; unicode_map[0x3250] = 0x706B; unicode_map[0x3251] = 0x73C2; unicode_map[0x3252] = 0x798D; unicode_map[0x3253] = 0x79BE; unicode_map[0x3254] = 0x7A3C; unicode_map[0x3255] = 0x7B87; unicode_map[0x3256] = 0x82B1; unicode_map[0x3257] = 0x82DB; unicode_map[0x3258] = 0x8304; unicode_map[0x3259] = 0x8377; unicode_map[0x325A] = 0x83EF; unicode_map[0x325B] = 0x83D3; unicode_map[0x325C] = 0x8766; unicode_map[0x325D] = 0x8AB2; unicode_map[0x325E] = 0x5629; unicode_map[0x325F] = 0x8CA8; unicode_map[0x3260] = 0x8FE6; unicode_map[0x3261] = 0x904E; unicode_map[0x3262] = 0x971E; unicode_map[0x3263] = 0x868A; unicode_map[0x3264] = 0x4FC4; unicode_map[0x3265] = 0x5CE8; unicode_map[0x3266] = 0x6211; unicode_map[0x3267] = 0x7259; unicode_map[0x3268] = 0x753B; unicode_map[0x3269] = 0x81E5; unicode_map[0x326A] = 0x82BD; unicode_map[0x326B] = 0x86FE; unicode_map[0x326C] = 0x8CC0; unicode_map[0x326D] = 0x96C5; unicode_map[0x326E] = 0x9913; unicode_map[0x326F] = 0x99D5; unicode_map[0x3270] = 0x4ECB; unicode_map[0x3271] = 0x4F1A; unicode_map[0x3272] = 0x89E3; unicode_map[0x3273] = 0x56DE; unicode_map[0x3274] = 0x584A; unicode_map[0x3275] = 0x58CA; unicode_map[0x3276] = 0x5EFB; unicode_map[0x3277] = 0x5FEB; unicode_map[0x3278] = 0x602A; unicode_map[0x3279] = 0x6094; unicode_map[0x327A] = 0x6062; unicode_map[0x327B] = 0x61D0; unicode_map[0x327C] = 0x6212; unicode_map[0x327D] = 0x62D0; unicode_map[0x327E] = 0x6539; unicode_map[0x3321] = 0x9B41; unicode_map[0x3322] = 0x6666; unicode_map[0x3323] = 0x68B0; unicode_map[0x3324] = 0x6D77; unicode_map[0x3325] = 0x7070; unicode_map[0x3326] = 0x754C; unicode_map[0x3327] = 0x7686; unicode_map[0x3328] = 0x7D75; unicode_map[0x3329] = 0x82A5; unicode_map[0x332A] = 0x87F9; unicode_map[0x332B] = 0x958B; unicode_map[0x332C] = 0x968E; unicode_map[0x332D] = 0x8C9D; unicode_map[0x332E] = 0x51F1; unicode_map[0x332F] = 0x52BE; unicode_map[0x3330] = 0x5916; unicode_map[0x3331] = 0x54B3; unicode_map[0x3332] = 0x5BB3; unicode_map[0x3333] = 0x5D16; unicode_map[0x3334] = 0x6168; unicode_map[0x3335] = 0x6982; unicode_map[0x3336] = 0x6DAF; unicode_map[0x3337] = 0x788D; unicode_map[0x3338] = 0x84CB; unicode_map[0x3339] = 0x8857; unicode_map[0x333A] = 0x8A72; unicode_map[0x333B] = 0x93A7; unicode_map[0x333C] = 0x9AB8; unicode_map[0x333D] = 0x6D6C; unicode_map[0x333E] = 0x99A8; unicode_map[0x333F] = 0x86D9; unicode_map[0x3340] = 0x57A3; unicode_map[0x3341] = 0x67FF; unicode_map[0x3342] = 0x86CE; unicode_map[0x3343] = 0x920E; unicode_map[0x3344] = 0x5283; unicode_map[0x3345] = 0x5687; unicode_map[0x3346] = 0x5404; unicode_map[0x3347] = 0x5ED3; unicode_map[0x3348] = 0x62E1; unicode_map[0x3349] = 0x64B9; unicode_map[0x334A] = 0x683C; unicode_map[0x334B] = 0x6838; unicode_map[0x334C] = 0x6BBB; unicode_map[0x334D] = 0x7372; unicode_map[0x334E] = 0x78BA; unicode_map[0x334F] = 0x7A6B; unicode_map[0x3350] = 0x899A; unicode_map[0x3351] = 0x89D2; unicode_map[0x3352] = 0x8D6B; unicode_map[0x3353] = 0x8F03; unicode_map[0x3354] = 0x90ED; unicode_map[0x3355] = 0x95A3; unicode_map[0x3356] = 0x9694; unicode_map[0x3357] = 0x9769; unicode_map[0x3358] = 0x5B66; unicode_map[0x3359] = 0x5CB3; unicode_map[0x335A] = 0x697D; unicode_map[0x335B] = 0x984D; unicode_map[0x335C] = 0x984E; unicode_map[0x335D] = 0x639B; unicode_map[0x335E] = 0x7B20; unicode_map[0x335F] = 0x6A2B; unicode_map[0x3360] = 0x6A7F; unicode_map[0x3361] = 0x68B6; unicode_map[0x3362] = 0x9C0D; unicode_map[0x3363] = 0x6F5F; unicode_map[0x3364] = 0x5272; unicode_map[0x3365] = 0x559D; unicode_map[0x3366] = 0x6070; unicode_map[0x3367] = 0x62EC; unicode_map[0x3368] = 0x6D3B; unicode_map[0x3369] = 0x6E07; unicode_map[0x336A] = 0x6ED1; unicode_map[0x336B] = 0x845B; unicode_map[0x336C] = 0x8910; unicode_map[0x336D] = 0x8F44; unicode_map[0x336E] = 0x4E14; unicode_map[0x336F] = 0x9C39; unicode_map[0x3370] = 0x53F6; unicode_map[0x3371] = 0x691B; unicode_map[0x3372] = 0x6A3A; unicode_map[0x3373] = 0x9784; unicode_map[0x3374] = 0x682A; unicode_map[0x3375] = 0x515C; unicode_map[0x3376] = 0x7AC3; unicode_map[0x3377] = 0x84B2; unicode_map[0x3378] = 0x91DC; unicode_map[0x3379] = 0x938C; unicode_map[0x337A] = 0x565B; unicode_map[0x337B] = 0x9D28; unicode_map[0x337C] = 0x6822; unicode_map[0x337D] = 0x8305; unicode_map[0x337E] = 0x8431; unicode_map[0x3421] = 0x7CA5; unicode_map[0x3422] = 0x5208; unicode_map[0x3423] = 0x82C5; unicode_map[0x3424] = 0x74E6; unicode_map[0x3425] = 0x4E7E; unicode_map[0x3426] = 0x4F83; unicode_map[0x3427] = 0x51A0; unicode_map[0x3428] = 0x5BD2; unicode_map[0x3429] = 0x520A; unicode_map[0x342A] = 0x52D8; unicode_map[0x342B] = 0x52E7; unicode_map[0x342C] = 0x5DFB; unicode_map[0x342D] = 0x559A; unicode_map[0x342E] = 0x582A; unicode_map[0x342F] = 0x59E6; unicode_map[0x3430] = 0x5B8C; unicode_map[0x3431] = 0x5B98; unicode_map[0x3432] = 0x5BDB; unicode_map[0x3433] = 0x5E72; unicode_map[0x3434] = 0x5E79; unicode_map[0x3435] = 0x60A3; unicode_map[0x3436] = 0x611F; unicode_map[0x3437] = 0x6163; unicode_map[0x3438] = 0x61BE; unicode_map[0x3439] = 0x63DB; unicode_map[0x343A] = 0x6562; unicode_map[0x343B] = 0x67D1; unicode_map[0x343C] = 0x6853; unicode_map[0x343D] = 0x68FA; unicode_map[0x343E] = 0x6B3E; unicode_map[0x343F] = 0x6B53; unicode_map[0x3440] = 0x6C57; unicode_map[0x3441] = 0x6F22; unicode_map[0x3442] = 0x6F97; unicode_map[0x3443] = 0x6F45; unicode_map[0x3444] = 0x74B0; unicode_map[0x3445] = 0x7518; unicode_map[0x3446] = 0x76E3; unicode_map[0x3447] = 0x770B; unicode_map[0x3448] = 0x7AFF; unicode_map[0x3449] = 0x7BA1; unicode_map[0x344A] = 0x7C21; unicode_map[0x344B] = 0x7DE9; unicode_map[0x344C] = 0x7F36; unicode_map[0x344D] = 0x7FF0; unicode_map[0x344E] = 0x809D; unicode_map[0x344F] = 0x8266; unicode_map[0x3450] = 0x839E; unicode_map[0x3451] = 0x89B3; unicode_map[0x3452] = 0x8ACC; unicode_map[0x3453] = 0x8CAB; unicode_map[0x3454] = 0x9084; unicode_map[0x3455] = 0x9451; unicode_map[0x3456] = 0x9593; unicode_map[0x3457] = 0x9591; unicode_map[0x3458] = 0x95A2; unicode_map[0x3459] = 0x9665; unicode_map[0x345A] = 0x97D3; unicode_map[0x345B] = 0x9928; unicode_map[0x345C] = 0x8218; unicode_map[0x345D] = 0x4E38; unicode_map[0x345E] = 0x542B; unicode_map[0x345F] = 0x5CB8; unicode_map[0x3460] = 0x5DCC; unicode_map[0x3461] = 0x73A9; unicode_map[0x3462] = 0x764C; unicode_map[0x3463] = 0x773C; unicode_map[0x3464] = 0x5CA9; unicode_map[0x3465] = 0x7FEB; unicode_map[0x3466] = 0x8D0B; unicode_map[0x3467] = 0x96C1; unicode_map[0x3468] = 0x9811; unicode_map[0x3469] = 0x9854; unicode_map[0x346A] = 0x9858; unicode_map[0x346B] = 0x4F01; unicode_map[0x346C] = 0x4F0E; unicode_map[0x346D] = 0x5371; unicode_map[0x346E] = 0x559C; unicode_map[0x346F] = 0x5668; unicode_map[0x3470] = 0x57FA; unicode_map[0x3471] = 0x5947; unicode_map[0x3472] = 0x5B09; unicode_map[0x3473] = 0x5BC4; unicode_map[0x3474] = 0x5C90; unicode_map[0x3475] = 0x5E0C; unicode_map[0x3476] = 0x5E7E; unicode_map[0x3477] = 0x5FCC; unicode_map[0x3478] = 0x63EE; unicode_map[0x3479] = 0x673A; unicode_map[0x347A] = 0x65D7; unicode_map[0x347B] = 0x65E2; unicode_map[0x347C] = 0x671F; unicode_map[0x347D] = 0x68CB; unicode_map[0x347E] = 0x68C4; unicode_map[0x3521] = 0x6A5F; unicode_map[0x3522] = 0x5E30; unicode_map[0x3523] = 0x6BC5; unicode_map[0x3524] = 0x6C17; unicode_map[0x3525] = 0x6C7D; unicode_map[0x3526] = 0x757F; unicode_map[0x3527] = 0x7948; unicode_map[0x3528] = 0x5B63; unicode_map[0x3529] = 0x7A00; unicode_map[0x352A] = 0x7D00; unicode_map[0x352B] = 0x5FBD; unicode_map[0x352C] = 0x898F; unicode_map[0x352D] = 0x8A18; unicode_map[0x352E] = 0x8CB4; unicode_map[0x352F] = 0x8D77; unicode_map[0x3530] = 0x8ECC; unicode_map[0x3531] = 0x8F1D; unicode_map[0x3532] = 0x98E2; unicode_map[0x3533] = 0x9A0E; unicode_map[0x3534] = 0x9B3C; unicode_map[0x3535] = 0x4E80; unicode_map[0x3536] = 0x507D; unicode_map[0x3537] = 0x5100; unicode_map[0x3538] = 0x5993; unicode_map[0x3539] = 0x5B9C; unicode_map[0x353A] = 0x622F; unicode_map[0x353B] = 0x6280; unicode_map[0x353C] = 0x64EC; unicode_map[0x353D] = 0x6B3A; unicode_map[0x353E] = 0x72A0; unicode_map[0x353F] = 0x7591; unicode_map[0x3540] = 0x7947; unicode_map[0x3541] = 0x7FA9; unicode_map[0x3542] = 0x87FB; unicode_map[0x3543] = 0x8ABC; unicode_map[0x3544] = 0x8B70; unicode_map[0x3545] = 0x63AC; unicode_map[0x3546] = 0x83CA; unicode_map[0x3547] = 0x97A0; unicode_map[0x3548] = 0x5409; unicode_map[0x3549] = 0x5403; unicode_map[0x354A] = 0x55AB; unicode_map[0x354B] = 0x6854; unicode_map[0x354C] = 0x6A58; unicode_map[0x354D] = 0x8A70; unicode_map[0x354E] = 0x7827; unicode_map[0x354F] = 0x6775; unicode_map[0x3550] = 0x9ECD; unicode_map[0x3551] = 0x5374; unicode_map[0x3552] = 0x5BA2; unicode_map[0x3553] = 0x811A; unicode_map[0x3554] = 0x8650; unicode_map[0x3555] = 0x9006; unicode_map[0x3556] = 0x4E18; unicode_map[0x3557] = 0x4E45; unicode_map[0x3558] = 0x4EC7; unicode_map[0x3559] = 0x4F11; unicode_map[0x355A] = 0x53CA; unicode_map[0x355B] = 0x5438; unicode_map[0x355C] = 0x5BAE; unicode_map[0x355D] = 0x5F13; unicode_map[0x355E] = 0x6025; unicode_map[0x355F] = 0x6551; unicode_map[0x3560] = 0x673D; unicode_map[0x3561] = 0x6C42; unicode_map[0x3562] = 0x6C72; unicode_map[0x3563] = 0x6CE3; unicode_map[0x3564] = 0x7078; unicode_map[0x3565] = 0x7403; unicode_map[0x3566] = 0x7A76; unicode_map[0x3567] = 0x7AAE; unicode_map[0x3568] = 0x7B08; unicode_map[0x3569] = 0x7D1A; unicode_map[0x356A] = 0x7CFE; unicode_map[0x356B] = 0x7D66; unicode_map[0x356C] = 0x65E7; unicode_map[0x356D] = 0x725B; unicode_map[0x356E] = 0x53BB; unicode_map[0x356F] = 0x5C45; unicode_map[0x3570] = 0x5DE8; unicode_map[0x3571] = 0x62D2; unicode_map[0x3572] = 0x62E0; unicode_map[0x3573] = 0x6319; unicode_map[0x3574] = 0x6E20; unicode_map[0x3575] = 0x865A; unicode_map[0x3576] = 0x8A31; unicode_map[0x3577] = 0x8DDD; unicode_map[0x3578] = 0x92F8; unicode_map[0x3579] = 0x6F01; unicode_map[0x357A] = 0x79A6; unicode_map[0x357B] = 0x9B5A; unicode_map[0x357C] = 0x4EA8; unicode_map[0x357D] = 0x4EAB; unicode_map[0x357E] = 0x4EAC; unicode_map[0x3621] = 0x4F9B; unicode_map[0x3622] = 0x4FA0; unicode_map[0x3623] = 0x50D1; unicode_map[0x3624] = 0x5147; unicode_map[0x3625] = 0x7AF6; unicode_map[0x3626] = 0x5171; unicode_map[0x3627] = 0x51F6; unicode_map[0x3628] = 0x5354; unicode_map[0x3629] = 0x5321; unicode_map[0x362A] = 0x537F; unicode_map[0x362B] = 0x53EB; unicode_map[0x362C] = 0x55AC; unicode_map[0x362D] = 0x5883; unicode_map[0x362E] = 0x5CE1; unicode_map[0x362F] = 0x5F37; unicode_map[0x3630] = 0x5F4A; unicode_map[0x3631] = 0x602F; unicode_map[0x3632] = 0x6050; unicode_map[0x3633] = 0x606D; unicode_map[0x3634] = 0x631F; unicode_map[0x3635] = 0x6559; unicode_map[0x3636] = 0x6A4B; unicode_map[0x3637] = 0x6CC1; unicode_map[0x3638] = 0x72C2; unicode_map[0x3639] = 0x72ED; unicode_map[0x363A] = 0x77EF; unicode_map[0x363B] = 0x80F8; unicode_map[0x363C] = 0x8105; unicode_map[0x363D] = 0x8208; unicode_map[0x363E] = 0x854E; unicode_map[0x363F] = 0x90F7; unicode_map[0x3640] = 0x93E1; unicode_map[0x3641] = 0x97FF; unicode_map[0x3642] = 0x9957; unicode_map[0x3643] = 0x9A5A; unicode_map[0x3644] = 0x4EF0; unicode_map[0x3645] = 0x51DD; unicode_map[0x3646] = 0x5C2D; unicode_map[0x3647] = 0x6681; unicode_map[0x3648] = 0x696D; unicode_map[0x3649] = 0x5C40; unicode_map[0x364A] = 0x66F2; unicode_map[0x364B] = 0x6975; unicode_map[0x364C] = 0x7389; unicode_map[0x364D] = 0x6850; unicode_map[0x364E] = 0x7C81; unicode_map[0x364F] = 0x50C5; unicode_map[0x3650] = 0x52E4; unicode_map[0x3651] = 0x5747; unicode_map[0x3652] = 0x5DFE; unicode_map[0x3653] = 0x9326; unicode_map[0x3654] = 0x65A4; unicode_map[0x3655] = 0x6B23; unicode_map[0x3656] = 0x6B3D; unicode_map[0x3657] = 0x7434; unicode_map[0x3658] = 0x7981; unicode_map[0x3659] = 0x79BD; unicode_map[0x365A] = 0x7B4B; unicode_map[0x365B] = 0x7DCA; unicode_map[0x365C] = 0x82B9; unicode_map[0x365D] = 0x83CC; unicode_map[0x365E] = 0x887F; unicode_map[0x365F] = 0x895F; unicode_map[0x3660] = 0x8B39; unicode_map[0x3661] = 0x8FD1; unicode_map[0x3662] = 0x91D1; unicode_map[0x3663] = 0x541F; unicode_map[0x3664] = 0x9280; unicode_map[0x3665] = 0x4E5D; unicode_map[0x3666] = 0x5036; unicode_map[0x3667] = 0x53E5; unicode_map[0x3668] = 0x533A; unicode_map[0x3669] = 0x72D7; unicode_map[0x366A] = 0x7396; unicode_map[0x366B] = 0x77E9; unicode_map[0x366C] = 0x82E6; unicode_map[0x366D] = 0x8EAF; unicode_map[0x366E] = 0x99C6; unicode_map[0x366F] = 0x99C8; unicode_map[0x3670] = 0x99D2; unicode_map[0x3671] = 0x5177; unicode_map[0x3672] = 0x611A; unicode_map[0x3673] = 0x865E; unicode_map[0x3674] = 0x55B0; unicode_map[0x3675] = 0x7A7A; unicode_map[0x3676] = 0x5076; unicode_map[0x3677] = 0x5BD3; unicode_map[0x3678] = 0x9047; unicode_map[0x3679] = 0x9685; unicode_map[0x367A] = 0x4E32; unicode_map[0x367B] = 0x6ADB; unicode_map[0x367C] = 0x91E7; unicode_map[0x367D] = 0x5C51; unicode_map[0x367E] = 0x5C48; unicode_map[0x3721] = 0x6398; unicode_map[0x3722] = 0x7A9F; unicode_map[0x3723] = 0x6C93; unicode_map[0x3724] = 0x9774; unicode_map[0x3725] = 0x8F61; unicode_map[0x3726] = 0x7AAA; unicode_map[0x3727] = 0x718A; unicode_map[0x3728] = 0x9688; unicode_map[0x3729] = 0x7C82; unicode_map[0x372A] = 0x6817; unicode_map[0x372B] = 0x7E70; unicode_map[0x372C] = 0x6851; unicode_map[0x372D] = 0x936C; unicode_map[0x372E] = 0x52F2; unicode_map[0x372F] = 0x541B; unicode_map[0x3730] = 0x85AB; unicode_map[0x3731] = 0x8A13; unicode_map[0x3732] = 0x7FA4; unicode_map[0x3733] = 0x8ECD; unicode_map[0x3734] = 0x90E1; unicode_map[0x3735] = 0x5366; unicode_map[0x3736] = 0x8888; unicode_map[0x3737] = 0x7941; unicode_map[0x3738] = 0x4FC2; unicode_map[0x3739] = 0x50BE; unicode_map[0x373A] = 0x5211; unicode_map[0x373B] = 0x5144; unicode_map[0x373C] = 0x5553; unicode_map[0x373D] = 0x572D; unicode_map[0x373E] = 0x73EA; unicode_map[0x373F] = 0x578B; unicode_map[0x3740] = 0x5951; unicode_map[0x3741] = 0x5F62; unicode_map[0x3742] = 0x5F84; unicode_map[0x3743] = 0x6075; unicode_map[0x3744] = 0x6176; unicode_map[0x3745] = 0x6167; unicode_map[0x3746] = 0x61A9; unicode_map[0x3747] = 0x63B2; unicode_map[0x3748] = 0x643A; unicode_map[0x3749] = 0x656C; unicode_map[0x374A] = 0x666F; unicode_map[0x374B] = 0x6842; unicode_map[0x374C] = 0x6E13; unicode_map[0x374D] = 0x7566; unicode_map[0x374E] = 0x7A3D; unicode_map[0x374F] = 0x7CFB; unicode_map[0x3750] = 0x7D4C; unicode_map[0x3751] = 0x7D99; unicode_map[0x3752] = 0x7E4B; unicode_map[0x3753] = 0x7F6B; unicode_map[0x3754] = 0x830E; unicode_map[0x3755] = 0x834A; unicode_map[0x3756] = 0x86CD; unicode_map[0x3757] = 0x8A08; unicode_map[0x3758] = 0x8A63; unicode_map[0x3759] = 0x8B66; unicode_map[0x375A] = 0x8EFD; unicode_map[0x375B] = 0x981A; unicode_map[0x375C] = 0x9D8F; unicode_map[0x375D] = 0x82B8; unicode_map[0x375E] = 0x8FCE; unicode_map[0x375F] = 0x9BE8; unicode_map[0x3760] = 0x5287; unicode_map[0x3761] = 0x621F; unicode_map[0x3762] = 0x6483; unicode_map[0x3763] = 0x6FC0; unicode_map[0x3764] = 0x9699; unicode_map[0x3765] = 0x6841; unicode_map[0x3766] = 0x5091; unicode_map[0x3767] = 0x6B20; unicode_map[0x3768] = 0x6C7A; unicode_map[0x3769] = 0x6F54; unicode_map[0x376A] = 0x7A74; unicode_map[0x376B] = 0x7D50; unicode_map[0x376C] = 0x8840; unicode_map[0x376D] = 0x8A23; unicode_map[0x376E] = 0x6708; unicode_map[0x376F] = 0x4EF6; unicode_map[0x3770] = 0x5039; unicode_map[0x3771] = 0x5026; unicode_map[0x3772] = 0x5065; unicode_map[0x3773] = 0x517C; unicode_map[0x3774] = 0x5238; unicode_map[0x3775] = 0x5263; unicode_map[0x3776] = 0x55A7; unicode_map[0x3777] = 0x570F; unicode_map[0x3778] = 0x5805; unicode_map[0x3779] = 0x5ACC; unicode_map[0x377A] = 0x5EFA; unicode_map[0x377B] = 0x61B2; unicode_map[0x377C] = 0x61F8; unicode_map[0x377D] = 0x62F3; unicode_map[0x377E] = 0x6372; unicode_map[0x3821] = 0x691C; unicode_map[0x3822] = 0x6A29; unicode_map[0x3823] = 0x727D; unicode_map[0x3824] = 0x72AC; unicode_map[0x3825] = 0x732E; unicode_map[0x3826] = 0x7814; unicode_map[0x3827] = 0x786F; unicode_map[0x3828] = 0x7D79; unicode_map[0x3829] = 0x770C; unicode_map[0x382A] = 0x80A9; unicode_map[0x382B] = 0x898B; unicode_map[0x382C] = 0x8B19; unicode_map[0x382D] = 0x8CE2; unicode_map[0x382E] = 0x8ED2; unicode_map[0x382F] = 0x9063; unicode_map[0x3830] = 0x9375; unicode_map[0x3831] = 0x967A; unicode_map[0x3832] = 0x9855; unicode_map[0x3833] = 0x9A13; unicode_map[0x3834] = 0x9E78; unicode_map[0x3835] = 0x5143; unicode_map[0x3836] = 0x539F; unicode_map[0x3837] = 0x53B3; unicode_map[0x3838] = 0x5E7B; unicode_map[0x3839] = 0x5F26; unicode_map[0x383A] = 0x6E1B; unicode_map[0x383B] = 0x6E90; unicode_map[0x383C] = 0x7384; unicode_map[0x383D] = 0x73FE; unicode_map[0x383E] = 0x7D43; unicode_map[0x383F] = 0x8237; unicode_map[0x3840] = 0x8A00; unicode_map[0x3841] = 0x8AFA; unicode_map[0x3842] = 0x9650; unicode_map[0x3843] = 0x4E4E; unicode_map[0x3844] = 0x500B; unicode_map[0x3845] = 0x53E4; unicode_map[0x3846] = 0x547C; unicode_map[0x3847] = 0x56FA; unicode_map[0x3848] = 0x59D1; unicode_map[0x3849] = 0x5B64; unicode_map[0x384A] = 0x5DF1; unicode_map[0x384B] = 0x5EAB; unicode_map[0x384C] = 0x5F27; unicode_map[0x384D] = 0x6238; unicode_map[0x384E] = 0x6545; unicode_map[0x384F] = 0x67AF; unicode_map[0x3850] = 0x6E56; unicode_map[0x3851] = 0x72D0; unicode_map[0x3852] = 0x7CCA; unicode_map[0x3853] = 0x88B4; unicode_map[0x3854] = 0x80A1; unicode_map[0x3855] = 0x80E1; unicode_map[0x3856] = 0x83F0; unicode_map[0x3857] = 0x864E; unicode_map[0x3858] = 0x8A87; unicode_map[0x3859] = 0x8DE8; unicode_map[0x385A] = 0x9237; unicode_map[0x385B] = 0x96C7; unicode_map[0x385C] = 0x9867; unicode_map[0x385D] = 0x9F13; unicode_map[0x385E] = 0x4E94; unicode_map[0x385F] = 0x4E92; unicode_map[0x3860] = 0x4F0D; unicode_map[0x3861] = 0x5348; unicode_map[0x3862] = 0x5449; unicode_map[0x3863] = 0x543E; unicode_map[0x3864] = 0x5A2F; unicode_map[0x3865] = 0x5F8C; unicode_map[0x3866] = 0x5FA1; unicode_map[0x3867] = 0x609F; unicode_map[0x3868] = 0x68A7; unicode_map[0x3869] = 0x6A8E; unicode_map[0x386A] = 0x745A; unicode_map[0x386B] = 0x7881; unicode_map[0x386C] = 0x8A9E; unicode_map[0x386D] = 0x8AA4; unicode_map[0x386E] = 0x8B77; unicode_map[0x386F] = 0x9190; unicode_map[0x3870] = 0x4E5E; unicode_map[0x3871] = 0x9BC9; unicode_map[0x3872] = 0x4EA4; unicode_map[0x3873] = 0x4F7C; unicode_map[0x3874] = 0x4FAF; unicode_map[0x3875] = 0x5019; unicode_map[0x3876] = 0x5016; unicode_map[0x3877] = 0x5149; unicode_map[0x3878] = 0x516C; unicode_map[0x3879] = 0x529F; unicode_map[0x387A] = 0x52B9; unicode_map[0x387B] = 0x52FE; unicode_map[0x387C] = 0x539A; unicode_map[0x387D] = 0x53E3; unicode_map[0x387E] = 0x5411; unicode_map[0x3921] = 0x540E; unicode_map[0x3922] = 0x5589; unicode_map[0x3923] = 0x5751; unicode_map[0x3924] = 0x57A2; unicode_map[0x3925] = 0x597D; unicode_map[0x3926] = 0x5B54; unicode_map[0x3927] = 0x5B5D; unicode_map[0x3928] = 0x5B8F; unicode_map[0x3929] = 0x5DE5; unicode_map[0x392A] = 0x5DE7; unicode_map[0x392B] = 0x5DF7; unicode_map[0x392C] = 0x5E78; unicode_map[0x392D] = 0x5E83; unicode_map[0x392E] = 0x5E9A; unicode_map[0x392F] = 0x5EB7; unicode_map[0x3930] = 0x5F18; unicode_map[0x3931] = 0x6052; unicode_map[0x3932] = 0x614C; unicode_map[0x3933] = 0x6297; unicode_map[0x3934] = 0x62D8; unicode_map[0x3935] = 0x63A7; unicode_map[0x3936] = 0x653B; unicode_map[0x3937] = 0x6602; unicode_map[0x3938] = 0x6643; unicode_map[0x3939] = 0x66F4; unicode_map[0x393A] = 0x676D; unicode_map[0x393B] = 0x6821; unicode_map[0x393C] = 0x6897; unicode_map[0x393D] = 0x69CB; unicode_map[0x393E] = 0x6C5F; unicode_map[0x393F] = 0x6D2A; unicode_map[0x3940] = 0x6D69; unicode_map[0x3941] = 0x6E2F; unicode_map[0x3942] = 0x6E9D; unicode_map[0x3943] = 0x7532; unicode_map[0x3944] = 0x7687; unicode_map[0x3945] = 0x786C; unicode_map[0x3946] = 0x7A3F; unicode_map[0x3947] = 0x7CE0; unicode_map[0x3948] = 0x7D05; unicode_map[0x3949] = 0x7D18; unicode_map[0x394A] = 0x7D5E; unicode_map[0x394B] = 0x7DB1; unicode_map[0x394C] = 0x8015; unicode_map[0x394D] = 0x8003; unicode_map[0x394E] = 0x80AF; unicode_map[0x394F] = 0x80B1; unicode_map[0x3950] = 0x8154; unicode_map[0x3951] = 0x818F; unicode_map[0x3952] = 0x822A; unicode_map[0x3953] = 0x8352; unicode_map[0x3954] = 0x884C; unicode_map[0x3955] = 0x8861; unicode_map[0x3956] = 0x8B1B; unicode_map[0x3957] = 0x8CA2; unicode_map[0x3958] = 0x8CFC; unicode_map[0x3959] = 0x90CA; unicode_map[0x395A] = 0x9175; unicode_map[0x395B] = 0x9271; unicode_map[0x395C] = 0x783F; unicode_map[0x395D] = 0x92FC; unicode_map[0x395E] = 0x95A4; unicode_map[0x395F] = 0x964D; unicode_map[0x3960] = 0x9805; unicode_map[0x3961] = 0x9999; unicode_map[0x3962] = 0x9AD8; unicode_map[0x3963] = 0x9D3B; unicode_map[0x3964] = 0x525B; unicode_map[0x3965] = 0x52AB; unicode_map[0x3966] = 0x53F7; unicode_map[0x3967] = 0x5408; unicode_map[0x3968] = 0x58D5; unicode_map[0x3969] = 0x62F7; unicode_map[0x396A] = 0x6FE0; unicode_map[0x396B] = 0x8C6A; unicode_map[0x396C] = 0x8F5F; unicode_map[0x396D] = 0x9EB9; unicode_map[0x396E] = 0x514B; unicode_map[0x396F] = 0x523B; unicode_map[0x3970] = 0x544A; unicode_map[0x3971] = 0x56FD; unicode_map[0x3972] = 0x7A40; unicode_map[0x3973] = 0x9177; unicode_map[0x3974] = 0x9D60; unicode_map[0x3975] = 0x9ED2; unicode_map[0x3976] = 0x7344; unicode_map[0x3977] = 0x6F09; unicode_map[0x3978] = 0x8170; unicode_map[0x3979] = 0x7511; unicode_map[0x397A] = 0x5FFD; unicode_map[0x397B] = 0x60DA; unicode_map[0x397C] = 0x9AA8; unicode_map[0x397D] = 0x72DB; unicode_map[0x397E] = 0x8FBC; unicode_map[0x3A21] = 0x6B64; unicode_map[0x3A22] = 0x9803; unicode_map[0x3A23] = 0x4ECA; unicode_map[0x3A24] = 0x56F0; unicode_map[0x3A25] = 0x5764; unicode_map[0x3A26] = 0x58BE; unicode_map[0x3A27] = 0x5A5A; unicode_map[0x3A28] = 0x6068; unicode_map[0x3A29] = 0x61C7; unicode_map[0x3A2A] = 0x660F; unicode_map[0x3A2B] = 0x6606; unicode_map[0x3A2C] = 0x6839; unicode_map[0x3A2D] = 0x68B1; unicode_map[0x3A2E] = 0x6DF7; unicode_map[0x3A2F] = 0x75D5; unicode_map[0x3A30] = 0x7D3A; unicode_map[0x3A31] = 0x826E; unicode_map[0x3A32] = 0x9B42; unicode_map[0x3A33] = 0x4E9B; unicode_map[0x3A34] = 0x4F50; unicode_map[0x3A35] = 0x53C9; unicode_map[0x3A36] = 0x5506; unicode_map[0x3A37] = 0x5D6F; unicode_map[0x3A38] = 0x5DE6; unicode_map[0x3A39] = 0x5DEE; unicode_map[0x3A3A] = 0x67FB; unicode_map[0x3A3B] = 0x6C99; unicode_map[0x3A3C] = 0x7473; unicode_map[0x3A3D] = 0x7802; unicode_map[0x3A3E] = 0x8A50; unicode_map[0x3A3F] = 0x9396; unicode_map[0x3A40] = 0x88DF; unicode_map[0x3A41] = 0x5750; unicode_map[0x3A42] = 0x5EA7; unicode_map[0x3A43] = 0x632B; unicode_map[0x3A44] = 0x50B5; unicode_map[0x3A45] = 0x50AC; unicode_map[0x3A46] = 0x518D; unicode_map[0x3A47] = 0x6700; unicode_map[0x3A48] = 0x54C9; unicode_map[0x3A49] = 0x585E; unicode_map[0x3A4A] = 0x59BB; unicode_map[0x3A4B] = 0x5BB0; unicode_map[0x3A4C] = 0x5F69; unicode_map[0x3A4D] = 0x624D; unicode_map[0x3A4E] = 0x63A1; unicode_map[0x3A4F] = 0x683D; unicode_map[0x3A50] = 0x6B73; unicode_map[0x3A51] = 0x6E08; unicode_map[0x3A52] = 0x707D; unicode_map[0x3A53] = 0x91C7; unicode_map[0x3A54] = 0x7280; unicode_map[0x3A55] = 0x7815; unicode_map[0x3A56] = 0x7826; unicode_map[0x3A57] = 0x796D; unicode_map[0x3A58] = 0x658E; unicode_map[0x3A59] = 0x7D30; unicode_map[0x3A5A] = 0x83DC; unicode_map[0x3A5B] = 0x88C1; unicode_map[0x3A5C] = 0x8F09; unicode_map[0x3A5D] = 0x969B; unicode_map[0x3A5E] = 0x5264; unicode_map[0x3A5F] = 0x5728; unicode_map[0x3A60] = 0x6750; unicode_map[0x3A61] = 0x7F6A; unicode_map[0x3A62] = 0x8CA1; unicode_map[0x3A63] = 0x51B4; unicode_map[0x3A64] = 0x5742; unicode_map[0x3A65] = 0x962A; unicode_map[0x3A66] = 0x583A; unicode_map[0x3A67] = 0x698A; unicode_map[0x3A68] = 0x80B4; unicode_map[0x3A69] = 0x54B2; unicode_map[0x3A6A] = 0x5D0E; unicode_map[0x3A6B] = 0x57FC; unicode_map[0x3A6C] = 0x7895; unicode_map[0x3A6D] = 0x9DFA; unicode_map[0x3A6E] = 0x4F5C; unicode_map[0x3A6F] = 0x524A; unicode_map[0x3A70] = 0x548B; unicode_map[0x3A71] = 0x643E; unicode_map[0x3A72] = 0x6628; unicode_map[0x3A73] = 0x6714; unicode_map[0x3A74] = 0x67F5; unicode_map[0x3A75] = 0x7A84; unicode_map[0x3A76] = 0x7B56; unicode_map[0x3A77] = 0x7D22; unicode_map[0x3A78] = 0x932F; unicode_map[0x3A79] = 0x685C; unicode_map[0x3A7A] = 0x9BAD; unicode_map[0x3A7B] = 0x7B39; unicode_map[0x3A7C] = 0x5319; unicode_map[0x3A7D] = 0x518A; unicode_map[0x3A7E] = 0x5237; unicode_map[0x3B21] = 0x5BDF; unicode_map[0x3B22] = 0x62F6; unicode_map[0x3B23] = 0x64AE; unicode_map[0x3B24] = 0x64E6; unicode_map[0x3B25] = 0x672D; unicode_map[0x3B26] = 0x6BBA; unicode_map[0x3B27] = 0x85A9; unicode_map[0x3B28] = 0x96D1; unicode_map[0x3B29] = 0x7690; unicode_map[0x3B2A] = 0x9BD6; unicode_map[0x3B2B] = 0x634C; unicode_map[0x3B2C] = 0x9306; unicode_map[0x3B2D] = 0x9BAB; unicode_map[0x3B2E] = 0x76BF; unicode_map[0x3B2F] = 0x6652; unicode_map[0x3B30] = 0x4E09; unicode_map[0x3B31] = 0x5098; unicode_map[0x3B32] = 0x53C2; unicode_map[0x3B33] = 0x5C71; unicode_map[0x3B34] = 0x60E8; unicode_map[0x3B35] = 0x6492; unicode_map[0x3B36] = 0x6563; unicode_map[0x3B37] = 0x685F; unicode_map[0x3B38] = 0x71E6; unicode_map[0x3B39] = 0x73CA; unicode_map[0x3B3A] = 0x7523; unicode_map[0x3B3B] = 0x7B97; unicode_map[0x3B3C] = 0x7E82; unicode_map[0x3B3D] = 0x8695; unicode_map[0x3B3E] = 0x8B83; unicode_map[0x3B3F] = 0x8CDB; unicode_map[0x3B40] = 0x9178; unicode_map[0x3B41] = 0x9910; unicode_map[0x3B42] = 0x65AC; unicode_map[0x3B43] = 0x66AB; unicode_map[0x3B44] = 0x6B8B; unicode_map[0x3B45] = 0x4ED5; unicode_map[0x3B46] = 0x4ED4; unicode_map[0x3B47] = 0x4F3A; unicode_map[0x3B48] = 0x4F7F; unicode_map[0x3B49] = 0x523A; unicode_map[0x3B4A] = 0x53F8; unicode_map[0x3B4B] = 0x53F2; unicode_map[0x3B4C] = 0x55E3; unicode_map[0x3B4D] = 0x56DB; unicode_map[0x3B4E] = 0x58EB; unicode_map[0x3B4F] = 0x59CB; unicode_map[0x3B50] = 0x59C9; unicode_map[0x3B51] = 0x59FF; unicode_map[0x3B52] = 0x5B50; unicode_map[0x3B53] = 0x5C4D; unicode_map[0x3B54] = 0x5E02; unicode_map[0x3B55] = 0x5E2B; unicode_map[0x3B56] = 0x5FD7; unicode_map[0x3B57] = 0x601D; unicode_map[0x3B58] = 0x6307; unicode_map[0x3B59] = 0x652F; unicode_map[0x3B5A] = 0x5B5C; unicode_map[0x3B5B] = 0x65AF; unicode_map[0x3B5C] = 0x65BD; unicode_map[0x3B5D] = 0x65E8; unicode_map[0x3B5E] = 0x679D; unicode_map[0x3B5F] = 0x6B62; unicode_map[0x3B60] = 0x6B7B; unicode_map[0x3B61] = 0x6C0F; unicode_map[0x3B62] = 0x7345; unicode_map[0x3B63] = 0x7949; unicode_map[0x3B64] = 0x79C1; unicode_map[0x3B65] = 0x7CF8; unicode_map[0x3B66] = 0x7D19; unicode_map[0x3B67] = 0x7D2B; unicode_map[0x3B68] = 0x80A2; unicode_map[0x3B69] = 0x8102; unicode_map[0x3B6A] = 0x81F3; unicode_map[0x3B6B] = 0x8996; unicode_map[0x3B6C] = 0x8A5E; unicode_map[0x3B6D] = 0x8A69; unicode_map[0x3B6E] = 0x8A66; unicode_map[0x3B6F] = 0x8A8C; unicode_map[0x3B70] = 0x8AEE; unicode_map[0x3B71] = 0x8CC7; unicode_map[0x3B72] = 0x8CDC; unicode_map[0x3B73] = 0x96CC; unicode_map[0x3B74] = 0x98FC; unicode_map[0x3B75] = 0x6B6F; unicode_map[0x3B76] = 0x4E8B; unicode_map[0x3B77] = 0x4F3C; unicode_map[0x3B78] = 0x4F8D; unicode_map[0x3B79] = 0x5150; unicode_map[0x3B7A] = 0x5B57; unicode_map[0x3B7B] = 0x5BFA; unicode_map[0x3B7C] = 0x6148; unicode_map[0x3B7D] = 0x6301; unicode_map[0x3B7E] = 0x6642; unicode_map[0x3C21] = 0x6B21; unicode_map[0x3C22] = 0x6ECB; unicode_map[0x3C23] = 0x6CBB; unicode_map[0x3C24] = 0x723E; unicode_map[0x3C25] = 0x74BD; unicode_map[0x3C26] = 0x75D4; unicode_map[0x3C27] = 0x78C1; unicode_map[0x3C28] = 0x793A; unicode_map[0x3C29] = 0x800C; unicode_map[0x3C2A] = 0x8033; unicode_map[0x3C2B] = 0x81EA; unicode_map[0x3C2C] = 0x8494; unicode_map[0x3C2D] = 0x8F9E; unicode_map[0x3C2E] = 0x6C50; unicode_map[0x3C2F] = 0x9E7F; unicode_map[0x3C30] = 0x5F0F; unicode_map[0x3C31] = 0x8B58; unicode_map[0x3C32] = 0x9D2B; unicode_map[0x3C33] = 0x7AFA; unicode_map[0x3C34] = 0x8EF8; unicode_map[0x3C35] = 0x5B8D; unicode_map[0x3C36] = 0x96EB; unicode_map[0x3C37] = 0x4E03; unicode_map[0x3C38] = 0x53F1; unicode_map[0x3C39] = 0x57F7; unicode_map[0x3C3A] = 0x5931; unicode_map[0x3C3B] = 0x5AC9; unicode_map[0x3C3C] = 0x5BA4; unicode_map[0x3C3D] = 0x6089; unicode_map[0x3C3E] = 0x6E7F; unicode_map[0x3C3F] = 0x6F06; unicode_map[0x3C40] = 0x75BE; unicode_map[0x3C41] = 0x8CEA; unicode_map[0x3C42] = 0x5B9F; unicode_map[0x3C43] = 0x8500; unicode_map[0x3C44] = 0x7BE0; unicode_map[0x3C45] = 0x5072; unicode_map[0x3C46] = 0x67F4; unicode_map[0x3C47] = 0x829D; unicode_map[0x3C48] = 0x5C61; unicode_map[0x3C49] = 0x854A; unicode_map[0x3C4A] = 0x7E1E; unicode_map[0x3C4B] = 0x820E; unicode_map[0x3C4C] = 0x5199; unicode_map[0x3C4D] = 0x5C04; unicode_map[0x3C4E] = 0x6368; unicode_map[0x3C4F] = 0x8D66; unicode_map[0x3C50] = 0x659C; unicode_map[0x3C51] = 0x716E; unicode_map[0x3C52] = 0x793E; unicode_map[0x3C53] = 0x7D17; unicode_map[0x3C54] = 0x8005; unicode_map[0x3C55] = 0x8B1D; unicode_map[0x3C56] = 0x8ECA; unicode_map[0x3C57] = 0x906E; unicode_map[0x3C58] = 0x86C7; unicode_map[0x3C59] = 0x90AA; unicode_map[0x3C5A] = 0x501F; unicode_map[0x3C5B] = 0x52FA; unicode_map[0x3C5C] = 0x5C3A; unicode_map[0x3C5D] = 0x6753; unicode_map[0x3C5E] = 0x707C; unicode_map[0x3C5F] = 0x7235; unicode_map[0x3C60] = 0x914C; unicode_map[0x3C61] = 0x91C8; unicode_map[0x3C62] = 0x932B; unicode_map[0x3C63] = 0x82E5; unicode_map[0x3C64] = 0x5BC2; unicode_map[0x3C65] = 0x5F31; unicode_map[0x3C66] = 0x60F9; unicode_map[0x3C67] = 0x4E3B; unicode_map[0x3C68] = 0x53D6; unicode_map[0x3C69] = 0x5B88; unicode_map[0x3C6A] = 0x624B; unicode_map[0x3C6B] = 0x6731; unicode_map[0x3C6C] = 0x6B8A; unicode_map[0x3C6D] = 0x72E9; unicode_map[0x3C6E] = 0x73E0; unicode_map[0x3C6F] = 0x7A2E; unicode_map[0x3C70] = 0x816B; unicode_map[0x3C71] = 0x8DA3; unicode_map[0x3C72] = 0x9152; unicode_map[0x3C73] = 0x9996; unicode_map[0x3C74] = 0x5112; unicode_map[0x3C75] = 0x53D7; unicode_map[0x3C76] = 0x546A; unicode_map[0x3C77] = 0x5BFF; unicode_map[0x3C78] = 0x6388; unicode_map[0x3C79] = 0x6A39; unicode_map[0x3C7A] = 0x7DAC; unicode_map[0x3C7B] = 0x9700; unicode_map[0x3C7C] = 0x56DA; unicode_map[0x3C7D] = 0x53CE; unicode_map[0x3C7E] = 0x5468; unicode_map[0x3D21] = 0x5B97; unicode_map[0x3D22] = 0x5C31; unicode_map[0x3D23] = 0x5DDE; unicode_map[0x3D24] = 0x4FEE; unicode_map[0x3D25] = 0x6101; unicode_map[0x3D26] = 0x62FE; unicode_map[0x3D27] = 0x6D32; unicode_map[0x3D28] = 0x79C0; unicode_map[0x3D29] = 0x79CB; unicode_map[0x3D2A] = 0x7D42; unicode_map[0x3D2B] = 0x7E4D; unicode_map[0x3D2C] = 0x7FD2; unicode_map[0x3D2D] = 0x81ED; unicode_map[0x3D2E] = 0x821F; unicode_map[0x3D2F] = 0x8490; unicode_map[0x3D30] = 0x8846; unicode_map[0x3D31] = 0x8972; unicode_map[0x3D32] = 0x8B90; unicode_map[0x3D33] = 0x8E74; unicode_map[0x3D34] = 0x8F2F; unicode_map[0x3D35] = 0x9031; unicode_map[0x3D36] = 0x914B; unicode_map[0x3D37] = 0x916C; unicode_map[0x3D38] = 0x96C6; unicode_map[0x3D39] = 0x919C; unicode_map[0x3D3A] = 0x4EC0; unicode_map[0x3D3B] = 0x4F4F; unicode_map[0x3D3C] = 0x5145; unicode_map[0x3D3D] = 0x5341; unicode_map[0x3D3E] = 0x5F93; unicode_map[0x3D3F] = 0x620E; unicode_map[0x3D40] = 0x67D4; unicode_map[0x3D41] = 0x6C41; unicode_map[0x3D42] = 0x6E0B; unicode_map[0x3D43] = 0x7363; unicode_map[0x3D44] = 0x7E26; unicode_map[0x3D45] = 0x91CD; unicode_map[0x3D46] = 0x9283; unicode_map[0x3D47] = 0x53D4; unicode_map[0x3D48] = 0x5919; unicode_map[0x3D49] = 0x5BBF; unicode_map[0x3D4A] = 0x6DD1; unicode_map[0x3D4B] = 0x795D; unicode_map[0x3D4C] = 0x7E2E; unicode_map[0x3D4D] = 0x7C9B; unicode_map[0x3D4E] = 0x587E; unicode_map[0x3D4F] = 0x719F; unicode_map[0x3D50] = 0x51FA; unicode_map[0x3D51] = 0x8853; unicode_map[0x3D52] = 0x8FF0; unicode_map[0x3D53] = 0x4FCA; unicode_map[0x3D54] = 0x5CFB; unicode_map[0x3D55] = 0x6625; unicode_map[0x3D56] = 0x77AC; unicode_map[0x3D57] = 0x7AE3; unicode_map[0x3D58] = 0x821C; unicode_map[0x3D59] = 0x99FF; unicode_map[0x3D5A] = 0x51C6; unicode_map[0x3D5B] = 0x5FAA; unicode_map[0x3D5C] = 0x65EC; unicode_map[0x3D5D] = 0x696F; unicode_map[0x3D5E] = 0x6B89; unicode_map[0x3D5F] = 0x6DF3; unicode_map[0x3D60] = 0x6E96; unicode_map[0x3D61] = 0x6F64; unicode_map[0x3D62] = 0x76FE; unicode_map[0x3D63] = 0x7D14; unicode_map[0x3D64] = 0x5DE1; unicode_map[0x3D65] = 0x9075; unicode_map[0x3D66] = 0x9187; unicode_map[0x3D67] = 0x9806; unicode_map[0x3D68] = 0x51E6; unicode_map[0x3D69] = 0x521D; unicode_map[0x3D6A] = 0x6240; unicode_map[0x3D6B] = 0x6691; unicode_map[0x3D6C] = 0x66D9; unicode_map[0x3D6D] = 0x6E1A; unicode_map[0x3D6E] = 0x5EB6; unicode_map[0x3D6F] = 0x7DD2; unicode_map[0x3D70] = 0x7F72; unicode_map[0x3D71] = 0x66F8; unicode_map[0x3D72] = 0x85AF; unicode_map[0x3D73] = 0x85F7; unicode_map[0x3D74] = 0x8AF8; unicode_map[0x3D75] = 0x52A9; unicode_map[0x3D76] = 0x53D9; unicode_map[0x3D77] = 0x5973; unicode_map[0x3D78] = 0x5E8F; unicode_map[0x3D79] = 0x5F90; unicode_map[0x3D7A] = 0x6055; unicode_map[0x3D7B] = 0x92E4; unicode_map[0x3D7C] = 0x9664; unicode_map[0x3D7D] = 0x50B7; unicode_map[0x3D7E] = 0x511F; unicode_map[0x3E21] = 0x52DD; unicode_map[0x3E22] = 0x5320; unicode_map[0x3E23] = 0x5347; unicode_map[0x3E24] = 0x53EC; unicode_map[0x3E25] = 0x54E8; unicode_map[0x3E26] = 0x5546; unicode_map[0x3E27] = 0x5531; unicode_map[0x3E28] = 0x5617; unicode_map[0x3E29] = 0x5968; unicode_map[0x3E2A] = 0x59BE; unicode_map[0x3E2B] = 0x5A3C; unicode_map[0x3E2C] = 0x5BB5; unicode_map[0x3E2D] = 0x5C06; unicode_map[0x3E2E] = 0x5C0F; unicode_map[0x3E2F] = 0x5C11; unicode_map[0x3E30] = 0x5C1A; unicode_map[0x3E31] = 0x5E84; unicode_map[0x3E32] = 0x5E8A; unicode_map[0x3E33] = 0x5EE0; unicode_map[0x3E34] = 0x5F70; unicode_map[0x3E35] = 0x627F; unicode_map[0x3E36] = 0x6284; unicode_map[0x3E37] = 0x62DB; unicode_map[0x3E38] = 0x638C; unicode_map[0x3E39] = 0x6377; unicode_map[0x3E3A] = 0x6607; unicode_map[0x3E3B] = 0x660C; unicode_map[0x3E3C] = 0x662D; unicode_map[0x3E3D] = 0x6676; unicode_map[0x3E3E] = 0x677E; unicode_map[0x3E3F] = 0x68A2; unicode_map[0x3E40] = 0x6A1F; unicode_map[0x3E41] = 0x6A35; unicode_map[0x3E42] = 0x6CBC; unicode_map[0x3E43] = 0x6D88; unicode_map[0x3E44] = 0x6E09; unicode_map[0x3E45] = 0x6E58; unicode_map[0x3E46] = 0x713C; unicode_map[0x3E47] = 0x7126; unicode_map[0x3E48] = 0x7167; unicode_map[0x3E49] = 0x75C7; unicode_map[0x3E4A] = 0x7701; unicode_map[0x3E4B] = 0x785D; unicode_map[0x3E4C] = 0x7901; unicode_map[0x3E4D] = 0x7965; unicode_map[0x3E4E] = 0x79F0; unicode_map[0x3E4F] = 0x7AE0; unicode_map[0x3E50] = 0x7B11; unicode_map[0x3E51] = 0x7CA7; unicode_map[0x3E52] = 0x7D39; unicode_map[0x3E53] = 0x8096; unicode_map[0x3E54] = 0x83D6; unicode_map[0x3E55] = 0x848B; unicode_map[0x3E56] = 0x8549; unicode_map[0x3E57] = 0x885D; unicode_map[0x3E58] = 0x88F3; unicode_map[0x3E59] = 0x8A1F; unicode_map[0x3E5A] = 0x8A3C; unicode_map[0x3E5B] = 0x8A54; unicode_map[0x3E5C] = 0x8A73; unicode_map[0x3E5D] = 0x8C61; unicode_map[0x3E5E] = 0x8CDE; unicode_map[0x3E5F] = 0x91A4; unicode_map[0x3E60] = 0x9266; unicode_map[0x3E61] = 0x937E; unicode_map[0x3E62] = 0x9418; unicode_map[0x3E63] = 0x969C; unicode_map[0x3E64] = 0x9798; unicode_map[0x3E65] = 0x4E0A; unicode_map[0x3E66] = 0x4E08; unicode_map[0x3E67] = 0x4E1E; unicode_map[0x3E68] = 0x4E57; unicode_map[0x3E69] = 0x5197; unicode_map[0x3E6A] = 0x5270; unicode_map[0x3E6B] = 0x57CE; unicode_map[0x3E6C] = 0x5834; unicode_map[0x3E6D] = 0x58CC; unicode_map[0x3E6E] = 0x5B22; unicode_map[0x3E6F] = 0x5E38; unicode_map[0x3E70] = 0x60C5; unicode_map[0x3E71] = 0x64FE; unicode_map[0x3E72] = 0x6761; unicode_map[0x3E73] = 0x6756; unicode_map[0x3E74] = 0x6D44; unicode_map[0x3E75] = 0x72B6; unicode_map[0x3E76] = 0x7573; unicode_map[0x3E77] = 0x7A63; unicode_map[0x3E78] = 0x84B8; unicode_map[0x3E79] = 0x8B72; unicode_map[0x3E7A] = 0x91B8; unicode_map[0x3E7B] = 0x9320; unicode_map[0x3E7C] = 0x5631; unicode_map[0x3E7D] = 0x57F4; unicode_map[0x3E7E] = 0x98FE; unicode_map[0x3F21] = 0x62ED; unicode_map[0x3F22] = 0x690D; unicode_map[0x3F23] = 0x6B96; unicode_map[0x3F24] = 0x71ED; unicode_map[0x3F25] = 0x7E54; unicode_map[0x3F26] = 0x8077; unicode_map[0x3F27] = 0x8272; unicode_map[0x3F28] = 0x89E6; unicode_map[0x3F29] = 0x98DF; unicode_map[0x3F2A] = 0x8755; unicode_map[0x3F2B] = 0x8FB1; unicode_map[0x3F2C] = 0x5C3B; unicode_map[0x3F2D] = 0x4F38; unicode_map[0x3F2E] = 0x4FE1; unicode_map[0x3F2F] = 0x4FB5; unicode_map[0x3F30] = 0x5507; unicode_map[0x3F31] = 0x5A20; unicode_map[0x3F32] = 0x5BDD; unicode_map[0x3F33] = 0x5BE9; unicode_map[0x3F34] = 0x5FC3; unicode_map[0x3F35] = 0x614E; unicode_map[0x3F36] = 0x632F; unicode_map[0x3F37] = 0x65B0; unicode_map[0x3F38] = 0x664B; unicode_map[0x3F39] = 0x68EE; unicode_map[0x3F3A] = 0x699B; unicode_map[0x3F3B] = 0x6D78; unicode_map[0x3F3C] = 0x6DF1; unicode_map[0x3F3D] = 0x7533; unicode_map[0x3F3E] = 0x75B9; unicode_map[0x3F3F] = 0x771F; unicode_map[0x3F40] = 0x795E; unicode_map[0x3F41] = 0x79E6; unicode_map[0x3F42] = 0x7D33; unicode_map[0x3F43] = 0x81E3; unicode_map[0x3F44] = 0x82AF; unicode_map[0x3F45] = 0x85AA; unicode_map[0x3F46] = 0x89AA; unicode_map[0x3F47] = 0x8A3A; unicode_map[0x3F48] = 0x8EAB; unicode_map[0x3F49] = 0x8F9B; unicode_map[0x3F4A] = 0x9032; unicode_map[0x3F4B] = 0x91DD; unicode_map[0x3F4C] = 0x9707; unicode_map[0x3F4D] = 0x4EBA; unicode_map[0x3F4E] = 0x4EC1; unicode_map[0x3F4F] = 0x5203; unicode_map[0x3F50] = 0x5875; unicode_map[0x3F51] = 0x58EC; unicode_map[0x3F52] = 0x5C0B; unicode_map[0x3F53] = 0x751A; unicode_map[0x3F54] = 0x5C3D; unicode_map[0x3F55] = 0x814E; unicode_map[0x3F56] = 0x8A0A; unicode_map[0x3F57] = 0x8FC5; unicode_map[0x3F58] = 0x9663; unicode_map[0x3F59] = 0x976D; unicode_map[0x3F5A] = 0x7B25; unicode_map[0x3F5B] = 0x8ACF; unicode_map[0x3F5C] = 0x9808; unicode_map[0x3F5D] = 0x9162; unicode_map[0x3F5E] = 0x56F3; unicode_map[0x3F5F] = 0x53A8; unicode_map[0x3F60] = 0x9017; unicode_map[0x3F61] = 0x5439; unicode_map[0x3F62] = 0x5782; unicode_map[0x3F63] = 0x5E25; unicode_map[0x3F64] = 0x63A8; unicode_map[0x3F65] = 0x6C34; unicode_map[0x3F66] = 0x708A; unicode_map[0x3F67] = 0x7761; unicode_map[0x3F68] = 0x7C8B; unicode_map[0x3F69] = 0x7FE0; unicode_map[0x3F6A] = 0x8870; unicode_map[0x3F6B] = 0x9042; unicode_map[0x3F6C] = 0x9154; unicode_map[0x3F6D] = 0x9310; unicode_map[0x3F6E] = 0x9318; unicode_map[0x3F6F] = 0x968F; unicode_map[0x3F70] = 0x745E; unicode_map[0x3F71] = 0x9AC4; unicode_map[0x3F72] = 0x5D07; unicode_map[0x3F73] = 0x5D69; unicode_map[0x3F74] = 0x6570; unicode_map[0x3F75] = 0x67A2; unicode_map[0x3F76] = 0x8DA8; unicode_map[0x3F77] = 0x96DB; unicode_map[0x3F78] = 0x636E; unicode_map[0x3F79] = 0x6749; unicode_map[0x3F7A] = 0x6919; unicode_map[0x3F7B] = 0x83C5; unicode_map[0x3F7C] = 0x9817; unicode_map[0x3F7D] = 0x96C0; unicode_map[0x3F7E] = 0x88FE; unicode_map[0x4021] = 0x6F84; unicode_map[0x4022] = 0x647A; unicode_map[0x4023] = 0x5BF8; unicode_map[0x4024] = 0x4E16; unicode_map[0x4025] = 0x702C; unicode_map[0x4026] = 0x755D; unicode_map[0x4027] = 0x662F; unicode_map[0x4028] = 0x51C4; unicode_map[0x4029] = 0x5236; unicode_map[0x402A] = 0x52E2; unicode_map[0x402B] = 0x59D3; unicode_map[0x402C] = 0x5F81; unicode_map[0x402D] = 0x6027; unicode_map[0x402E] = 0x6210; unicode_map[0x402F] = 0x653F; unicode_map[0x4030] = 0x6574; unicode_map[0x4031] = 0x661F; unicode_map[0x4032] = 0x6674; unicode_map[0x4033] = 0x68F2; unicode_map[0x4034] = 0x6816; unicode_map[0x4035] = 0x6B63; unicode_map[0x4036] = 0x6E05; unicode_map[0x4037] = 0x7272; unicode_map[0x4038] = 0x751F; unicode_map[0x4039] = 0x76DB; unicode_map[0x403A] = 0x7CBE; unicode_map[0x403B] = 0x8056; unicode_map[0x403C] = 0x58F0; unicode_map[0x403D] = 0x88FD; unicode_map[0x403E] = 0x897F; unicode_map[0x403F] = 0x8AA0; unicode_map[0x4040] = 0x8A93; unicode_map[0x4041] = 0x8ACB; unicode_map[0x4042] = 0x901D; unicode_map[0x4043] = 0x9192; unicode_map[0x4044] = 0x9752; unicode_map[0x4045] = 0x9759; unicode_map[0x4046] = 0x6589; unicode_map[0x4047] = 0x7A0E; unicode_map[0x4048] = 0x8106; unicode_map[0x4049] = 0x96BB; unicode_map[0x404A] = 0x5E2D; unicode_map[0x404B] = 0x60DC; unicode_map[0x404C] = 0x621A; unicode_map[0x404D] = 0x65A5; unicode_map[0x404E] = 0x6614; unicode_map[0x404F] = 0x6790; unicode_map[0x4050] = 0x77F3; unicode_map[0x4051] = 0x7A4D; unicode_map[0x4052] = 0x7C4D; unicode_map[0x4053] = 0x7E3E; unicode_map[0x4054] = 0x810A; unicode_map[0x4055] = 0x8CAC; unicode_map[0x4056] = 0x8D64; unicode_map[0x4057] = 0x8DE1; unicode_map[0x4058] = 0x8E5F; unicode_map[0x4059] = 0x78A9; unicode_map[0x405A] = 0x5207; unicode_map[0x405B] = 0x62D9; unicode_map[0x405C] = 0x63A5; unicode_map[0x405D] = 0x6442; unicode_map[0x405E] = 0x6298; unicode_map[0x405F] = 0x8A2D; unicode_map[0x4060] = 0x7A83; unicode_map[0x4061] = 0x7BC0; unicode_map[0x4062] = 0x8AAC; unicode_map[0x4063] = 0x96EA; unicode_map[0x4064] = 0x7D76; unicode_map[0x4065] = 0x820C; unicode_map[0x4066] = 0x8749; unicode_map[0x4067] = 0x4ED9; unicode_map[0x4068] = 0x5148; unicode_map[0x4069] = 0x5343; unicode_map[0x406A] = 0x5360; unicode_map[0x406B] = 0x5BA3; unicode_map[0x406C] = 0x5C02; unicode_map[0x406D] = 0x5C16; unicode_map[0x406E] = 0x5DDD; unicode_map[0x406F] = 0x6226; unicode_map[0x4070] = 0x6247; unicode_map[0x4071] = 0x64B0; unicode_map[0x4072] = 0x6813; unicode_map[0x4073] = 0x6834; unicode_map[0x4074] = 0x6CC9; unicode_map[0x4075] = 0x6D45; unicode_map[0x4076] = 0x6D17; unicode_map[0x4077] = 0x67D3; unicode_map[0x4078] = 0x6F5C; unicode_map[0x4079] = 0x714E; unicode_map[0x407A] = 0x717D; unicode_map[0x407B] = 0x65CB; unicode_map[0x407C] = 0x7A7F; unicode_map[0x407D] = 0x7BAD; unicode_map[0x407E] = 0x7DDA; unicode_map[0x4121] = 0x7E4A; unicode_map[0x4122] = 0x7FA8; unicode_map[0x4123] = 0x817A; unicode_map[0x4124] = 0x821B; unicode_map[0x4125] = 0x8239; unicode_map[0x4126] = 0x85A6; unicode_map[0x4127] = 0x8A6E; unicode_map[0x4128] = 0x8CCE; unicode_map[0x4129] = 0x8DF5; unicode_map[0x412A] = 0x9078; unicode_map[0x412B] = 0x9077; unicode_map[0x412C] = 0x92AD; unicode_map[0x412D] = 0x9291; unicode_map[0x412E] = 0x9583; unicode_map[0x412F] = 0x9BAE; unicode_map[0x4130] = 0x524D; unicode_map[0x4131] = 0x5584; unicode_map[0x4132] = 0x6F38; unicode_map[0x4133] = 0x7136; unicode_map[0x4134] = 0x5168; unicode_map[0x4135] = 0x7985; unicode_map[0x4136] = 0x7E55; unicode_map[0x4137] = 0x81B3; unicode_map[0x4138] = 0x7CCE; unicode_map[0x4139] = 0x564C; unicode_map[0x413A] = 0x5851; unicode_map[0x413B] = 0x5CA8; unicode_map[0x413C] = 0x63AA; unicode_map[0x413D] = 0x66FE; unicode_map[0x413E] = 0x66FD; unicode_map[0x413F] = 0x695A; unicode_map[0x4140] = 0x72D9; unicode_map[0x4141] = 0x758F; unicode_map[0x4142] = 0x758E; unicode_map[0x4143] = 0x790E; unicode_map[0x4144] = 0x7956; unicode_map[0x4145] = 0x79DF; unicode_map[0x4146] = 0x7C97; unicode_map[0x4147] = 0x7D20; unicode_map[0x4148] = 0x7D44; unicode_map[0x4149] = 0x8607; unicode_map[0x414A] = 0x8A34; unicode_map[0x414B] = 0x963B; unicode_map[0x414C] = 0x9061; unicode_map[0x414D] = 0x9F20; unicode_map[0x414E] = 0x50E7; unicode_map[0x414F] = 0x5275; unicode_map[0x4150] = 0x53CC; unicode_map[0x4151] = 0x53E2; unicode_map[0x4152] = 0x5009; unicode_map[0x4153] = 0x55AA; unicode_map[0x4154] = 0x58EE; unicode_map[0x4155] = 0x594F; unicode_map[0x4156] = 0x723D; unicode_map[0x4157] = 0x5B8B; unicode_map[0x4158] = 0x5C64; unicode_map[0x4159] = 0x531D; unicode_map[0x415A] = 0x60E3; unicode_map[0x415B] = 0x60F3; unicode_map[0x415C] = 0x635C; unicode_map[0x415D] = 0x6383; unicode_map[0x415E] = 0x633F; unicode_map[0x415F] = 0x63BB; unicode_map[0x4160] = 0x64CD; unicode_map[0x4161] = 0x65E9; unicode_map[0x4162] = 0x66F9; unicode_map[0x4163] = 0x5DE3; unicode_map[0x4164] = 0x69CD; unicode_map[0x4165] = 0x69FD; unicode_map[0x4166] = 0x6F15; unicode_map[0x4167] = 0x71E5; unicode_map[0x4168] = 0x4E89; unicode_map[0x4169] = 0x75E9; unicode_map[0x416A] = 0x76F8; unicode_map[0x416B] = 0x7A93; unicode_map[0x416C] = 0x7CDF; unicode_map[0x416D] = 0x7DCF; unicode_map[0x416E] = 0x7D9C; unicode_map[0x416F] = 0x8061; unicode_map[0x4170] = 0x8349; unicode_map[0x4171] = 0x8358; unicode_map[0x4172] = 0x846C; unicode_map[0x4173] = 0x84BC; unicode_map[0x4174] = 0x85FB; unicode_map[0x4175] = 0x88C5; unicode_map[0x4176] = 0x8D70; unicode_map[0x4177] = 0x9001; unicode_map[0x4178] = 0x906D; unicode_map[0x4179] = 0x9397; unicode_map[0x417A] = 0x971C; unicode_map[0x417B] = 0x9A12; unicode_map[0x417C] = 0x50CF; unicode_map[0x417D] = 0x5897; unicode_map[0x417E] = 0x618E; unicode_map[0x4221] = 0x81D3; unicode_map[0x4222] = 0x8535; unicode_map[0x4223] = 0x8D08; unicode_map[0x4224] = 0x9020; unicode_map[0x4225] = 0x4FC3; unicode_map[0x4226] = 0x5074; unicode_map[0x4227] = 0x5247; unicode_map[0x4228] = 0x5373; unicode_map[0x4229] = 0x606F; unicode_map[0x422A] = 0x6349; unicode_map[0x422B] = 0x675F; unicode_map[0x422C] = 0x6E2C; unicode_map[0x422D] = 0x8DB3; unicode_map[0x422E] = 0x901F; unicode_map[0x422F] = 0x4FD7; unicode_map[0x4230] = 0x5C5E; unicode_map[0x4231] = 0x8CCA; unicode_map[0x4232] = 0x65CF; unicode_map[0x4233] = 0x7D9A; unicode_map[0x4234] = 0x5352; unicode_map[0x4235] = 0x8896; unicode_map[0x4236] = 0x5176; unicode_map[0x4237] = 0x63C3; unicode_map[0x4238] = 0x5B58; unicode_map[0x4239] = 0x5B6B; unicode_map[0x423A] = 0x5C0A; unicode_map[0x423B] = 0x640D; unicode_map[0x423C] = 0x6751; unicode_map[0x423D] = 0x905C; unicode_map[0x423E] = 0x4ED6; unicode_map[0x423F] = 0x591A; unicode_map[0x4240] = 0x592A; unicode_map[0x4241] = 0x6C70; unicode_map[0x4242] = 0x8A51; unicode_map[0x4243] = 0x553E; unicode_map[0x4244] = 0x5815; unicode_map[0x4245] = 0x59A5; unicode_map[0x4246] = 0x60F0; unicode_map[0x4247] = 0x6253; unicode_map[0x4248] = 0x67C1; unicode_map[0x4249] = 0x8235; unicode_map[0x424A] = 0x6955; unicode_map[0x424B] = 0x9640; unicode_map[0x424C] = 0x99C4; unicode_map[0x424D] = 0x9A28; unicode_map[0x424E] = 0x4F53; unicode_map[0x424F] = 0x5806; unicode_map[0x4250] = 0x5BFE; unicode_map[0x4251] = 0x8010; unicode_map[0x4252] = 0x5CB1; unicode_map[0x4253] = 0x5E2F; unicode_map[0x4254] = 0x5F85; unicode_map[0x4255] = 0x6020; unicode_map[0x4256] = 0x614B; unicode_map[0x4257] = 0x6234; unicode_map[0x4258] = 0x66FF; unicode_map[0x4259] = 0x6CF0; unicode_map[0x425A] = 0x6EDE; unicode_map[0x425B] = 0x80CE; unicode_map[0x425C] = 0x817F; unicode_map[0x425D] = 0x82D4; unicode_map[0x425E] = 0x888B; unicode_map[0x425F] = 0x8CB8; unicode_map[0x4260] = 0x9000; unicode_map[0x4261] = 0x902E; unicode_map[0x4262] = 0x968A; unicode_map[0x4263] = 0x9EDB; unicode_map[0x4264] = 0x9BDB; unicode_map[0x4265] = 0x4EE3; unicode_map[0x4266] = 0x53F0; unicode_map[0x4267] = 0x5927; unicode_map[0x4268] = 0x7B2C; unicode_map[0x4269] = 0x918D; unicode_map[0x426A] = 0x984C; unicode_map[0x426B] = 0x9DF9; unicode_map[0x426C] = 0x6EDD; unicode_map[0x426D] = 0x7027; unicode_map[0x426E] = 0x5353; unicode_map[0x426F] = 0x5544; unicode_map[0x4270] = 0x5B85; unicode_map[0x4271] = 0x6258; unicode_map[0x4272] = 0x629E; unicode_map[0x4273] = 0x62D3; unicode_map[0x4274] = 0x6CA2; unicode_map[0x4275] = 0x6FEF; unicode_map[0x4276] = 0x7422; unicode_map[0x4277] = 0x8A17; unicode_map[0x4278] = 0x9438; unicode_map[0x4279] = 0x6FC1; unicode_map[0x427A] = 0x8AFE; unicode_map[0x427B] = 0x8338; unicode_map[0x427C] = 0x51E7; unicode_map[0x427D] = 0x86F8; unicode_map[0x427E] = 0x53EA; unicode_map[0x4321] = 0x53E9; unicode_map[0x4322] = 0x4F46; unicode_map[0x4323] = 0x9054; unicode_map[0x4324] = 0x8FB0; unicode_map[0x4325] = 0x596A; unicode_map[0x4326] = 0x8131; unicode_map[0x4327] = 0x5DFD; unicode_map[0x4328] = 0x7AEA; unicode_map[0x4329] = 0x8FBF; unicode_map[0x432A] = 0x68DA; unicode_map[0x432B] = 0x8C37; unicode_map[0x432C] = 0x72F8; unicode_map[0x432D] = 0x9C48; unicode_map[0x432E] = 0x6A3D; unicode_map[0x432F] = 0x8AB0; unicode_map[0x4330] = 0x4E39; unicode_map[0x4331] = 0x5358; unicode_map[0x4332] = 0x5606; unicode_map[0x4333] = 0x5766; unicode_map[0x4334] = 0x62C5; unicode_map[0x4335] = 0x63A2; unicode_map[0x4336] = 0x65E6; unicode_map[0x4337] = 0x6B4E; unicode_map[0x4338] = 0x6DE1; unicode_map[0x4339] = 0x6E5B; unicode_map[0x433A] = 0x70AD; unicode_map[0x433B] = 0x77ED; unicode_map[0x433C] = 0x7AEF; unicode_map[0x433D] = 0x7BAA; unicode_map[0x433E] = 0x7DBB; unicode_map[0x433F] = 0x803D; unicode_map[0x4340] = 0x80C6; unicode_map[0x4341] = 0x86CB; unicode_map[0x4342] = 0x8A95; unicode_map[0x4343] = 0x935B; unicode_map[0x4344] = 0x56E3; unicode_map[0x4345] = 0x58C7; unicode_map[0x4346] = 0x5F3E; unicode_map[0x4347] = 0x65AD; unicode_map[0x4348] = 0x6696; unicode_map[0x4349] = 0x6A80; unicode_map[0x434A] = 0x6BB5; unicode_map[0x434B] = 0x7537; unicode_map[0x434C] = 0x8AC7; unicode_map[0x434D] = 0x5024; unicode_map[0x434E] = 0x77E5; unicode_map[0x434F] = 0x5730; unicode_map[0x4350] = 0x5F1B; unicode_map[0x4351] = 0x6065; unicode_map[0x4352] = 0x667A; unicode_map[0x4353] = 0x6C60; unicode_map[0x4354] = 0x75F4; unicode_map[0x4355] = 0x7A1A; unicode_map[0x4356] = 0x7F6E; unicode_map[0x4357] = 0x81F4; unicode_map[0x4358] = 0x8718; unicode_map[0x4359] = 0x9045; unicode_map[0x435A] = 0x99B3; unicode_map[0x435B] = 0x7BC9; unicode_map[0x435C] = 0x755C; unicode_map[0x435D] = 0x7AF9; unicode_map[0x435E] = 0x7B51; unicode_map[0x435F] = 0x84C4; unicode_map[0x4360] = 0x9010; unicode_map[0x4361] = 0x79E9; unicode_map[0x4362] = 0x7A92; unicode_map[0x4363] = 0x8336; unicode_map[0x4364] = 0x5AE1; unicode_map[0x4365] = 0x7740; unicode_map[0x4366] = 0x4E2D; unicode_map[0x4367] = 0x4EF2; unicode_map[0x4368] = 0x5B99; unicode_map[0x4369] = 0x5FE0; unicode_map[0x436A] = 0x62BD; unicode_map[0x436B] = 0x663C; unicode_map[0x436C] = 0x67F1; unicode_map[0x436D] = 0x6CE8; unicode_map[0x436E] = 0x866B; unicode_map[0x436F] = 0x8877; unicode_map[0x4370] = 0x8A3B; unicode_map[0x4371] = 0x914E; unicode_map[0x4372] = 0x92F3; unicode_map[0x4373] = 0x99D0; unicode_map[0x4374] = 0x6A17; unicode_map[0x4375] = 0x7026; unicode_map[0x4376] = 0x732A; unicode_map[0x4377] = 0x82E7; unicode_map[0x4378] = 0x8457; unicode_map[0x4379] = 0x8CAF; unicode_map[0x437A] = 0x4E01; unicode_map[0x437B] = 0x5146; unicode_map[0x437C] = 0x51CB; unicode_map[0x437D] = 0x558B; unicode_map[0x437E] = 0x5BF5; unicode_map[0x4421] = 0x5E16; unicode_map[0x4422] = 0x5E33; unicode_map[0x4423] = 0x5E81; unicode_map[0x4424] = 0x5F14; unicode_map[0x4425] = 0x5F35; unicode_map[0x4426] = 0x5F6B; unicode_map[0x4427] = 0x5FB4; unicode_map[0x4428] = 0x61F2; unicode_map[0x4429] = 0x6311; unicode_map[0x442A] = 0x66A2; unicode_map[0x442B] = 0x671D; unicode_map[0x442C] = 0x6F6E; unicode_map[0x442D] = 0x7252; unicode_map[0x442E] = 0x753A; unicode_map[0x442F] = 0x773A; unicode_map[0x4430] = 0x8074; unicode_map[0x4431] = 0x8139; unicode_map[0x4432] = 0x8178; unicode_map[0x4433] = 0x8776; unicode_map[0x4434] = 0x8ABF; unicode_map[0x4435] = 0x8ADC; unicode_map[0x4436] = 0x8D85; unicode_map[0x4437] = 0x8DF3; unicode_map[0x4438] = 0x929A; unicode_map[0x4439] = 0x9577; unicode_map[0x443A] = 0x9802; unicode_map[0x443B] = 0x9CE5; unicode_map[0x443C] = 0x52C5; unicode_map[0x443D] = 0x6357; unicode_map[0x443E] = 0x76F4; unicode_map[0x443F] = 0x6715; unicode_map[0x4440] = 0x6C88; unicode_map[0x4441] = 0x73CD; unicode_map[0x4442] = 0x8CC3; unicode_map[0x4443] = 0x93AE; unicode_map[0x4444] = 0x9673; unicode_map[0x4445] = 0x6D25; unicode_map[0x4446] = 0x589C; unicode_map[0x4447] = 0x690E; unicode_map[0x4448] = 0x69CC; unicode_map[0x4449] = 0x8FFD; unicode_map[0x444A] = 0x939A; unicode_map[0x444B] = 0x75DB; unicode_map[0x444C] = 0x901A; unicode_map[0x444D] = 0x585A; unicode_map[0x444E] = 0x6802; unicode_map[0x444F] = 0x63B4; unicode_map[0x4450] = 0x69FB; unicode_map[0x4451] = 0x4F43; unicode_map[0x4452] = 0x6F2C; unicode_map[0x4453] = 0x67D8; unicode_map[0x4454] = 0x8FBB; unicode_map[0x4455] = 0x8526; unicode_map[0x4456] = 0x7DB4; unicode_map[0x4457] = 0x9354; unicode_map[0x4458] = 0x693F; unicode_map[0x4459] = 0x6F70; unicode_map[0x445A] = 0x576A; unicode_map[0x445B] = 0x58F7; unicode_map[0x445C] = 0x5B2C; unicode_map[0x445D] = 0x7D2C; unicode_map[0x445E] = 0x722A; unicode_map[0x445F] = 0x540A; unicode_map[0x4460] = 0x91E3; unicode_map[0x4461] = 0x9DB4; unicode_map[0x4462] = 0x4EAD; unicode_map[0x4463] = 0x4F4E; unicode_map[0x4464] = 0x505C; unicode_map[0x4465] = 0x5075; unicode_map[0x4466] = 0x5243; unicode_map[0x4467] = 0x8C9E; unicode_map[0x4468] = 0x5448; unicode_map[0x4469] = 0x5824; unicode_map[0x446A] = 0x5B9A; unicode_map[0x446B] = 0x5E1D; unicode_map[0x446C] = 0x5E95; unicode_map[0x446D] = 0x5EAD; unicode_map[0x446E] = 0x5EF7; unicode_map[0x446F] = 0x5F1F; unicode_map[0x4470] = 0x608C; unicode_map[0x4471] = 0x62B5; unicode_map[0x4472] = 0x633A; unicode_map[0x4473] = 0x63D0; unicode_map[0x4474] = 0x68AF; unicode_map[0x4475] = 0x6C40; unicode_map[0x4476] = 0x7887; unicode_map[0x4477] = 0x798E; unicode_map[0x4478] = 0x7A0B; unicode_map[0x4479] = 0x7DE0; unicode_map[0x447A] = 0x8247; unicode_map[0x447B] = 0x8A02; unicode_map[0x447C] = 0x8AE6; unicode_map[0x447D] = 0x8E44; unicode_map[0x447E] = 0x9013; unicode_map[0x4521] = 0x90B8; unicode_map[0x4522] = 0x912D; unicode_map[0x4523] = 0x91D8; unicode_map[0x4524] = 0x9F0E; unicode_map[0x4525] = 0x6CE5; unicode_map[0x4526] = 0x6458; unicode_map[0x4527] = 0x64E2; unicode_map[0x4528] = 0x6575; unicode_map[0x4529] = 0x6EF4; unicode_map[0x452A] = 0x7684; unicode_map[0x452B] = 0x7B1B; unicode_map[0x452C] = 0x9069; unicode_map[0x452D] = 0x93D1; unicode_map[0x452E] = 0x6EBA; unicode_map[0x452F] = 0x54F2; unicode_map[0x4530] = 0x5FB9; unicode_map[0x4531] = 0x64A4; unicode_map[0x4532] = 0x8F4D; unicode_map[0x4533] = 0x8FED; unicode_map[0x4534] = 0x9244; unicode_map[0x4535] = 0x5178; unicode_map[0x4536] = 0x586B; unicode_map[0x4537] = 0x5929; unicode_map[0x4538] = 0x5C55; unicode_map[0x4539] = 0x5E97; unicode_map[0x453A] = 0x6DFB; unicode_map[0x453B] = 0x7E8F; unicode_map[0x453C] = 0x751C; unicode_map[0x453D] = 0x8CBC; unicode_map[0x453E] = 0x8EE2; unicode_map[0x453F] = 0x985B; unicode_map[0x4540] = 0x70B9; unicode_map[0x4541] = 0x4F1D; unicode_map[0x4542] = 0x6BBF; unicode_map[0x4543] = 0x6FB1; unicode_map[0x4544] = 0x7530; unicode_map[0x4545] = 0x96FB; unicode_map[0x4546] = 0x514E; unicode_map[0x4547] = 0x5410; unicode_map[0x4548] = 0x5835; unicode_map[0x4549] = 0x5857; unicode_map[0x454A] = 0x59AC; unicode_map[0x454B] = 0x5C60; unicode_map[0x454C] = 0x5F92; unicode_map[0x454D] = 0x6597; unicode_map[0x454E] = 0x675C; unicode_map[0x454F] = 0x6E21; unicode_map[0x4550] = 0x767B; unicode_map[0x4551] = 0x83DF; unicode_map[0x4552] = 0x8CED; unicode_map[0x4553] = 0x9014; unicode_map[0x4554] = 0x90FD; unicode_map[0x4555] = 0x934D; unicode_map[0x4556] = 0x7825; unicode_map[0x4557] = 0x783A; unicode_map[0x4558] = 0x52AA; unicode_map[0x4559] = 0x5EA6; unicode_map[0x455A] = 0x571F; unicode_map[0x455B] = 0x5974; unicode_map[0x455C] = 0x6012; unicode_map[0x455D] = 0x5012; unicode_map[0x455E] = 0x515A; unicode_map[0x455F] = 0x51AC; unicode_map[0x4560] = 0x51CD; unicode_map[0x4561] = 0x5200; unicode_map[0x4562] = 0x5510; unicode_map[0x4563] = 0x5854; unicode_map[0x4564] = 0x5858; unicode_map[0x4565] = 0x5957; unicode_map[0x4566] = 0x5B95; unicode_map[0x4567] = 0x5CF6; unicode_map[0x4568] = 0x5D8B; unicode_map[0x4569] = 0x60BC; unicode_map[0x456A] = 0x6295; unicode_map[0x456B] = 0x642D; unicode_map[0x456C] = 0x6771; unicode_map[0x456D] = 0x6843; unicode_map[0x456E] = 0x68BC; unicode_map[0x456F] = 0x68DF; unicode_map[0x4570] = 0x76D7; unicode_map[0x4571] = 0x6DD8; unicode_map[0x4572] = 0x6E6F; unicode_map[0x4573] = 0x6D9B; unicode_map[0x4574] = 0x706F; unicode_map[0x4575] = 0x71C8; unicode_map[0x4576] = 0x5F53; unicode_map[0x4577] = 0x75D8; unicode_map[0x4578] = 0x7977; unicode_map[0x4579] = 0x7B49; unicode_map[0x457A] = 0x7B54; unicode_map[0x457B] = 0x7B52; unicode_map[0x457C] = 0x7CD6; unicode_map[0x457D] = 0x7D71; unicode_map[0x457E] = 0x5230; unicode_map[0x4621] = 0x8463; unicode_map[0x4622] = 0x8569; unicode_map[0x4623] = 0x85E4; unicode_map[0x4624] = 0x8A0E; unicode_map[0x4625] = 0x8B04; unicode_map[0x4626] = 0x8C46; unicode_map[0x4627] = 0x8E0F; unicode_map[0x4628] = 0x9003; unicode_map[0x4629] = 0x900F; unicode_map[0x462A] = 0x9419; unicode_map[0x462B] = 0x9676; unicode_map[0x462C] = 0x982D; unicode_map[0x462D] = 0x9A30; unicode_map[0x462E] = 0x95D8; unicode_map[0x462F] = 0x50CD; unicode_map[0x4630] = 0x52D5; unicode_map[0x4631] = 0x540C; unicode_map[0x4632] = 0x5802; unicode_map[0x4633] = 0x5C0E; unicode_map[0x4634] = 0x61A7; unicode_map[0x4635] = 0x649E; unicode_map[0x4636] = 0x6D1E; unicode_map[0x4637] = 0x77B3; unicode_map[0x4638] = 0x7AE5; unicode_map[0x4639] = 0x80F4; unicode_map[0x463A] = 0x8404; unicode_map[0x463B] = 0x9053; unicode_map[0x463C] = 0x9285; unicode_map[0x463D] = 0x5CE0; unicode_map[0x463E] = 0x9D07; unicode_map[0x463F] = 0x533F; unicode_map[0x4640] = 0x5F97; unicode_map[0x4641] = 0x5FB3; unicode_map[0x4642] = 0x6D9C; unicode_map[0x4643] = 0x7279; unicode_map[0x4644] = 0x7763; unicode_map[0x4645] = 0x79BF; unicode_map[0x4646] = 0x7BE4; unicode_map[0x4647] = 0x6BD2; unicode_map[0x4648] = 0x72EC; unicode_map[0x4649] = 0x8AAD; unicode_map[0x464A] = 0x6803; unicode_map[0x464B] = 0x6A61; unicode_map[0x464C] = 0x51F8; unicode_map[0x464D] = 0x7A81; unicode_map[0x464E] = 0x6934; unicode_map[0x464F] = 0x5C4A; unicode_map[0x4650] = 0x9CF6; unicode_map[0x4651] = 0x82EB; unicode_map[0x4652] = 0x5BC5; unicode_map[0x4653] = 0x9149; unicode_map[0x4654] = 0x701E; unicode_map[0x4655] = 0x5678; unicode_map[0x4656] = 0x5C6F; unicode_map[0x4657] = 0x60C7; unicode_map[0x4658] = 0x6566; unicode_map[0x4659] = 0x6C8C; unicode_map[0x465A] = 0x8C5A; unicode_map[0x465B] = 0x9041; unicode_map[0x465C] = 0x9813; unicode_map[0x465D] = 0x5451; unicode_map[0x465E] = 0x66C7; unicode_map[0x465F] = 0x920D; unicode_map[0x4660] = 0x5948; unicode_map[0x4661] = 0x90A3; unicode_map[0x4662] = 0x5185; unicode_map[0x4663] = 0x4E4D; unicode_map[0x4664] = 0x51EA; unicode_map[0x4665] = 0x8599; unicode_map[0x4666] = 0x8B0E; unicode_map[0x4667] = 0x7058; unicode_map[0x4668] = 0x637A; unicode_map[0x4669] = 0x934B; unicode_map[0x466A] = 0x6962; unicode_map[0x466B] = 0x99B4; unicode_map[0x466C] = 0x7E04; unicode_map[0x466D] = 0x7577; unicode_map[0x466E] = 0x5357; unicode_map[0x466F] = 0x6960; unicode_map[0x4670] = 0x8EDF; unicode_map[0x4671] = 0x96E3; unicode_map[0x4672] = 0x6C5D; unicode_map[0x4673] = 0x4E8C; unicode_map[0x4674] = 0x5C3C; unicode_map[0x4675] = 0x5F10; unicode_map[0x4676] = 0x8FE9; unicode_map[0x4677] = 0x5302; unicode_map[0x4678] = 0x8CD1; unicode_map[0x4679] = 0x8089; unicode_map[0x467A] = 0x8679; unicode_map[0x467B] = 0x5EFF; unicode_map[0x467C] = 0x65E5; unicode_map[0x467D] = 0x4E73; unicode_map[0x467E] = 0x5165; unicode_map[0x4721] = 0x5982; unicode_map[0x4722] = 0x5C3F; unicode_map[0x4723] = 0x97EE; unicode_map[0x4724] = 0x4EFB; unicode_map[0x4725] = 0x598A; unicode_map[0x4726] = 0x5FCD; unicode_map[0x4727] = 0x8A8D; unicode_map[0x4728] = 0x6FE1; unicode_map[0x4729] = 0x79B0; unicode_map[0x472A] = 0x7962; unicode_map[0x472B] = 0x5BE7; unicode_map[0x472C] = 0x8471; unicode_map[0x472D] = 0x732B; unicode_map[0x472E] = 0x71B1; unicode_map[0x472F] = 0x5E74; unicode_map[0x4730] = 0x5FF5; unicode_map[0x4731] = 0x637B; unicode_map[0x4732] = 0x649A; unicode_map[0x4733] = 0x71C3; unicode_map[0x4734] = 0x7C98; unicode_map[0x4735] = 0x4E43; unicode_map[0x4736] = 0x5EFC; unicode_map[0x4737] = 0x4E4B; unicode_map[0x4738] = 0x57DC; unicode_map[0x4739] = 0x56A2; unicode_map[0x473A] = 0x60A9; unicode_map[0x473B] = 0x6FC3; unicode_map[0x473C] = 0x7D0D; unicode_map[0x473D] = 0x80FD; unicode_map[0x473E] = 0x8133; unicode_map[0x473F] = 0x81BF; unicode_map[0x4740] = 0x8FB2; unicode_map[0x4741] = 0x8997; unicode_map[0x4742] = 0x86A4; unicode_map[0x4743] = 0x5DF4; unicode_map[0x4744] = 0x628A; unicode_map[0x4745] = 0x64AD; unicode_map[0x4746] = 0x8987; unicode_map[0x4747] = 0x6777; unicode_map[0x4748] = 0x6CE2; unicode_map[0x4749] = 0x6D3E; unicode_map[0x474A] = 0x7436; unicode_map[0x474B] = 0x7834; unicode_map[0x474C] = 0x5A46; unicode_map[0x474D] = 0x7F75; unicode_map[0x474E] = 0x82AD; unicode_map[0x474F] = 0x99AC; unicode_map[0x4750] = 0x4FF3; unicode_map[0x4751] = 0x5EC3; unicode_map[0x4752] = 0x62DD; unicode_map[0x4753] = 0x6392; unicode_map[0x4754] = 0x6557; unicode_map[0x4755] = 0x676F; unicode_map[0x4756] = 0x76C3; unicode_map[0x4757] = 0x724C; unicode_map[0x4758] = 0x80CC; unicode_map[0x4759] = 0x80BA; unicode_map[0x475A] = 0x8F29; unicode_map[0x475B] = 0x914D; unicode_map[0x475C] = 0x500D; unicode_map[0x475D] = 0x57F9; unicode_map[0x475E] = 0x5A92; unicode_map[0x475F] = 0x6885; unicode_map[0x4760] = 0x6973; unicode_map[0x4761] = 0x7164; unicode_map[0x4762] = 0x72FD; unicode_map[0x4763] = 0x8CB7; unicode_map[0x4764] = 0x58F2; unicode_map[0x4765] = 0x8CE0; unicode_map[0x4766] = 0x966A; unicode_map[0x4767] = 0x9019; unicode_map[0x4768] = 0x877F; unicode_map[0x4769] = 0x79E4; unicode_map[0x476A] = 0x77E7; unicode_map[0x476B] = 0x8429; unicode_map[0x476C] = 0x4F2F; unicode_map[0x476D] = 0x5265; unicode_map[0x476E] = 0x535A; unicode_map[0x476F] = 0x62CD; unicode_map[0x4770] = 0x67CF; unicode_map[0x4771] = 0x6CCA; unicode_map[0x4772] = 0x767D; unicode_map[0x4773] = 0x7B94; unicode_map[0x4774] = 0x7C95; unicode_map[0x4775] = 0x8236; unicode_map[0x4776] = 0x8584; unicode_map[0x4777] = 0x8FEB; unicode_map[0x4778] = 0x66DD; unicode_map[0x4779] = 0x6F20; unicode_map[0x477A] = 0x7206; unicode_map[0x477B] = 0x7E1B; unicode_map[0x477C] = 0x83AB; unicode_map[0x477D] = 0x99C1; unicode_map[0x477E] = 0x9EA6; unicode_map[0x4821] = 0x51FD; unicode_map[0x4822] = 0x7BB1; unicode_map[0x4823] = 0x7872; unicode_map[0x4824] = 0x7BB8; unicode_map[0x4825] = 0x8087; unicode_map[0x4826] = 0x7B48; unicode_map[0x4827] = 0x6AE8; unicode_map[0x4828] = 0x5E61; unicode_map[0x4829] = 0x808C; unicode_map[0x482A] = 0x7551; unicode_map[0x482B] = 0x7560; unicode_map[0x482C] = 0x516B; unicode_map[0x482D] = 0x9262; unicode_map[0x482E] = 0x6E8C; unicode_map[0x482F] = 0x767A; unicode_map[0x4830] = 0x9197; unicode_map[0x4831] = 0x9AEA; unicode_map[0x4832] = 0x4F10; unicode_map[0x4833] = 0x7F70; unicode_map[0x4834] = 0x629C; unicode_map[0x4835] = 0x7B4F; unicode_map[0x4836] = 0x95A5; unicode_map[0x4837] = 0x9CE9; unicode_map[0x4838] = 0x567A; unicode_map[0x4839] = 0x5859; unicode_map[0x483A] = 0x86E4; unicode_map[0x483B] = 0x96BC; unicode_map[0x483C] = 0x4F34; unicode_map[0x483D] = 0x5224; unicode_map[0x483E] = 0x534A; unicode_map[0x483F] = 0x53CD; unicode_map[0x4840] = 0x53DB; unicode_map[0x4841] = 0x5E06; unicode_map[0x4842] = 0x642C; unicode_map[0x4843] = 0x6591; unicode_map[0x4844] = 0x677F; unicode_map[0x4845] = 0x6C3E; unicode_map[0x4846] = 0x6C4E; unicode_map[0x4847] = 0x7248; unicode_map[0x4848] = 0x72AF; unicode_map[0x4849] = 0x73ED; unicode_map[0x484A] = 0x7554; unicode_map[0x484B] = 0x7E41; unicode_map[0x484C] = 0x822C; unicode_map[0x484D] = 0x85E9; unicode_map[0x484E] = 0x8CA9; unicode_map[0x484F] = 0x7BC4; unicode_map[0x4850] = 0x91C6; unicode_map[0x4851] = 0x7169; unicode_map[0x4852] = 0x9812; unicode_map[0x4853] = 0x98EF; unicode_map[0x4854] = 0x633D; unicode_map[0x4855] = 0x6669; unicode_map[0x4856] = 0x756A; unicode_map[0x4857] = 0x76E4; unicode_map[0x4858] = 0x78D0; unicode_map[0x4859] = 0x8543; unicode_map[0x485A] = 0x86EE; unicode_map[0x485B] = 0x532A; unicode_map[0x485C] = 0x5351; unicode_map[0x485D] = 0x5426; unicode_map[0x485E] = 0x5983; unicode_map[0x485F] = 0x5E87; unicode_map[0x4860] = 0x5F7C; unicode_map[0x4861] = 0x60B2; unicode_map[0x4862] = 0x6249; unicode_map[0x4863] = 0x6279; unicode_map[0x4864] = 0x62AB; unicode_map[0x4865] = 0x6590; unicode_map[0x4866] = 0x6BD4; unicode_map[0x4867] = 0x6CCC; unicode_map[0x4868] = 0x75B2; unicode_map[0x4869] = 0x76AE; unicode_map[0x486A] = 0x7891; unicode_map[0x486B] = 0x79D8; unicode_map[0x486C] = 0x7DCB; unicode_map[0x486D] = 0x7F77; unicode_map[0x486E] = 0x80A5; unicode_map[0x486F] = 0x88AB; unicode_map[0x4870] = 0x8AB9; unicode_map[0x4871] = 0x8CBB; unicode_map[0x4872] = 0x907F; unicode_map[0x4873] = 0x975E; unicode_map[0x4874] = 0x98DB; unicode_map[0x4875] = 0x6A0B; unicode_map[0x4876] = 0x7C38; unicode_map[0x4877] = 0x5099; unicode_map[0x4878] = 0x5C3E; unicode_map[0x4879] = 0x5FAE; unicode_map[0x487A] = 0x6787; unicode_map[0x487B] = 0x6BD8; unicode_map[0x487C] = 0x7435; unicode_map[0x487D] = 0x7709; unicode_map[0x487E] = 0x7F8E; unicode_map[0x4921] = 0x9F3B; unicode_map[0x4922] = 0x67CA; unicode_map[0x4923] = 0x7A17; unicode_map[0x4924] = 0x5339; unicode_map[0x4925] = 0x758B; unicode_map[0x4926] = 0x9AED; unicode_map[0x4927] = 0x5F66; unicode_map[0x4928] = 0x819D; unicode_map[0x4929] = 0x83F1; unicode_map[0x492A] = 0x8098; unicode_map[0x492B] = 0x5F3C; unicode_map[0x492C] = 0x5FC5; unicode_map[0x492D] = 0x7562; unicode_map[0x492E] = 0x7B46; unicode_map[0x492F] = 0x903C; unicode_map[0x4930] = 0x6867; unicode_map[0x4931] = 0x59EB; unicode_map[0x4932] = 0x5A9B; unicode_map[0x4933] = 0x7D10; unicode_map[0x4934] = 0x767E; unicode_map[0x4935] = 0x8B2C; unicode_map[0x4936] = 0x4FF5; unicode_map[0x4937] = 0x5F6A; unicode_map[0x4938] = 0x6A19; unicode_map[0x4939] = 0x6C37; unicode_map[0x493A] = 0x6F02; unicode_map[0x493B] = 0x74E2; unicode_map[0x493C] = 0x7968; unicode_map[0x493D] = 0x8868; unicode_map[0x493E] = 0x8A55; unicode_map[0x493F] = 0x8C79; unicode_map[0x4940] = 0x5EDF; unicode_map[0x4941] = 0x63CF; unicode_map[0x4942] = 0x75C5; unicode_map[0x4943] = 0x79D2; unicode_map[0x4944] = 0x82D7; unicode_map[0x4945] = 0x9328; unicode_map[0x4946] = 0x92F2; unicode_map[0x4947] = 0x849C; unicode_map[0x4948] = 0x86ED; unicode_map[0x4949] = 0x9C2D; unicode_map[0x494A] = 0x54C1; unicode_map[0x494B] = 0x5F6C; unicode_map[0x494C] = 0x658C; unicode_map[0x494D] = 0x6D5C; unicode_map[0x494E] = 0x7015; unicode_map[0x494F] = 0x8CA7; unicode_map[0x4950] = 0x8CD3; unicode_map[0x4951] = 0x983B; unicode_map[0x4952] = 0x654F; unicode_map[0x4953] = 0x74F6; unicode_map[0x4954] = 0x4E0D; unicode_map[0x4955] = 0x4ED8; unicode_map[0x4956] = 0x57E0; unicode_map[0x4957] = 0x592B; unicode_map[0x4958] = 0x5A66; unicode_map[0x4959] = 0x5BCC; unicode_map[0x495A] = 0x51A8; unicode_map[0x495B] = 0x5E03; unicode_map[0x495C] = 0x5E9C; unicode_map[0x495D] = 0x6016; unicode_map[0x495E] = 0x6276; unicode_map[0x495F] = 0x6577; unicode_map[0x4960] = 0x65A7; unicode_map[0x4961] = 0x666E; unicode_map[0x4962] = 0x6D6E; unicode_map[0x4963] = 0x7236; unicode_map[0x4964] = 0x7B26; unicode_map[0x4965] = 0x8150; unicode_map[0x4966] = 0x819A; unicode_map[0x4967] = 0x8299; unicode_map[0x4968] = 0x8B5C; unicode_map[0x4969] = 0x8CA0; unicode_map[0x496A] = 0x8CE6; unicode_map[0x496B] = 0x8D74; unicode_map[0x496C] = 0x961C; unicode_map[0x496D] = 0x9644; unicode_map[0x496E] = 0x4FAE; unicode_map[0x496F] = 0x64AB; unicode_map[0x4970] = 0x6B66; unicode_map[0x4971] = 0x821E; unicode_map[0x4972] = 0x8461; unicode_map[0x4973] = 0x856A; unicode_map[0x4974] = 0x90E8; unicode_map[0x4975] = 0x5C01; unicode_map[0x4976] = 0x6953; unicode_map[0x4977] = 0x98A8; unicode_map[0x4978] = 0x847A; unicode_map[0x4979] = 0x8557; unicode_map[0x497A] = 0x4F0F; unicode_map[0x497B] = 0x526F; unicode_map[0x497C] = 0x5FA9; unicode_map[0x497D] = 0x5E45; unicode_map[0x497E] = 0x670D; unicode_map[0x4A21] = 0x798F; unicode_map[0x4A22] = 0x8179; unicode_map[0x4A23] = 0x8907; unicode_map[0x4A24] = 0x8986; unicode_map[0x4A25] = 0x6DF5; unicode_map[0x4A26] = 0x5F17; unicode_map[0x4A27] = 0x6255; unicode_map[0x4A28] = 0x6CB8; unicode_map[0x4A29] = 0x4ECF; unicode_map[0x4A2A] = 0x7269; unicode_map[0x4A2B] = 0x9B92; unicode_map[0x4A2C] = 0x5206; unicode_map[0x4A2D] = 0x543B; unicode_map[0x4A2E] = 0x5674; unicode_map[0x4A2F] = 0x58B3; unicode_map[0x4A30] = 0x61A4; unicode_map[0x4A31] = 0x626E; unicode_map[0x4A32] = 0x711A; unicode_map[0x4A33] = 0x596E; unicode_map[0x4A34] = 0x7C89; unicode_map[0x4A35] = 0x7CDE; unicode_map[0x4A36] = 0x7D1B; unicode_map[0x4A37] = 0x96F0; unicode_map[0x4A38] = 0x6587; unicode_map[0x4A39] = 0x805E; unicode_map[0x4A3A] = 0x4E19; unicode_map[0x4A3B] = 0x4F75; unicode_map[0x4A3C] = 0x5175; unicode_map[0x4A3D] = 0x5840; unicode_map[0x4A3E] = 0x5E63; unicode_map[0x4A3F] = 0x5E73; unicode_map[0x4A40] = 0x5F0A; unicode_map[0x4A41] = 0x67C4; unicode_map[0x4A42] = 0x4E26; unicode_map[0x4A43] = 0x853D; unicode_map[0x4A44] = 0x9589; unicode_map[0x4A45] = 0x965B; unicode_map[0x4A46] = 0x7C73; unicode_map[0x4A47] = 0x9801; unicode_map[0x4A48] = 0x50FB; unicode_map[0x4A49] = 0x58C1; unicode_map[0x4A4A] = 0x7656; unicode_map[0x4A4B] = 0x78A7; unicode_map[0x4A4C] = 0x5225; unicode_map[0x4A4D] = 0x77A5; unicode_map[0x4A4E] = 0x8511; unicode_map[0x4A4F] = 0x7B86; unicode_map[0x4A50] = 0x504F; unicode_map[0x4A51] = 0x5909; unicode_map[0x4A52] = 0x7247; unicode_map[0x4A53] = 0x7BC7; unicode_map[0x4A54] = 0x7DE8; unicode_map[0x4A55] = 0x8FBA; unicode_map[0x4A56] = 0x8FD4; unicode_map[0x4A57] = 0x904D; unicode_map[0x4A58] = 0x4FBF; unicode_map[0x4A59] = 0x52C9; unicode_map[0x4A5A] = 0x5A29; unicode_map[0x4A5B] = 0x5F01; unicode_map[0x4A5C] = 0x97AD; unicode_map[0x4A5D] = 0x4FDD; unicode_map[0x4A5E] = 0x8217; unicode_map[0x4A5F] = 0x92EA; unicode_map[0x4A60] = 0x5703; unicode_map[0x4A61] = 0x6355; unicode_map[0x4A62] = 0x6B69; unicode_map[0x4A63] = 0x752B; unicode_map[0x4A64] = 0x88DC; unicode_map[0x4A65] = 0x8F14; unicode_map[0x4A66] = 0x7A42; unicode_map[0x4A67] = 0x52DF; unicode_map[0x4A68] = 0x5893; unicode_map[0x4A69] = 0x6155; unicode_map[0x4A6A] = 0x620A; unicode_map[0x4A6B] = 0x66AE; unicode_map[0x4A6C] = 0x6BCD; unicode_map[0x4A6D] = 0x7C3F; unicode_map[0x4A6E] = 0x83E9; unicode_map[0x4A6F] = 0x5023; unicode_map[0x4A70] = 0x4FF8; unicode_map[0x4A71] = 0x5305; unicode_map[0x4A72] = 0x5446; unicode_map[0x4A73] = 0x5831; unicode_map[0x4A74] = 0x5949; unicode_map[0x4A75] = 0x5B9D; unicode_map[0x4A76] = 0x5CF0; unicode_map[0x4A77] = 0x5CEF; unicode_map[0x4A78] = 0x5D29; unicode_map[0x4A79] = 0x5E96; unicode_map[0x4A7A] = 0x62B1; unicode_map[0x4A7B] = 0x6367; unicode_map[0x4A7C] = 0x653E; unicode_map[0x4A7D] = 0x65B9; unicode_map[0x4A7E] = 0x670B; unicode_map[0x4B21] = 0x6CD5; unicode_map[0x4B22] = 0x6CE1; unicode_map[0x4B23] = 0x70F9; unicode_map[0x4B24] = 0x7832; unicode_map[0x4B25] = 0x7E2B; unicode_map[0x4B26] = 0x80DE; unicode_map[0x4B27] = 0x82B3; unicode_map[0x4B28] = 0x840C; unicode_map[0x4B29] = 0x84EC; unicode_map[0x4B2A] = 0x8702; unicode_map[0x4B2B] = 0x8912; unicode_map[0x4B2C] = 0x8A2A; unicode_map[0x4B2D] = 0x8C4A; unicode_map[0x4B2E] = 0x90A6; unicode_map[0x4B2F] = 0x92D2; unicode_map[0x4B30] = 0x98FD; unicode_map[0x4B31] = 0x9CF3; unicode_map[0x4B32] = 0x9D6C; unicode_map[0x4B33] = 0x4E4F; unicode_map[0x4B34] = 0x4EA1; unicode_map[0x4B35] = 0x508D; unicode_map[0x4B36] = 0x5256; unicode_map[0x4B37] = 0x574A; unicode_map[0x4B38] = 0x59A8; unicode_map[0x4B39] = 0x5E3D; unicode_map[0x4B3A] = 0x5FD8; unicode_map[0x4B3B] = 0x5FD9; unicode_map[0x4B3C] = 0x623F; unicode_map[0x4B3D] = 0x66B4; unicode_map[0x4B3E] = 0x671B; unicode_map[0x4B3F] = 0x67D0; unicode_map[0x4B40] = 0x68D2; unicode_map[0x4B41] = 0x5192; unicode_map[0x4B42] = 0x7D21; unicode_map[0x4B43] = 0x80AA; unicode_map[0x4B44] = 0x81A8; unicode_map[0x4B45] = 0x8B00; unicode_map[0x4B46] = 0x8C8C; unicode_map[0x4B47] = 0x8CBF; unicode_map[0x4B48] = 0x927E; unicode_map[0x4B49] = 0x9632; unicode_map[0x4B4A] = 0x5420; unicode_map[0x4B4B] = 0x982C; unicode_map[0x4B4C] = 0x5317; unicode_map[0x4B4D] = 0x50D5; unicode_map[0x4B4E] = 0x535C; unicode_map[0x4B4F] = 0x58A8; unicode_map[0x4B50] = 0x64B2; unicode_map[0x4B51] = 0x6734; unicode_map[0x4B52] = 0x7267; unicode_map[0x4B53] = 0x7766; unicode_map[0x4B54] = 0x7A46; unicode_map[0x4B55] = 0x91E6; unicode_map[0x4B56] = 0x52C3; unicode_map[0x4B57] = 0x6CA1; unicode_map[0x4B58] = 0x6B86; unicode_map[0x4B59] = 0x5800; unicode_map[0x4B5A] = 0x5E4C; unicode_map[0x4B5B] = 0x5954; unicode_map[0x4B5C] = 0x672C; unicode_map[0x4B5D] = 0x7FFB; unicode_map[0x4B5E] = 0x51E1; unicode_map[0x4B5F] = 0x76C6; unicode_map[0x4B60] = 0x6469; unicode_map[0x4B61] = 0x78E8; unicode_map[0x4B62] = 0x9B54; unicode_map[0x4B63] = 0x9EBB; unicode_map[0x4B64] = 0x57CB; unicode_map[0x4B65] = 0x59B9; unicode_map[0x4B66] = 0x6627; unicode_map[0x4B67] = 0x679A; unicode_map[0x4B68] = 0x6BCE; unicode_map[0x4B69] = 0x54E9; unicode_map[0x4B6A] = 0x69D9; unicode_map[0x4B6B] = 0x5E55; unicode_map[0x4B6C] = 0x819C; unicode_map[0x4B6D] = 0x6795; unicode_map[0x4B6E] = 0x9BAA; unicode_map[0x4B6F] = 0x67FE; unicode_map[0x4B70] = 0x9C52; unicode_map[0x4B71] = 0x685D; unicode_map[0x4B72] = 0x4EA6; unicode_map[0x4B73] = 0x4FE3; unicode_map[0x4B74] = 0x53C8; unicode_map[0x4B75] = 0x62B9; unicode_map[0x4B76] = 0x672B; unicode_map[0x4B77] = 0x6CAB; unicode_map[0x4B78] = 0x8FC4; unicode_map[0x4B79] = 0x4FAD; unicode_map[0x4B7A] = 0x7E6D; unicode_map[0x4B7B] = 0x9EBF; unicode_map[0x4B7C] = 0x4E07; unicode_map[0x4B7D] = 0x6162; unicode_map[0x4B7E] = 0x6E80; unicode_map[0x4C21] = 0x6F2B; unicode_map[0x4C22] = 0x8513; unicode_map[0x4C23] = 0x5473; unicode_map[0x4C24] = 0x672A; unicode_map[0x4C25] = 0x9B45; unicode_map[0x4C26] = 0x5DF3; unicode_map[0x4C27] = 0x7B95; unicode_map[0x4C28] = 0x5CAC; unicode_map[0x4C29] = 0x5BC6; unicode_map[0x4C2A] = 0x871C; unicode_map[0x4C2B] = 0x6E4A; unicode_map[0x4C2C] = 0x84D1; unicode_map[0x4C2D] = 0x7A14; unicode_map[0x4C2E] = 0x8108; unicode_map[0x4C2F] = 0x5999; unicode_map[0x4C30] = 0x7C8D; unicode_map[0x4C31] = 0x6C11; unicode_map[0x4C32] = 0x7720; unicode_map[0x4C33] = 0x52D9; unicode_map[0x4C34] = 0x5922; unicode_map[0x4C35] = 0x7121; unicode_map[0x4C36] = 0x725F; unicode_map[0x4C37] = 0x77DB; unicode_map[0x4C38] = 0x9727; unicode_map[0x4C39] = 0x9D61; unicode_map[0x4C3A] = 0x690B; unicode_map[0x4C3B] = 0x5A7F; unicode_map[0x4C3C] = 0x5A18; unicode_map[0x4C3D] = 0x51A5; unicode_map[0x4C3E] = 0x540D; unicode_map[0x4C3F] = 0x547D; unicode_map[0x4C40] = 0x660E; unicode_map[0x4C41] = 0x76DF; unicode_map[0x4C42] = 0x8FF7; unicode_map[0x4C43] = 0x9298; unicode_map[0x4C44] = 0x9CF4; unicode_map[0x4C45] = 0x59EA; unicode_map[0x4C46] = 0x725D; unicode_map[0x4C47] = 0x6EC5; unicode_map[0x4C48] = 0x514D; unicode_map[0x4C49] = 0x68C9; unicode_map[0x4C4A] = 0x7DBF; unicode_map[0x4C4B] = 0x7DEC; unicode_map[0x4C4C] = 0x9762; unicode_map[0x4C4D] = 0x9EBA; unicode_map[0x4C4E] = 0x6478; unicode_map[0x4C4F] = 0x6A21; unicode_map[0x4C50] = 0x8302; unicode_map[0x4C51] = 0x5984; unicode_map[0x4C52] = 0x5B5F; unicode_map[0x4C53] = 0x6BDB; unicode_map[0x4C54] = 0x731B; unicode_map[0x4C55] = 0x76F2; unicode_map[0x4C56] = 0x7DB2; unicode_map[0x4C57] = 0x8017; unicode_map[0x4C58] = 0x8499; unicode_map[0x4C59] = 0x5132; unicode_map[0x4C5A] = 0x6728; unicode_map[0x4C5B] = 0x9ED9; unicode_map[0x4C5C] = 0x76EE; unicode_map[0x4C5D] = 0x6762; unicode_map[0x4C5E] = 0x52FF; unicode_map[0x4C5F] = 0x9905; unicode_map[0x4C60] = 0x5C24; unicode_map[0x4C61] = 0x623B; unicode_map[0x4C62] = 0x7C7E; unicode_map[0x4C63] = 0x8CB0; unicode_map[0x4C64] = 0x554F; unicode_map[0x4C65] = 0x60B6; unicode_map[0x4C66] = 0x7D0B; unicode_map[0x4C67] = 0x9580; unicode_map[0x4C68] = 0x5301; unicode_map[0x4C69] = 0x4E5F; unicode_map[0x4C6A] = 0x51B6; unicode_map[0x4C6B] = 0x591C; unicode_map[0x4C6C] = 0x723A; unicode_map[0x4C6D] = 0x8036; unicode_map[0x4C6E] = 0x91CE; unicode_map[0x4C6F] = 0x5F25; unicode_map[0x4C70] = 0x77E2; unicode_map[0x4C71] = 0x5384; unicode_map[0x4C72] = 0x5F79; unicode_map[0x4C73] = 0x7D04; unicode_map[0x4C74] = 0x85AC; unicode_map[0x4C75] = 0x8A33; unicode_map[0x4C76] = 0x8E8D; unicode_map[0x4C77] = 0x9756; unicode_map[0x4C78] = 0x67F3; unicode_map[0x4C79] = 0x85AE; unicode_map[0x4C7A] = 0x9453; unicode_map[0x4C7B] = 0x6109; unicode_map[0x4C7C] = 0x6108; unicode_map[0x4C7D] = 0x6CB9; unicode_map[0x4C7E] = 0x7652; unicode_map[0x4D21] = 0x8AED; unicode_map[0x4D22] = 0x8F38; unicode_map[0x4D23] = 0x552F; unicode_map[0x4D24] = 0x4F51; unicode_map[0x4D25] = 0x512A; unicode_map[0x4D26] = 0x52C7; unicode_map[0x4D27] = 0x53CB; unicode_map[0x4D28] = 0x5BA5; unicode_map[0x4D29] = 0x5E7D; unicode_map[0x4D2A] = 0x60A0; unicode_map[0x4D2B] = 0x6182; unicode_map[0x4D2C] = 0x63D6; unicode_map[0x4D2D] = 0x6709; unicode_map[0x4D2E] = 0x67DA; unicode_map[0x4D2F] = 0x6E67; unicode_map[0x4D30] = 0x6D8C; unicode_map[0x4D31] = 0x7336; unicode_map[0x4D32] = 0x7337; unicode_map[0x4D33] = 0x7531; unicode_map[0x4D34] = 0x7950; unicode_map[0x4D35] = 0x88D5; unicode_map[0x4D36] = 0x8A98; unicode_map[0x4D37] = 0x904A; unicode_map[0x4D38] = 0x9091; unicode_map[0x4D39] = 0x90F5; unicode_map[0x4D3A] = 0x96C4; unicode_map[0x4D3B] = 0x878D; unicode_map[0x4D3C] = 0x5915; unicode_map[0x4D3D] = 0x4E88; unicode_map[0x4D3E] = 0x4F59; unicode_map[0x4D3F] = 0x4E0E; unicode_map[0x4D40] = 0x8A89; unicode_map[0x4D41] = 0x8F3F; unicode_map[0x4D42] = 0x9810; unicode_map[0x4D43] = 0x50AD; unicode_map[0x4D44] = 0x5E7C; unicode_map[0x4D45] = 0x5996; unicode_map[0x4D46] = 0x5BB9; unicode_map[0x4D47] = 0x5EB8; unicode_map[0x4D48] = 0x63DA; unicode_map[0x4D49] = 0x63FA; unicode_map[0x4D4A] = 0x64C1; unicode_map[0x4D4B] = 0x66DC; unicode_map[0x4D4C] = 0x694A; unicode_map[0x4D4D] = 0x69D8; unicode_map[0x4D4E] = 0x6D0B; unicode_map[0x4D4F] = 0x6EB6; unicode_map[0x4D50] = 0x7194; unicode_map[0x4D51] = 0x7528; unicode_map[0x4D52] = 0x7AAF; unicode_map[0x4D53] = 0x7F8A; unicode_map[0x4D54] = 0x8000; unicode_map[0x4D55] = 0x8449; unicode_map[0x4D56] = 0x84C9; unicode_map[0x4D57] = 0x8981; unicode_map[0x4D58] = 0x8B21; unicode_map[0x4D59] = 0x8E0A; unicode_map[0x4D5A] = 0x9065; unicode_map[0x4D5B] = 0x967D; unicode_map[0x4D5C] = 0x990A; unicode_map[0x4D5D] = 0x617E; unicode_map[0x4D5E] = 0x6291; unicode_map[0x4D5F] = 0x6B32; unicode_map[0x4D60] = 0x6C83; unicode_map[0x4D61] = 0x6D74; unicode_map[0x4D62] = 0x7FCC; unicode_map[0x4D63] = 0x7FFC; unicode_map[0x4D64] = 0x6DC0; unicode_map[0x4D65] = 0x7F85; unicode_map[0x4D66] = 0x87BA; unicode_map[0x4D67] = 0x88F8; unicode_map[0x4D68] = 0x6765; unicode_map[0x4D69] = 0x83B1; unicode_map[0x4D6A] = 0x983C; unicode_map[0x4D6B] = 0x96F7; unicode_map[0x4D6C] = 0x6D1B; unicode_map[0x4D6D] = 0x7D61; unicode_map[0x4D6E] = 0x843D; unicode_map[0x4D6F] = 0x916A; unicode_map[0x4D70] = 0x4E71; unicode_map[0x4D71] = 0x5375; unicode_map[0x4D72] = 0x5D50; unicode_map[0x4D73] = 0x6B04; unicode_map[0x4D74] = 0x6FEB; unicode_map[0x4D75] = 0x85CD; unicode_map[0x4D76] = 0x862D; unicode_map[0x4D77] = 0x89A7; unicode_map[0x4D78] = 0x5229; unicode_map[0x4D79] = 0x540F; unicode_map[0x4D7A] = 0x5C65; unicode_map[0x4D7B] = 0x674E; unicode_map[0x4D7C] = 0x68A8; unicode_map[0x4D7D] = 0x7406; unicode_map[0x4D7E] = 0x7483; unicode_map[0x4E21] = 0x75E2; unicode_map[0x4E22] = 0x88CF; unicode_map[0x4E23] = 0x88E1; unicode_map[0x4E24] = 0x91CC; unicode_map[0x4E25] = 0x96E2; unicode_map[0x4E26] = 0x9678; unicode_map[0x4E27] = 0x5F8B; unicode_map[0x4E28] = 0x7387; unicode_map[0x4E29] = 0x7ACB; unicode_map[0x4E2A] = 0x844E; unicode_map[0x4E2B] = 0x63A0; unicode_map[0x4E2C] = 0x7565; unicode_map[0x4E2D] = 0x5289; unicode_map[0x4E2E] = 0x6D41; unicode_map[0x4E2F] = 0x6E9C; unicode_map[0x4E30] = 0x7409; unicode_map[0x4E31] = 0x7559; unicode_map[0x4E32] = 0x786B; unicode_map[0x4E33] = 0x7C92; unicode_map[0x4E34] = 0x9686; unicode_map[0x4E35] = 0x7ADC; unicode_map[0x4E36] = 0x9F8D; unicode_map[0x4E37] = 0x4FB6; unicode_map[0x4E38] = 0x616E; unicode_map[0x4E39] = 0x65C5; unicode_map[0x4E3A] = 0x865C; unicode_map[0x4E3B] = 0x4E86; unicode_map[0x4E3C] = 0x4EAE; unicode_map[0x4E3D] = 0x50DA; unicode_map[0x4E3E] = 0x4E21; unicode_map[0x4E3F] = 0x51CC; unicode_map[0x4E40] = 0x5BEE; unicode_map[0x4E41] = 0x6599; unicode_map[0x4E42] = 0x6881; unicode_map[0x4E43] = 0x6DBC; unicode_map[0x4E44] = 0x731F; unicode_map[0x4E45] = 0x7642; unicode_map[0x4E46] = 0x77AD; unicode_map[0x4E47] = 0x7A1C; unicode_map[0x4E48] = 0x7CE7; unicode_map[0x4E49] = 0x826F; unicode_map[0x4E4A] = 0x8AD2; unicode_map[0x4E4B] = 0x907C; unicode_map[0x4E4C] = 0x91CF; unicode_map[0x4E4D] = 0x9675; unicode_map[0x4E4E] = 0x9818; unicode_map[0x4E4F] = 0x529B; unicode_map[0x4E50] = 0x7DD1; unicode_map[0x4E51] = 0x502B; unicode_map[0x4E52] = 0x5398; unicode_map[0x4E53] = 0x6797; unicode_map[0x4E54] = 0x6DCB; unicode_map[0x4E55] = 0x71D0; unicode_map[0x4E56] = 0x7433; unicode_map[0x4E57] = 0x81E8; unicode_map[0x4E58] = 0x8F2A; unicode_map[0x4E59] = 0x96A3; unicode_map[0x4E5A] = 0x9C57; unicode_map[0x4E5B] = 0x9E9F; unicode_map[0x4E5C] = 0x7460; unicode_map[0x4E5D] = 0x5841; unicode_map[0x4E5E] = 0x6D99; unicode_map[0x4E5F] = 0x7D2F; unicode_map[0x4E60] = 0x985E; unicode_map[0x4E61] = 0x4EE4; unicode_map[0x4E62] = 0x4F36; unicode_map[0x4E63] = 0x4F8B; unicode_map[0x4E64] = 0x51B7; unicode_map[0x4E65] = 0x52B1; unicode_map[0x4E66] = 0x5DBA; unicode_map[0x4E67] = 0x601C; unicode_map[0x4E68] = 0x73B2; unicode_map[0x4E69] = 0x793C; unicode_map[0x4E6A] = 0x82D3; unicode_map[0x4E6B] = 0x9234; unicode_map[0x4E6C] = 0x96B7; unicode_map[0x4E6D] = 0x96F6; unicode_map[0x4E6E] = 0x970A; unicode_map[0x4E6F] = 0x9E97; unicode_map[0x4E70] = 0x9F62; unicode_map[0x4E71] = 0x66A6; unicode_map[0x4E72] = 0x6B74; unicode_map[0x4E73] = 0x5217; unicode_map[0x4E74] = 0x52A3; unicode_map[0x4E75] = 0x70C8; unicode_map[0x4E76] = 0x88C2; unicode_map[0x4E77] = 0x5EC9; unicode_map[0x4E78] = 0x604B; unicode_map[0x4E79] = 0x6190; unicode_map[0x4E7A] = 0x6F23; unicode_map[0x4E7B] = 0x7149; unicode_map[0x4E7C] = 0x7C3E; unicode_map[0x4E7D] = 0x7DF4; unicode_map[0x4E7E] = 0x806F; unicode_map[0x4F21] = 0x84EE; unicode_map[0x4F22] = 0x9023; unicode_map[0x4F23] = 0x932C; unicode_map[0x4F24] = 0x5442; unicode_map[0x4F25] = 0x9B6F; unicode_map[0x4F26] = 0x6AD3; unicode_map[0x4F27] = 0x7089; unicode_map[0x4F28] = 0x8CC2; unicode_map[0x4F29] = 0x8DEF; unicode_map[0x4F2A] = 0x9732; unicode_map[0x4F2B] = 0x52B4; unicode_map[0x4F2C] = 0x5A41; unicode_map[0x4F2D] = 0x5ECA; unicode_map[0x4F2E] = 0x5F04; unicode_map[0x4F2F] = 0x6717; unicode_map[0x4F30] = 0x697C; unicode_map[0x4F31] = 0x6994; unicode_map[0x4F32] = 0x6D6A; unicode_map[0x4F33] = 0x6F0F; unicode_map[0x4F34] = 0x7262; unicode_map[0x4F35] = 0x72FC; unicode_map[0x4F36] = 0x7BED; unicode_map[0x4F37] = 0x8001; unicode_map[0x4F38] = 0x807E; unicode_map[0x4F39] = 0x874B; unicode_map[0x4F3A] = 0x90CE; unicode_map[0x4F3B] = 0x516D; unicode_map[0x4F3C] = 0x9E93; unicode_map[0x4F3D] = 0x7984; unicode_map[0x4F3E] = 0x808B; unicode_map[0x4F3F] = 0x9332; unicode_map[0x4F40] = 0x8AD6; unicode_map[0x4F41] = 0x502D; unicode_map[0x4F42] = 0x548C; unicode_map[0x4F43] = 0x8A71; unicode_map[0x4F44] = 0x6B6A; unicode_map[0x4F45] = 0x8CC4; unicode_map[0x4F46] = 0x8107; unicode_map[0x4F47] = 0x60D1; unicode_map[0x4F48] = 0x67A0; unicode_map[0x4F49] = 0x9DF2; unicode_map[0x4F4A] = 0x4E99; unicode_map[0x4F4B] = 0x4E98; unicode_map[0x4F4C] = 0x9C10; unicode_map[0x4F4D] = 0x8A6B; unicode_map[0x4F4E] = 0x85C1; unicode_map[0x4F4F] = 0x8568; unicode_map[0x4F50] = 0x6900; unicode_map[0x4F51] = 0x6E7E; unicode_map[0x4F52] = 0x7897; unicode_map[0x4F53] = 0x8155; unicode_map[0x5021] = 0x5F0C; unicode_map[0x5022] = 0x4E10; unicode_map[0x5023] = 0x4E15; unicode_map[0x5024] = 0x4E2A; unicode_map[0x5025] = 0x4E31; unicode_map[0x5026] = 0x4E36; unicode_map[0x5027] = 0x4E3C; unicode_map[0x5028] = 0x4E3F; unicode_map[0x5029] = 0x4E42; unicode_map[0x502A] = 0x4E56; unicode_map[0x502B] = 0x4E58; unicode_map[0x502C] = 0x4E82; unicode_map[0x502D] = 0x4E85; unicode_map[0x502E] = 0x8C6B; unicode_map[0x502F] = 0x4E8A; unicode_map[0x5030] = 0x8212; unicode_map[0x5031] = 0x5F0D; unicode_map[0x5032] = 0x4E8E; unicode_map[0x5033] = 0x4E9E; unicode_map[0x5034] = 0x4E9F; unicode_map[0x5035] = 0x4EA0; unicode_map[0x5036] = 0x4EA2; unicode_map[0x5037] = 0x4EB0; unicode_map[0x5038] = 0x4EB3; unicode_map[0x5039] = 0x4EB6; unicode_map[0x503A] = 0x4ECE; unicode_map[0x503B] = 0x4ECD; unicode_map[0x503C] = 0x4EC4; unicode_map[0x503D] = 0x4EC6; unicode_map[0x503E] = 0x4EC2; unicode_map[0x503F] = 0x4ED7; unicode_map[0x5040] = 0x4EDE; unicode_map[0x5041] = 0x4EED; unicode_map[0x5042] = 0x4EDF; unicode_map[0x5043] = 0x4EF7; unicode_map[0x5044] = 0x4F09; unicode_map[0x5045] = 0x4F5A; unicode_map[0x5046] = 0x4F30; unicode_map[0x5047] = 0x4F5B; unicode_map[0x5048] = 0x4F5D; unicode_map[0x5049] = 0x4F57; unicode_map[0x504A] = 0x4F47; unicode_map[0x504B] = 0x4F76; unicode_map[0x504C] = 0x4F88; unicode_map[0x504D] = 0x4F8F; unicode_map[0x504E] = 0x4F98; unicode_map[0x504F] = 0x4F7B; unicode_map[0x5050] = 0x4F69; unicode_map[0x5051] = 0x4F70; unicode_map[0x5052] = 0x4F91; unicode_map[0x5053] = 0x4F6F; unicode_map[0x5054] = 0x4F86; unicode_map[0x5055] = 0x4F96; unicode_map[0x5056] = 0x5118; unicode_map[0x5057] = 0x4FD4; unicode_map[0x5058] = 0x4FDF; unicode_map[0x5059] = 0x4FCE; unicode_map[0x505A] = 0x4FD8; unicode_map[0x505B] = 0x4FDB; unicode_map[0x505C] = 0x4FD1; unicode_map[0x505D] = 0x4FDA; unicode_map[0x505E] = 0x4FD0; unicode_map[0x505F] = 0x4FE4; unicode_map[0x5060] = 0x4FE5; unicode_map[0x5061] = 0x501A; unicode_map[0x5062] = 0x5028; unicode_map[0x5063] = 0x5014; unicode_map[0x5064] = 0x502A; unicode_map[0x5065] = 0x5025; unicode_map[0x5066] = 0x5005; unicode_map[0x5067] = 0x4F1C; unicode_map[0x5068] = 0x4FF6; unicode_map[0x5069] = 0x5021; unicode_map[0x506A] = 0x5029; unicode_map[0x506B] = 0x502C; unicode_map[0x506C] = 0x4FFE; unicode_map[0x506D] = 0x4FEF; unicode_map[0x506E] = 0x5011; unicode_map[0x506F] = 0x5006; unicode_map[0x5070] = 0x5043; unicode_map[0x5071] = 0x5047; unicode_map[0x5072] = 0x6703; unicode_map[0x5073] = 0x5055; unicode_map[0x5074] = 0x5050; unicode_map[0x5075] = 0x5048; unicode_map[0x5076] = 0x505A; unicode_map[0x5077] = 0x5056; unicode_map[0x5078] = 0x506C; unicode_map[0x5079] = 0x5078; unicode_map[0x507A] = 0x5080; unicode_map[0x507B] = 0x509A; unicode_map[0x507C] = 0x5085; unicode_map[0x507D] = 0x50B4; unicode_map[0x507E] = 0x50B2; unicode_map[0x5121] = 0x50C9; unicode_map[0x5122] = 0x50CA; unicode_map[0x5123] = 0x50B3; unicode_map[0x5124] = 0x50C2; unicode_map[0x5125] = 0x50D6; unicode_map[0x5126] = 0x50DE; unicode_map[0x5127] = 0x50E5; unicode_map[0x5128] = 0x50ED; unicode_map[0x5129] = 0x50E3; unicode_map[0x512A] = 0x50EE; unicode_map[0x512B] = 0x50F9; unicode_map[0x512C] = 0x50F5; unicode_map[0x512D] = 0x5109; unicode_map[0x512E] = 0x5101; unicode_map[0x512F] = 0x5102; unicode_map[0x5130] = 0x5116; unicode_map[0x5131] = 0x5115; unicode_map[0x5132] = 0x5114; unicode_map[0x5133] = 0x511A; unicode_map[0x5134] = 0x5121; unicode_map[0x5135] = 0x513A; unicode_map[0x5136] = 0x5137; unicode_map[0x5137] = 0x513C; unicode_map[0x5138] = 0x513B; unicode_map[0x5139] = 0x513F; unicode_map[0x513A] = 0x5140; unicode_map[0x513B] = 0x5152; unicode_map[0x513C] = 0x514C; unicode_map[0x513D] = 0x5154; unicode_map[0x513E] = 0x5162; unicode_map[0x513F] = 0x7AF8; unicode_map[0x5140] = 0x5169; unicode_map[0x5141] = 0x516A; unicode_map[0x5142] = 0x516E; unicode_map[0x5143] = 0x5180; unicode_map[0x5144] = 0x5182; unicode_map[0x5145] = 0x56D8; unicode_map[0x5146] = 0x518C; unicode_map[0x5147] = 0x5189; unicode_map[0x5148] = 0x518F; unicode_map[0x5149] = 0x5191; unicode_map[0x514A] = 0x5193; unicode_map[0x514B] = 0x5195; unicode_map[0x514C] = 0x5196; unicode_map[0x514D] = 0x51A4; unicode_map[0x514E] = 0x51A6; unicode_map[0x514F] = 0x51A2; unicode_map[0x5150] = 0x51A9; unicode_map[0x5151] = 0x51AA; unicode_map[0x5152] = 0x51AB; unicode_map[0x5153] = 0x51B3; unicode_map[0x5154] = 0x51B1; unicode_map[0x5155] = 0x51B2; unicode_map[0x5156] = 0x51B0; unicode_map[0x5157] = 0x51B5; unicode_map[0x5158] = 0x51BD; unicode_map[0x5159] = 0x51C5; unicode_map[0x515A] = 0x51C9; unicode_map[0x515B] = 0x51DB; unicode_map[0x515C] = 0x51E0; unicode_map[0x515D] = 0x8655; unicode_map[0x515E] = 0x51E9; unicode_map[0x515F] = 0x51ED; unicode_map[0x5160] = 0x51F0; unicode_map[0x5161] = 0x51F5; unicode_map[0x5162] = 0x51FE; unicode_map[0x5163] = 0x5204; unicode_map[0x5164] = 0x520B; unicode_map[0x5165] = 0x5214; unicode_map[0x5166] = 0x520E; unicode_map[0x5167] = 0x5227; unicode_map[0x5168] = 0x522A; unicode_map[0x5169] = 0x522E; unicode_map[0x516A] = 0x5233; unicode_map[0x516B] = 0x5239; unicode_map[0x516C] = 0x524F; unicode_map[0x516D] = 0x5244; unicode_map[0x516E] = 0x524B; unicode_map[0x516F] = 0x524C; unicode_map[0x5170] = 0x525E; unicode_map[0x5171] = 0x5254; unicode_map[0x5172] = 0x526A; unicode_map[0x5173] = 0x5274; unicode_map[0x5174] = 0x5269; unicode_map[0x5175] = 0x5273; unicode_map[0x5176] = 0x527F; unicode_map[0x5177] = 0x527D; unicode_map[0x5178] = 0x528D; unicode_map[0x5179] = 0x5294; unicode_map[0x517A] = 0x5292; unicode_map[0x517B] = 0x5271; unicode_map[0x517C] = 0x5288; unicode_map[0x517D] = 0x5291; unicode_map[0x517E] = 0x8FA8; unicode_map[0x5221] = 0x8FA7; unicode_map[0x5222] = 0x52AC; unicode_map[0x5223] = 0x52AD; unicode_map[0x5224] = 0x52BC; unicode_map[0x5225] = 0x52B5; unicode_map[0x5226] = 0x52C1; unicode_map[0x5227] = 0x52CD; unicode_map[0x5228] = 0x52D7; unicode_map[0x5229] = 0x52DE; unicode_map[0x522A] = 0x52E3; unicode_map[0x522B] = 0x52E6; unicode_map[0x522C] = 0x98ED; unicode_map[0x522D] = 0x52E0; unicode_map[0x522E] = 0x52F3; unicode_map[0x522F] = 0x52F5; unicode_map[0x5230] = 0x52F8; unicode_map[0x5231] = 0x52F9; unicode_map[0x5232] = 0x5306; unicode_map[0x5233] = 0x5308; unicode_map[0x5234] = 0x7538; unicode_map[0x5235] = 0x530D; unicode_map[0x5236] = 0x5310; unicode_map[0x5237] = 0x530F; unicode_map[0x5238] = 0x5315; unicode_map[0x5239] = 0x531A; unicode_map[0x523A] = 0x5323; unicode_map[0x523B] = 0x532F; unicode_map[0x523C] = 0x5331; unicode_map[0x523D] = 0x5333; unicode_map[0x523E] = 0x5338; unicode_map[0x523F] = 0x5340; unicode_map[0x5240] = 0x5346; unicode_map[0x5241] = 0x5345; unicode_map[0x5242] = 0x4E17; unicode_map[0x5243] = 0x5349; unicode_map[0x5244] = 0x534D; unicode_map[0x5245] = 0x51D6; unicode_map[0x5246] = 0x535E; unicode_map[0x5247] = 0x5369; unicode_map[0x5248] = 0x536E; unicode_map[0x5249] = 0x5918; unicode_map[0x524A] = 0x537B; unicode_map[0x524B] = 0x5377; unicode_map[0x524C] = 0x5382; unicode_map[0x524D] = 0x5396; unicode_map[0x524E] = 0x53A0; unicode_map[0x524F] = 0x53A6; unicode_map[0x5250] = 0x53A5; unicode_map[0x5251] = 0x53AE; unicode_map[0x5252] = 0x53B0; unicode_map[0x5253] = 0x53B6; unicode_map[0x5254] = 0x53C3; unicode_map[0x5255] = 0x7C12; unicode_map[0x5256] = 0x96D9; unicode_map[0x5257] = 0x53DF; unicode_map[0x5258] = 0x66FC; unicode_map[0x5259] = 0x71EE; unicode_map[0x525A] = 0x53EE; unicode_map[0x525B] = 0x53E8; unicode_map[0x525C] = 0x53ED; unicode_map[0x525D] = 0x53FA; unicode_map[0x525E] = 0x5401; unicode_map[0x525F] = 0x543D; unicode_map[0x5260] = 0x5440; unicode_map[0x5261] = 0x542C; unicode_map[0x5262] = 0x542D; unicode_map[0x5263] = 0x543C; unicode_map[0x5264] = 0x542E; unicode_map[0x5265] = 0x5436; unicode_map[0x5266] = 0x5429; unicode_map[0x5267] = 0x541D; unicode_map[0x5268] = 0x544E; unicode_map[0x5269] = 0x548F; unicode_map[0x526A] = 0x5475; unicode_map[0x526B] = 0x548E; unicode_map[0x526C] = 0x545F; unicode_map[0x526D] = 0x5471; unicode_map[0x526E] = 0x5477; unicode_map[0x526F] = 0x5470; unicode_map[0x5270] = 0x5492; unicode_map[0x5271] = 0x547B; unicode_map[0x5272] = 0x5480; unicode_map[0x5273] = 0x5476; unicode_map[0x5274] = 0x5484; unicode_map[0x5275] = 0x5490; unicode_map[0x5276] = 0x5486; unicode_map[0x5277] = 0x54C7; unicode_map[0x5278] = 0x54A2; unicode_map[0x5279] = 0x54B8; unicode_map[0x527A] = 0x54A5; unicode_map[0x527B] = 0x54AC; unicode_map[0x527C] = 0x54C4; unicode_map[0x527D] = 0x54C8; unicode_map[0x527E] = 0x54A8; unicode_map[0x5321] = 0x54AB; unicode_map[0x5322] = 0x54C2; unicode_map[0x5323] = 0x54A4; unicode_map[0x5324] = 0x54BE; unicode_map[0x5325] = 0x54BC; unicode_map[0x5326] = 0x54D8; unicode_map[0x5327] = 0x54E5; unicode_map[0x5328] = 0x54E6; unicode_map[0x5329] = 0x550F; unicode_map[0x532A] = 0x5514; unicode_map[0x532B] = 0x54FD; unicode_map[0x532C] = 0x54EE; unicode_map[0x532D] = 0x54ED; unicode_map[0x532E] = 0x54FA; unicode_map[0x532F] = 0x54E2; unicode_map[0x5330] = 0x5539; unicode_map[0x5331] = 0x5540; unicode_map[0x5332] = 0x5563; unicode_map[0x5333] = 0x554C; unicode_map[0x5334] = 0x552E; unicode_map[0x5335] = 0x555C; unicode_map[0x5336] = 0x5545; unicode_map[0x5337] = 0x5556; unicode_map[0x5338] = 0x5557; unicode_map[0x5339] = 0x5538; unicode_map[0x533A] = 0x5533; unicode_map[0x533B] = 0x555D; unicode_map[0x533C] = 0x5599; unicode_map[0x533D] = 0x5580; unicode_map[0x533E] = 0x54AF; unicode_map[0x533F] = 0x558A; unicode_map[0x5340] = 0x559F; unicode_map[0x5341] = 0x557B; unicode_map[0x5342] = 0x557E; unicode_map[0x5343] = 0x5598; unicode_map[0x5344] = 0x559E; unicode_map[0x5345] = 0x55AE; unicode_map[0x5346] = 0x557C; unicode_map[0x5347] = 0x5583; unicode_map[0x5348] = 0x55A9; unicode_map[0x5349] = 0x5587; unicode_map[0x534A] = 0x55A8; unicode_map[0x534B] = 0x55DA; unicode_map[0x534C] = 0x55C5; unicode_map[0x534D] = 0x55DF; unicode_map[0x534E] = 0x55C4; unicode_map[0x534F] = 0x55DC; unicode_map[0x5350] = 0x55E4; unicode_map[0x5351] = 0x55D4; unicode_map[0x5352] = 0x5614; unicode_map[0x5353] = 0x55F7; unicode_map[0x5354] = 0x5616; unicode_map[0x5355] = 0x55FE; unicode_map[0x5356] = 0x55FD; unicode_map[0x5357] = 0x561B; unicode_map[0x5358] = 0x55F9; unicode_map[0x5359] = 0x564E; unicode_map[0x535A] = 0x5650; unicode_map[0x535B] = 0x71DF; unicode_map[0x535C] = 0x5634; unicode_map[0x535D] = 0x5636; unicode_map[0x535E] = 0x5632; unicode_map[0x535F] = 0x5638; unicode_map[0x5360] = 0x566B; unicode_map[0x5361] = 0x5664; unicode_map[0x5362] = 0x562F; unicode_map[0x5363] = 0x566C; unicode_map[0x5364] = 0x566A; unicode_map[0x5365] = 0x5686; unicode_map[0x5366] = 0x5680; unicode_map[0x5367] = 0x568A; unicode_map[0x5368] = 0x56A0; unicode_map[0x5369] = 0x5694; unicode_map[0x536A] = 0x568F; unicode_map[0x536B] = 0x56A5; unicode_map[0x536C] = 0x56AE; unicode_map[0x536D] = 0x56B6; unicode_map[0x536E] = 0x56B4; unicode_map[0x536F] = 0x56C2; unicode_map[0x5370] = 0x56BC; unicode_map[0x5371] = 0x56C1; unicode_map[0x5372] = 0x56C3; unicode_map[0x5373] = 0x56C0; unicode_map[0x5374] = 0x56C8; unicode_map[0x5375] = 0x56CE; unicode_map[0x5376] = 0x56D1; unicode_map[0x5377] = 0x56D3; unicode_map[0x5378] = 0x56D7; unicode_map[0x5379] = 0x56EE; unicode_map[0x537A] = 0x56F9; unicode_map[0x537B] = 0x5700; unicode_map[0x537C] = 0x56FF; unicode_map[0x537D] = 0x5704; unicode_map[0x537E] = 0x5709; unicode_map[0x5421] = 0x5708; unicode_map[0x5422] = 0x570B; unicode_map[0x5423] = 0x570D; unicode_map[0x5424] = 0x5713; unicode_map[0x5425] = 0x5718; unicode_map[0x5426] = 0x5716; unicode_map[0x5427] = 0x55C7; unicode_map[0x5428] = 0x571C; unicode_map[0x5429] = 0x5726; unicode_map[0x542A] = 0x5737; unicode_map[0x542B] = 0x5738; unicode_map[0x542C] = 0x574E; unicode_map[0x542D] = 0x573B; unicode_map[0x542E] = 0x5740; unicode_map[0x542F] = 0x574F; unicode_map[0x5430] = 0x5769; unicode_map[0x5431] = 0x57C0; unicode_map[0x5432] = 0x5788; unicode_map[0x5433] = 0x5761; unicode_map[0x5434] = 0x577F; unicode_map[0x5435] = 0x5789; unicode_map[0x5436] = 0x5793; unicode_map[0x5437] = 0x57A0; unicode_map[0x5438] = 0x57B3; unicode_map[0x5439] = 0x57A4; unicode_map[0x543A] = 0x57AA; unicode_map[0x543B] = 0x57B0; unicode_map[0x543C] = 0x57C3; unicode_map[0x543D] = 0x57C6; unicode_map[0x543E] = 0x57D4; unicode_map[0x543F] = 0x57D2; unicode_map[0x5440] = 0x57D3; unicode_map[0x5441] = 0x580A; unicode_map[0x5442] = 0x57D6; unicode_map[0x5443] = 0x57E3; unicode_map[0x5444] = 0x580B; unicode_map[0x5445] = 0x5819; unicode_map[0x5446] = 0x581D; unicode_map[0x5447] = 0x5872; unicode_map[0x5448] = 0x5821; unicode_map[0x5449] = 0x5862; unicode_map[0x544A] = 0x584B; unicode_map[0x544B] = 0x5870; unicode_map[0x544C] = 0x6BC0; unicode_map[0x544D] = 0x5852; unicode_map[0x544E] = 0x583D; unicode_map[0x544F] = 0x5879; unicode_map[0x5450] = 0x5885; unicode_map[0x5451] = 0x58B9; unicode_map[0x5452] = 0x589F; unicode_map[0x5453] = 0x58AB; unicode_map[0x5454] = 0x58BA; unicode_map[0x5455] = 0x58DE; unicode_map[0x5456] = 0x58BB; unicode_map[0x5457] = 0x58B8; unicode_map[0x5458] = 0x58AE; unicode_map[0x5459] = 0x58C5; unicode_map[0x545A] = 0x58D3; unicode_map[0x545B] = 0x58D1; unicode_map[0x545C] = 0x58D7; unicode_map[0x545D] = 0x58D9; unicode_map[0x545E] = 0x58D8; unicode_map[0x545F] = 0x58E5; unicode_map[0x5460] = 0x58DC; unicode_map[0x5461] = 0x58E4; unicode_map[0x5462] = 0x58DF; unicode_map[0x5463] = 0x58EF; unicode_map[0x5464] = 0x58FA; unicode_map[0x5465] = 0x58F9; unicode_map[0x5466] = 0x58FB; unicode_map[0x5467] = 0x58FC; unicode_map[0x5468] = 0x58FD; unicode_map[0x5469] = 0x5902; unicode_map[0x546A] = 0x590A; unicode_map[0x546B] = 0x5910; unicode_map[0x546C] = 0x591B; unicode_map[0x546D] = 0x68A6; unicode_map[0x546E] = 0x5925; unicode_map[0x546F] = 0x592C; unicode_map[0x5470] = 0x592D; unicode_map[0x5471] = 0x5932; unicode_map[0x5472] = 0x5938; unicode_map[0x5473] = 0x593E; unicode_map[0x5474] = 0x7AD2; unicode_map[0x5475] = 0x5955; unicode_map[0x5476] = 0x5950; unicode_map[0x5477] = 0x594E; unicode_map[0x5478] = 0x595A; unicode_map[0x5479] = 0x5958; unicode_map[0x547A] = 0x5962; unicode_map[0x547B] = 0x5960; unicode_map[0x547C] = 0x5967; unicode_map[0x547D] = 0x596C; unicode_map[0x547E] = 0x5969; unicode_map[0x5521] = 0x5978; unicode_map[0x5522] = 0x5981; unicode_map[0x5523] = 0x599D; unicode_map[0x5524] = 0x4F5E; unicode_map[0x5525] = 0x4FAB; unicode_map[0x5526] = 0x59A3; unicode_map[0x5527] = 0x59B2; unicode_map[0x5528] = 0x59C6; unicode_map[0x5529] = 0x59E8; unicode_map[0x552A] = 0x59DC; unicode_map[0x552B] = 0x598D; unicode_map[0x552C] = 0x59D9; unicode_map[0x552D] = 0x59DA; unicode_map[0x552E] = 0x5A25; unicode_map[0x552F] = 0x5A1F; unicode_map[0x5530] = 0x5A11; unicode_map[0x5531] = 0x5A1C; unicode_map[0x5532] = 0x5A09; unicode_map[0x5533] = 0x5A1A; unicode_map[0x5534] = 0x5A40; unicode_map[0x5535] = 0x5A6C; unicode_map[0x5536] = 0x5A49; unicode_map[0x5537] = 0x5A35; unicode_map[0x5538] = 0x5A36; unicode_map[0x5539] = 0x5A62; unicode_map[0x553A] = 0x5A6A; unicode_map[0x553B] = 0x5A9A; unicode_map[0x553C] = 0x5ABC; unicode_map[0x553D] = 0x5ABE; unicode_map[0x553E] = 0x5ACB; unicode_map[0x553F] = 0x5AC2; unicode_map[0x5540] = 0x5ABD; unicode_map[0x5541] = 0x5AE3; unicode_map[0x5542] = 0x5AD7; unicode_map[0x5543] = 0x5AE6; unicode_map[0x5544] = 0x5AE9; unicode_map[0x5545] = 0x5AD6; unicode_map[0x5546] = 0x5AFA; unicode_map[0x5547] = 0x5AFB; unicode_map[0x5548] = 0x5B0C; unicode_map[0x5549] = 0x5B0B; unicode_map[0x554A] = 0x5B16; unicode_map[0x554B] = 0x5B32; unicode_map[0x554C] = 0x5AD0; unicode_map[0x554D] = 0x5B2A; unicode_map[0x554E] = 0x5B36; unicode_map[0x554F] = 0x5B3E; unicode_map[0x5550] = 0x5B43; unicode_map[0x5551] = 0x5B45; unicode_map[0x5552] = 0x5B40; unicode_map[0x5553] = 0x5B51; unicode_map[0x5554] = 0x5B55; unicode_map[0x5555] = 0x5B5A; unicode_map[0x5556] = 0x5B5B; unicode_map[0x5557] = 0x5B65; unicode_map[0x5558] = 0x5B69; unicode_map[0x5559] = 0x5B70; unicode_map[0x555A] = 0x5B73; unicode_map[0x555B] = 0x5B75; unicode_map[0x555C] = 0x5B78; unicode_map[0x555D] = 0x6588; unicode_map[0x555E] = 0x5B7A; unicode_map[0x555F] = 0x5B80; unicode_map[0x5560] = 0x5B83; unicode_map[0x5561] = 0x5BA6; unicode_map[0x5562] = 0x5BB8; unicode_map[0x5563] = 0x5BC3; unicode_map[0x5564] = 0x5BC7; unicode_map[0x5565] = 0x5BC9; unicode_map[0x5566] = 0x5BD4; unicode_map[0x5567] = 0x5BD0; unicode_map[0x5568] = 0x5BE4; unicode_map[0x5569] = 0x5BE6; unicode_map[0x556A] = 0x5BE2; unicode_map[0x556B] = 0x5BDE; unicode_map[0x556C] = 0x5BE5; unicode_map[0x556D] = 0x5BEB; unicode_map[0x556E] = 0x5BF0; unicode_map[0x556F] = 0x5BF6; unicode_map[0x5570] = 0x5BF3; unicode_map[0x5571] = 0x5C05; unicode_map[0x5572] = 0x5C07; unicode_map[0x5573] = 0x5C08; unicode_map[0x5574] = 0x5C0D; unicode_map[0x5575] = 0x5C13; unicode_map[0x5576] = 0x5C20; unicode_map[0x5577] = 0x5C22; unicode_map[0x5578] = 0x5C28; unicode_map[0x5579] = 0x5C38; unicode_map[0x557A] = 0x5C39; unicode_map[0x557B] = 0x5C41; unicode_map[0x557C] = 0x5C46; unicode_map[0x557D] = 0x5C4E; unicode_map[0x557E] = 0x5C53; unicode_map[0x5621] = 0x5C50; unicode_map[0x5622] = 0x5C4F; unicode_map[0x5623] = 0x5B71; unicode_map[0x5624] = 0x5C6C; unicode_map[0x5625] = 0x5C6E; unicode_map[0x5626] = 0x4E62; unicode_map[0x5627] = 0x5C76; unicode_map[0x5628] = 0x5C79; unicode_map[0x5629] = 0x5C8C; unicode_map[0x562A] = 0x5C91; unicode_map[0x562B] = 0x5C94; unicode_map[0x562C] = 0x599B; unicode_map[0x562D] = 0x5CAB; unicode_map[0x562E] = 0x5CBB; unicode_map[0x562F] = 0x5CB6; unicode_map[0x5630] = 0x5CBC; unicode_map[0x5631] = 0x5CB7; unicode_map[0x5632] = 0x5CC5; unicode_map[0x5633] = 0x5CBE; unicode_map[0x5634] = 0x5CC7; unicode_map[0x5635] = 0x5CD9; unicode_map[0x5636] = 0x5CE9; unicode_map[0x5637] = 0x5CFD; unicode_map[0x5638] = 0x5CFA; unicode_map[0x5639] = 0x5CED; unicode_map[0x563A] = 0x5D8C; unicode_map[0x563B] = 0x5CEA; unicode_map[0x563C] = 0x5D0B; unicode_map[0x563D] = 0x5D15; unicode_map[0x563E] = 0x5D17; unicode_map[0x563F] = 0x5D5C; unicode_map[0x5640] = 0x5D1F; unicode_map[0x5641] = 0x5D1B; unicode_map[0x5642] = 0x5D11; unicode_map[0x5643] = 0x5D14; unicode_map[0x5644] = 0x5D22; unicode_map[0x5645] = 0x5D1A; unicode_map[0x5646] = 0x5D19; unicode_map[0x5647] = 0x5D18; unicode_map[0x5648] = 0x5D4C; unicode_map[0x5649] = 0x5D52; unicode_map[0x564A] = 0x5D4E; unicode_map[0x564B] = 0x5D4B; unicode_map[0x564C] = 0x5D6C; unicode_map[0x564D] = 0x5D73; unicode_map[0x564E] = 0x5D76; unicode_map[0x564F] = 0x5D87; unicode_map[0x5650] = 0x5D84; unicode_map[0x5651] = 0x5D82; unicode_map[0x5652] = 0x5DA2; unicode_map[0x5653] = 0x5D9D; unicode_map[0x5654] = 0x5DAC; unicode_map[0x5655] = 0x5DAE; unicode_map[0x5656] = 0x5DBD; unicode_map[0x5657] = 0x5D90; unicode_map[0x5658] = 0x5DB7; unicode_map[0x5659] = 0x5DBC; unicode_map[0x565A] = 0x5DC9; unicode_map[0x565B] = 0x5DCD; unicode_map[0x565C] = 0x5DD3; unicode_map[0x565D] = 0x5DD2; unicode_map[0x565E] = 0x5DD6; unicode_map[0x565F] = 0x5DDB; unicode_map[0x5660] = 0x5DEB; unicode_map[0x5661] = 0x5DF2; unicode_map[0x5662] = 0x5DF5; unicode_map[0x5663] = 0x5E0B; unicode_map[0x5664] = 0x5E1A; unicode_map[0x5665] = 0x5E19; unicode_map[0x5666] = 0x5E11; unicode_map[0x5667] = 0x5E1B; unicode_map[0x5668] = 0x5E36; unicode_map[0x5669] = 0x5E37; unicode_map[0x566A] = 0x5E44; unicode_map[0x566B] = 0x5E43; unicode_map[0x566C] = 0x5E40; unicode_map[0x566D] = 0x5E4E; unicode_map[0x566E] = 0x5E57; unicode_map[0x566F] = 0x5E54; unicode_map[0x5670] = 0x5E5F; unicode_map[0x5671] = 0x5E62; unicode_map[0x5672] = 0x5E64; unicode_map[0x5673] = 0x5E47; unicode_map[0x5674] = 0x5E75; unicode_map[0x5675] = 0x5E76; unicode_map[0x5676] = 0x5E7A; unicode_map[0x5677] = 0x9EBC; unicode_map[0x5678] = 0x5E7F; unicode_map[0x5679] = 0x5EA0; unicode_map[0x567A] = 0x5EC1; unicode_map[0x567B] = 0x5EC2; unicode_map[0x567C] = 0x5EC8; unicode_map[0x567D] = 0x5ED0; unicode_map[0x567E] = 0x5ECF; unicode_map[0x5721] = 0x5ED6; unicode_map[0x5722] = 0x5EE3; unicode_map[0x5723] = 0x5EDD; unicode_map[0x5724] = 0x5EDA; unicode_map[0x5725] = 0x5EDB; unicode_map[0x5726] = 0x5EE2; unicode_map[0x5727] = 0x5EE1; unicode_map[0x5728] = 0x5EE8; unicode_map[0x5729] = 0x5EE9; unicode_map[0x572A] = 0x5EEC; unicode_map[0x572B] = 0x5EF1; unicode_map[0x572C] = 0x5EF3; unicode_map[0x572D] = 0x5EF0; unicode_map[0x572E] = 0x5EF4; unicode_map[0x572F] = 0x5EF8; unicode_map[0x5730] = 0x5EFE; unicode_map[0x5731] = 0x5F03; unicode_map[0x5732] = 0x5F09; unicode_map[0x5733] = 0x5F5D; unicode_map[0x5734] = 0x5F5C; unicode_map[0x5735] = 0x5F0B; unicode_map[0x5736] = 0x5F11; unicode_map[0x5737] = 0x5F16; unicode_map[0x5738] = 0x5F29; unicode_map[0x5739] = 0x5F2D; unicode_map[0x573A] = 0x5F38; unicode_map[0x573B] = 0x5F41; unicode_map[0x573C] = 0x5F48; unicode_map[0x573D] = 0x5F4C; unicode_map[0x573E] = 0x5F4E; unicode_map[0x573F] = 0x5F2F; unicode_map[0x5740] = 0x5F51; unicode_map[0x5741] = 0x5F56; unicode_map[0x5742] = 0x5F57; unicode_map[0x5743] = 0x5F59; unicode_map[0x5744] = 0x5F61; unicode_map[0x5745] = 0x5F6D; unicode_map[0x5746] = 0x5F73; unicode_map[0x5747] = 0x5F77; unicode_map[0x5748] = 0x5F83; unicode_map[0x5749] = 0x5F82; unicode_map[0x574A] = 0x5F7F; unicode_map[0x574B] = 0x5F8A; unicode_map[0x574C] = 0x5F88; unicode_map[0x574D] = 0x5F91; unicode_map[0x574E] = 0x5F87; unicode_map[0x574F] = 0x5F9E; unicode_map[0x5750] = 0x5F99; unicode_map[0x5751] = 0x5F98; unicode_map[0x5752] = 0x5FA0; unicode_map[0x5753] = 0x5FA8; unicode_map[0x5754] = 0x5FAD; unicode_map[0x5755] = 0x5FBC; unicode_map[0x5756] = 0x5FD6; unicode_map[0x5757] = 0x5FFB; unicode_map[0x5758] = 0x5FE4; unicode_map[0x5759] = 0x5FF8; unicode_map[0x575A] = 0x5FF1; unicode_map[0x575B] = 0x5FDD; unicode_map[0x575C] = 0x60B3; unicode_map[0x575D] = 0x5FFF; unicode_map[0x575E] = 0x6021; unicode_map[0x575F] = 0x6060; unicode_map[0x5760] = 0x6019; unicode_map[0x5761] = 0x6010; unicode_map[0x5762] = 0x6029; unicode_map[0x5763] = 0x600E; unicode_map[0x5764] = 0x6031; unicode_map[0x5765] = 0x601B; unicode_map[0x5766] = 0x6015; unicode_map[0x5767] = 0x602B; unicode_map[0x5768] = 0x6026; unicode_map[0x5769] = 0x600F; unicode_map[0x576A] = 0x603A; unicode_map[0x576B] = 0x605A; unicode_map[0x576C] = 0x6041; unicode_map[0x576D] = 0x606A; unicode_map[0x576E] = 0x6077; unicode_map[0x576F] = 0x605F; unicode_map[0x5770] = 0x604A; unicode_map[0x5771] = 0x6046; unicode_map[0x5772] = 0x604D; unicode_map[0x5773] = 0x6063; unicode_map[0x5774] = 0x6043; unicode_map[0x5775] = 0x6064; unicode_map[0x5776] = 0x6042; unicode_map[0x5777] = 0x606C; unicode_map[0x5778] = 0x606B; unicode_map[0x5779] = 0x6059; unicode_map[0x577A] = 0x6081; unicode_map[0x577B] = 0x608D; unicode_map[0x577C] = 0x60E7; unicode_map[0x577D] = 0x6083; unicode_map[0x577E] = 0x609A; unicode_map[0x5821] = 0x6084; unicode_map[0x5822] = 0x609B; unicode_map[0x5823] = 0x6096; unicode_map[0x5824] = 0x6097; unicode_map[0x5825] = 0x6092; unicode_map[0x5826] = 0x60A7; unicode_map[0x5827] = 0x608B; unicode_map[0x5828] = 0x60E1; unicode_map[0x5829] = 0x60B8; unicode_map[0x582A] = 0x60E0; unicode_map[0x582B] = 0x60D3; unicode_map[0x582C] = 0x60B4; unicode_map[0x582D] = 0x5FF0; unicode_map[0x582E] = 0x60BD; unicode_map[0x582F] = 0x60C6; unicode_map[0x5830] = 0x60B5; unicode_map[0x5831] = 0x60D8; unicode_map[0x5832] = 0x614D; unicode_map[0x5833] = 0x6115; unicode_map[0x5834] = 0x6106; unicode_map[0x5835] = 0x60F6; unicode_map[0x5836] = 0x60F7; unicode_map[0x5837] = 0x6100; unicode_map[0x5838] = 0x60F4; unicode_map[0x5839] = 0x60FA; unicode_map[0x583A] = 0x6103; unicode_map[0x583B] = 0x6121; unicode_map[0x583C] = 0x60FB; unicode_map[0x583D] = 0x60F1; unicode_map[0x583E] = 0x610D; unicode_map[0x583F] = 0x610E; unicode_map[0x5840] = 0x6147; unicode_map[0x5841] = 0x613E; unicode_map[0x5842] = 0x6128; unicode_map[0x5843] = 0x6127; unicode_map[0x5844] = 0x614A; unicode_map[0x5845] = 0x613F; unicode_map[0x5846] = 0x613C; unicode_map[0x5847] = 0x612C; unicode_map[0x5848] = 0x6134; unicode_map[0x5849] = 0x613D; unicode_map[0x584A] = 0x6142; unicode_map[0x584B] = 0x6144; unicode_map[0x584C] = 0x6173; unicode_map[0x584D] = 0x6177; unicode_map[0x584E] = 0x6158; unicode_map[0x584F] = 0x6159; unicode_map[0x5850] = 0x615A; unicode_map[0x5851] = 0x616B; unicode_map[0x5852] = 0x6174; unicode_map[0x5853] = 0x616F; unicode_map[0x5854] = 0x6165; unicode_map[0x5855] = 0x6171; unicode_map[0x5856] = 0x615F; unicode_map[0x5857] = 0x615D; unicode_map[0x5858] = 0x6153; unicode_map[0x5859] = 0x6175; unicode_map[0x585A] = 0x6199; unicode_map[0x585B] = 0x6196; unicode_map[0x585C] = 0x6187; unicode_map[0x585D] = 0x61AC; unicode_map[0x585E] = 0x6194; unicode_map[0x585F] = 0x619A; unicode_map[0x5860] = 0x618A; unicode_map[0x5861] = 0x6191; unicode_map[0x5862] = 0x61AB; unicode_map[0x5863] = 0x61AE; unicode_map[0x5864] = 0x61CC; unicode_map[0x5865] = 0x61CA; unicode_map[0x5866] = 0x61C9; unicode_map[0x5867] = 0x61F7; unicode_map[0x5868] = 0x61C8; unicode_map[0x5869] = 0x61C3; unicode_map[0x586A] = 0x61C6; unicode_map[0x586B] = 0x61BA; unicode_map[0x586C] = 0x61CB; unicode_map[0x586D] = 0x7F79; unicode_map[0x586E] = 0x61CD; unicode_map[0x586F] = 0x61E6; unicode_map[0x5870] = 0x61E3; unicode_map[0x5871] = 0x61F6; unicode_map[0x5872] = 0x61FA; unicode_map[0x5873] = 0x61F4; unicode_map[0x5874] = 0x61FF; unicode_map[0x5875] = 0x61FD; unicode_map[0x5876] = 0x61FC; unicode_map[0x5877] = 0x61FE; unicode_map[0x5878] = 0x6200; unicode_map[0x5879] = 0x6208; unicode_map[0x587A] = 0x6209; unicode_map[0x587B] = 0x620D; unicode_map[0x587C] = 0x620C; unicode_map[0x587D] = 0x6214; unicode_map[0x587E] = 0x621B; unicode_map[0x5921] = 0x621E; unicode_map[0x5922] = 0x6221; unicode_map[0x5923] = 0x622A; unicode_map[0x5924] = 0x622E; unicode_map[0x5925] = 0x6230; unicode_map[0x5926] = 0x6232; unicode_map[0x5927] = 0x6233; unicode_map[0x5928] = 0x6241; unicode_map[0x5929] = 0x624E; unicode_map[0x592A] = 0x625E; unicode_map[0x592B] = 0x6263; unicode_map[0x592C] = 0x625B; unicode_map[0x592D] = 0x6260; unicode_map[0x592E] = 0x6268; unicode_map[0x592F] = 0x627C; unicode_map[0x5930] = 0x6282; unicode_map[0x5931] = 0x6289; unicode_map[0x5932] = 0x627E; unicode_map[0x5933] = 0x6292; unicode_map[0x5934] = 0x6293; unicode_map[0x5935] = 0x6296; unicode_map[0x5936] = 0x62D4; unicode_map[0x5937] = 0x6283; unicode_map[0x5938] = 0x6294; unicode_map[0x5939] = 0x62D7; unicode_map[0x593A] = 0x62D1; unicode_map[0x593B] = 0x62BB; unicode_map[0x593C] = 0x62CF; unicode_map[0x593D] = 0x62FF; unicode_map[0x593E] = 0x62C6; unicode_map[0x593F] = 0x64D4; unicode_map[0x5940] = 0x62C8; unicode_map[0x5941] = 0x62DC; unicode_map[0x5942] = 0x62CC; unicode_map[0x5943] = 0x62CA; unicode_map[0x5944] = 0x62C2; unicode_map[0x5945] = 0x62C7; unicode_map[0x5946] = 0x629B; unicode_map[0x5947] = 0x62C9; unicode_map[0x5948] = 0x630C; unicode_map[0x5949] = 0x62EE; unicode_map[0x594A] = 0x62F1; unicode_map[0x594B] = 0x6327; unicode_map[0x594C] = 0x6302; unicode_map[0x594D] = 0x6308; unicode_map[0x594E] = 0x62EF; unicode_map[0x594F] = 0x62F5; unicode_map[0x5950] = 0x6350; unicode_map[0x5951] = 0x633E; unicode_map[0x5952] = 0x634D; unicode_map[0x5953] = 0x641C; unicode_map[0x5954] = 0x634F; unicode_map[0x5955] = 0x6396; unicode_map[0x5956] = 0x638E; unicode_map[0x5957] = 0x6380; unicode_map[0x5958] = 0x63AB; unicode_map[0x5959] = 0x6376; unicode_map[0x595A] = 0x63A3; unicode_map[0x595B] = 0x638F; unicode_map[0x595C] = 0x6389; unicode_map[0x595D] = 0x639F; unicode_map[0x595E] = 0x63B5; unicode_map[0x595F] = 0x636B; unicode_map[0x5960] = 0x6369; unicode_map[0x5961] = 0x63BE; unicode_map[0x5962] = 0x63E9; unicode_map[0x5963] = 0x63C0; unicode_map[0x5964] = 0x63C6; unicode_map[0x5965] = 0x63E3; unicode_map[0x5966] = 0x63C9; unicode_map[0x5967] = 0x63D2; unicode_map[0x5968] = 0x63F6; unicode_map[0x5969] = 0x63C4; unicode_map[0x596A] = 0x6416; unicode_map[0x596B] = 0x6434; unicode_map[0x596C] = 0x6406; unicode_map[0x596D] = 0x6413; unicode_map[0x596E] = 0x6426; unicode_map[0x596F] = 0x6436; unicode_map[0x5970] = 0x651D; unicode_map[0x5971] = 0x6417; unicode_map[0x5972] = 0x6428; unicode_map[0x5973] = 0x640F; unicode_map[0x5974] = 0x6467; unicode_map[0x5975] = 0x646F; unicode_map[0x5976] = 0x6476; unicode_map[0x5977] = 0x644E; unicode_map[0x5978] = 0x652A; unicode_map[0x5979] = 0x6495; unicode_map[0x597A] = 0x6493; unicode_map[0x597B] = 0x64A5; unicode_map[0x597C] = 0x64A9; unicode_map[0x597D] = 0x6488; unicode_map[0x597E] = 0x64BC; unicode_map[0x5A21] = 0x64DA; unicode_map[0x5A22] = 0x64D2; unicode_map[0x5A23] = 0x64C5; unicode_map[0x5A24] = 0x64C7; unicode_map[0x5A25] = 0x64BB; unicode_map[0x5A26] = 0x64D8; unicode_map[0x5A27] = 0x64C2; unicode_map[0x5A28] = 0x64F1; unicode_map[0x5A29] = 0x64E7; unicode_map[0x5A2A] = 0x8209; unicode_map[0x5A2B] = 0x64E0; unicode_map[0x5A2C] = 0x64E1; unicode_map[0x5A2D] = 0x62AC; unicode_map[0x5A2E] = 0x64E3; unicode_map[0x5A2F] = 0x64EF; unicode_map[0x5A30] = 0x652C; unicode_map[0x5A31] = 0x64F6; unicode_map[0x5A32] = 0x64F4; unicode_map[0x5A33] = 0x64F2; unicode_map[0x5A34] = 0x64FA; unicode_map[0x5A35] = 0x6500; unicode_map[0x5A36] = 0x64FD; unicode_map[0x5A37] = 0x6518; unicode_map[0x5A38] = 0x651C; unicode_map[0x5A39] = 0x6505; unicode_map[0x5A3A] = 0x6524; unicode_map[0x5A3B] = 0x6523; unicode_map[0x5A3C] = 0x652B; unicode_map[0x5A3D] = 0x6534; unicode_map[0x5A3E] = 0x6535; unicode_map[0x5A3F] = 0x6537; unicode_map[0x5A40] = 0x6536; unicode_map[0x5A41] = 0x6538; unicode_map[0x5A42] = 0x754B; unicode_map[0x5A43] = 0x6548; unicode_map[0x5A44] = 0x6556; unicode_map[0x5A45] = 0x6555; unicode_map[0x5A46] = 0x654D; unicode_map[0x5A47] = 0x6558; unicode_map[0x5A48] = 0x655E; unicode_map[0x5A49] = 0x655D; unicode_map[0x5A4A] = 0x6572; unicode_map[0x5A4B] = 0x6578; unicode_map[0x5A4C] = 0x6582; unicode_map[0x5A4D] = 0x6583; unicode_map[0x5A4E] = 0x8B8A; unicode_map[0x5A4F] = 0x659B; unicode_map[0x5A50] = 0x659F; unicode_map[0x5A51] = 0x65AB; unicode_map[0x5A52] = 0x65B7; unicode_map[0x5A53] = 0x65C3; unicode_map[0x5A54] = 0x65C6; unicode_map[0x5A55] = 0x65C1; unicode_map[0x5A56] = 0x65C4; unicode_map[0x5A57] = 0x65CC; unicode_map[0x5A58] = 0x65D2; unicode_map[0x5A59] = 0x65DB; unicode_map[0x5A5A] = 0x65D9; unicode_map[0x5A5B] = 0x65E0; unicode_map[0x5A5C] = 0x65E1; unicode_map[0x5A5D] = 0x65F1; unicode_map[0x5A5E] = 0x6772; unicode_map[0x5A5F] = 0x660A; unicode_map[0x5A60] = 0x6603; unicode_map[0x5A61] = 0x65FB; unicode_map[0x5A62] = 0x6773; unicode_map[0x5A63] = 0x6635; unicode_map[0x5A64] = 0x6636; unicode_map[0x5A65] = 0x6634; unicode_map[0x5A66] = 0x661C; unicode_map[0x5A67] = 0x664F; unicode_map[0x5A68] = 0x6644; unicode_map[0x5A69] = 0x6649; unicode_map[0x5A6A] = 0x6641; unicode_map[0x5A6B] = 0x665E; unicode_map[0x5A6C] = 0x665D; unicode_map[0x5A6D] = 0x6664; unicode_map[0x5A6E] = 0x6667; unicode_map[0x5A6F] = 0x6668; unicode_map[0x5A70] = 0x665F; unicode_map[0x5A71] = 0x6662; unicode_map[0x5A72] = 0x6670; unicode_map[0x5A73] = 0x6683; unicode_map[0x5A74] = 0x6688; unicode_map[0x5A75] = 0x668E; unicode_map[0x5A76] = 0x6689; unicode_map[0x5A77] = 0x6684; unicode_map[0x5A78] = 0x6698; unicode_map[0x5A79] = 0x669D; unicode_map[0x5A7A] = 0x66C1; unicode_map[0x5A7B] = 0x66B9; unicode_map[0x5A7C] = 0x66C9; unicode_map[0x5A7D] = 0x66BE; unicode_map[0x5A7E] = 0x66BC; unicode_map[0x5B21] = 0x66C4; unicode_map[0x5B22] = 0x66B8; unicode_map[0x5B23] = 0x66D6; unicode_map[0x5B24] = 0x66DA; unicode_map[0x5B25] = 0x66E0; unicode_map[0x5B26] = 0x663F; unicode_map[0x5B27] = 0x66E6; unicode_map[0x5B28] = 0x66E9; unicode_map[0x5B29] = 0x66F0; unicode_map[0x5B2A] = 0x66F5; unicode_map[0x5B2B] = 0x66F7; unicode_map[0x5B2C] = 0x670F; unicode_map[0x5B2D] = 0x6716; unicode_map[0x5B2E] = 0x671E; unicode_map[0x5B2F] = 0x6726; unicode_map[0x5B30] = 0x6727; unicode_map[0x5B31] = 0x9738; unicode_map[0x5B32] = 0x672E; unicode_map[0x5B33] = 0x673F; unicode_map[0x5B34] = 0x6736; unicode_map[0x5B35] = 0x6741; unicode_map[0x5B36] = 0x6738; unicode_map[0x5B37] = 0x6737; unicode_map[0x5B38] = 0x6746; unicode_map[0x5B39] = 0x675E; unicode_map[0x5B3A] = 0x6760; unicode_map[0x5B3B] = 0x6759; unicode_map[0x5B3C] = 0x6763; unicode_map[0x5B3D] = 0x6764; unicode_map[0x5B3E] = 0x6789; unicode_map[0x5B3F] = 0x6770; unicode_map[0x5B40] = 0x67A9; unicode_map[0x5B41] = 0x677C; unicode_map[0x5B42] = 0x676A; unicode_map[0x5B43] = 0x678C; unicode_map[0x5B44] = 0x678B; unicode_map[0x5B45] = 0x67A6; unicode_map[0x5B46] = 0x67A1; unicode_map[0x5B47] = 0x6785; unicode_map[0x5B48] = 0x67B7; unicode_map[0x5B49] = 0x67EF; unicode_map[0x5B4A] = 0x67B4; unicode_map[0x5B4B] = 0x67EC; unicode_map[0x5B4C] = 0x67B3; unicode_map[0x5B4D] = 0x67E9; unicode_map[0x5B4E] = 0x67B8; unicode_map[0x5B4F] = 0x67E4; unicode_map[0x5B50] = 0x67DE; unicode_map[0x5B51] = 0x67DD; unicode_map[0x5B52] = 0x67E2; unicode_map[0x5B53] = 0x67EE; unicode_map[0x5B54] = 0x67B9; unicode_map[0x5B55] = 0x67CE; unicode_map[0x5B56] = 0x67C6; unicode_map[0x5B57] = 0x67E7; unicode_map[0x5B58] = 0x6A9C; unicode_map[0x5B59] = 0x681E; unicode_map[0x5B5A] = 0x6846; unicode_map[0x5B5B] = 0x6829; unicode_map[0x5B5C] = 0x6840; unicode_map[0x5B5D] = 0x684D; unicode_map[0x5B5E] = 0x6832; unicode_map[0x5B5F] = 0x684E; unicode_map[0x5B60] = 0x68B3; unicode_map[0x5B61] = 0x682B; unicode_map[0x5B62] = 0x6859; unicode_map[0x5B63] = 0x6863; unicode_map[0x5B64] = 0x6877; unicode_map[0x5B65] = 0x687F; unicode_map[0x5B66] = 0x689F; unicode_map[0x5B67] = 0x688F; unicode_map[0x5B68] = 0x68AD; unicode_map[0x5B69] = 0x6894; unicode_map[0x5B6A] = 0x689D; unicode_map[0x5B6B] = 0x689B; unicode_map[0x5B6C] = 0x6883; unicode_map[0x5B6D] = 0x6AAE; unicode_map[0x5B6E] = 0x68B9; unicode_map[0x5B6F] = 0x6874; unicode_map[0x5B70] = 0x68B5; unicode_map[0x5B71] = 0x68A0; unicode_map[0x5B72] = 0x68BA; unicode_map[0x5B73] = 0x690F; unicode_map[0x5B74] = 0x688D; unicode_map[0x5B75] = 0x687E; unicode_map[0x5B76] = 0x6901; unicode_map[0x5B77] = 0x68CA; unicode_map[0x5B78] = 0x6908; unicode_map[0x5B79] = 0x68D8; unicode_map[0x5B7A] = 0x6922; unicode_map[0x5B7B] = 0x6926; unicode_map[0x5B7C] = 0x68E1; unicode_map[0x5B7D] = 0x690C; unicode_map[0x5B7E] = 0x68CD; unicode_map[0x5C21] = 0x68D4; unicode_map[0x5C22] = 0x68E7; unicode_map[0x5C23] = 0x68D5; unicode_map[0x5C24] = 0x6936; unicode_map[0x5C25] = 0x6912; unicode_map[0x5C26] = 0x6904; unicode_map[0x5C27] = 0x68D7; unicode_map[0x5C28] = 0x68E3; unicode_map[0x5C29] = 0x6925; unicode_map[0x5C2A] = 0x68F9; unicode_map[0x5C2B] = 0x68E0; unicode_map[0x5C2C] = 0x68EF; unicode_map[0x5C2D] = 0x6928; unicode_map[0x5C2E] = 0x692A; unicode_map[0x5C2F] = 0x691A; unicode_map[0x5C30] = 0x6923; unicode_map[0x5C31] = 0x6921; unicode_map[0x5C32] = 0x68C6; unicode_map[0x5C33] = 0x6979; unicode_map[0x5C34] = 0x6977; unicode_map[0x5C35] = 0x695C; unicode_map[0x5C36] = 0x6978; unicode_map[0x5C37] = 0x696B; unicode_map[0x5C38] = 0x6954; unicode_map[0x5C39] = 0x697E; unicode_map[0x5C3A] = 0x696E; unicode_map[0x5C3B] = 0x6939; unicode_map[0x5C3C] = 0x6974; unicode_map[0x5C3D] = 0x693D; unicode_map[0x5C3E] = 0x6959; unicode_map[0x5C3F] = 0x6930; unicode_map[0x5C40] = 0x6961; unicode_map[0x5C41] = 0x695E; unicode_map[0x5C42] = 0x695D; unicode_map[0x5C43] = 0x6981; unicode_map[0x5C44] = 0x696A; unicode_map[0x5C45] = 0x69B2; unicode_map[0x5C46] = 0x69AE; unicode_map[0x5C47] = 0x69D0; unicode_map[0x5C48] = 0x69BF; unicode_map[0x5C49] = 0x69C1; unicode_map[0x5C4A] = 0x69D3; unicode_map[0x5C4B] = 0x69BE; unicode_map[0x5C4C] = 0x69CE; unicode_map[0x5C4D] = 0x5BE8; unicode_map[0x5C4E] = 0x69CA; unicode_map[0x5C4F] = 0x69DD; unicode_map[0x5C50] = 0x69BB; unicode_map[0x5C51] = 0x69C3; unicode_map[0x5C52] = 0x69A7; unicode_map[0x5C53] = 0x6A2E; unicode_map[0x5C54] = 0x6991; unicode_map[0x5C55] = 0x69A0; unicode_map[0x5C56] = 0x699C; unicode_map[0x5C57] = 0x6995; unicode_map[0x5C58] = 0x69B4; unicode_map[0x5C59] = 0x69DE; unicode_map[0x5C5A] = 0x69E8; unicode_map[0x5C5B] = 0x6A02; unicode_map[0x5C5C] = 0x6A1B; unicode_map[0x5C5D] = 0x69FF; unicode_map[0x5C5E] = 0x6B0A; unicode_map[0x5C5F] = 0x69F9; unicode_map[0x5C60] = 0x69F2; unicode_map[0x5C61] = 0x69E7; unicode_map[0x5C62] = 0x6A05; unicode_map[0x5C63] = 0x69B1; unicode_map[0x5C64] = 0x6A1E; unicode_map[0x5C65] = 0x69ED; unicode_map[0x5C66] = 0x6A14; unicode_map[0x5C67] = 0x69EB; unicode_map[0x5C68] = 0x6A0A; unicode_map[0x5C69] = 0x6A12; unicode_map[0x5C6A] = 0x6AC1; unicode_map[0x5C6B] = 0x6A23; unicode_map[0x5C6C] = 0x6A13; unicode_map[0x5C6D] = 0x6A44; unicode_map[0x5C6E] = 0x6A0C; unicode_map[0x5C6F] = 0x6A72; unicode_map[0x5C70] = 0x6A36; unicode_map[0x5C71] = 0x6A78; unicode_map[0x5C72] = 0x6A47; unicode_map[0x5C73] = 0x6A62; unicode_map[0x5C74] = 0x6A59; unicode_map[0x5C75] = 0x6A66; unicode_map[0x5C76] = 0x6A48; unicode_map[0x5C77] = 0x6A38; unicode_map[0x5C78] = 0x6A22; unicode_map[0x5C79] = 0x6A90; unicode_map[0x5C7A] = 0x6A8D; unicode_map[0x5C7B] = 0x6AA0; unicode_map[0x5C7C] = 0x6A84; unicode_map[0x5C7D] = 0x6AA2; unicode_map[0x5C7E] = 0x6AA3; unicode_map[0x5D21] = 0x6A97; unicode_map[0x5D22] = 0x8617; unicode_map[0x5D23] = 0x6ABB; unicode_map[0x5D24] = 0x6AC3; unicode_map[0x5D25] = 0x6AC2; unicode_map[0x5D26] = 0x6AB8; unicode_map[0x5D27] = 0x6AB3; unicode_map[0x5D28] = 0x6AAC; unicode_map[0x5D29] = 0x6ADE; unicode_map[0x5D2A] = 0x6AD1; unicode_map[0x5D2B] = 0x6ADF; unicode_map[0x5D2C] = 0x6AAA; unicode_map[0x5D2D] = 0x6ADA; unicode_map[0x5D2E] = 0x6AEA; unicode_map[0x5D2F] = 0x6AFB; unicode_map[0x5D30] = 0x6B05; unicode_map[0x5D31] = 0x8616; unicode_map[0x5D32] = 0x6AFA; unicode_map[0x5D33] = 0x6B12; unicode_map[0x5D34] = 0x6B16; unicode_map[0x5D35] = 0x9B31; unicode_map[0x5D36] = 0x6B1F; unicode_map[0x5D37] = 0x6B38; unicode_map[0x5D38] = 0x6B37; unicode_map[0x5D39] = 0x76DC; unicode_map[0x5D3A] = 0x6B39; unicode_map[0x5D3B] = 0x98EE; unicode_map[0x5D3C] = 0x6B47; unicode_map[0x5D3D] = 0x6B43; unicode_map[0x5D3E] = 0x6B49; unicode_map[0x5D3F] = 0x6B50; unicode_map[0x5D40] = 0x6B59; unicode_map[0x5D41] = 0x6B54; unicode_map[0x5D42] = 0x6B5B; unicode_map[0x5D43] = 0x6B5F; unicode_map[0x5D44] = 0x6B61; unicode_map[0x5D45] = 0x6B78; unicode_map[0x5D46] = 0x6B79; unicode_map[0x5D47] = 0x6B7F; unicode_map[0x5D48] = 0x6B80; unicode_map[0x5D49] = 0x6B84; unicode_map[0x5D4A] = 0x6B83; unicode_map[0x5D4B] = 0x6B8D; unicode_map[0x5D4C] = 0x6B98; unicode_map[0x5D4D] = 0x6B95; unicode_map[0x5D4E] = 0x6B9E; unicode_map[0x5D4F] = 0x6BA4; unicode_map[0x5D50] = 0x6BAA; unicode_map[0x5D51] = 0x6BAB; unicode_map[0x5D52] = 0x6BAF; unicode_map[0x5D53] = 0x6BB2; unicode_map[0x5D54] = 0x6BB1; unicode_map[0x5D55] = 0x6BB3; unicode_map[0x5D56] = 0x6BB7; unicode_map[0x5D57] = 0x6BBC; unicode_map[0x5D58] = 0x6BC6; unicode_map[0x5D59] = 0x6BCB; unicode_map[0x5D5A] = 0x6BD3; unicode_map[0x5D5B] = 0x6BDF; unicode_map[0x5D5C] = 0x6BEC; unicode_map[0x5D5D] = 0x6BEB; unicode_map[0x5D5E] = 0x6BF3; unicode_map[0x5D5F] = 0x6BEF; unicode_map[0x5D60] = 0x9EBE; unicode_map[0x5D61] = 0x6C08; unicode_map[0x5D62] = 0x6C13; unicode_map[0x5D63] = 0x6C14; unicode_map[0x5D64] = 0x6C1B; unicode_map[0x5D65] = 0x6C24; unicode_map[0x5D66] = 0x6C23; unicode_map[0x5D67] = 0x6C5E; unicode_map[0x5D68] = 0x6C55; unicode_map[0x5D69] = 0x6C62; unicode_map[0x5D6A] = 0x6C6A; unicode_map[0x5D6B] = 0x6C82; unicode_map[0x5D6C] = 0x6C8D; unicode_map[0x5D6D] = 0x6C9A; unicode_map[0x5D6E] = 0x6C81; unicode_map[0x5D6F] = 0x6C9B; unicode_map[0x5D70] = 0x6C7E; unicode_map[0x5D71] = 0x6C68; unicode_map[0x5D72] = 0x6C73; unicode_map[0x5D73] = 0x6C92; unicode_map[0x5D74] = 0x6C90; unicode_map[0x5D75] = 0x6CC4; unicode_map[0x5D76] = 0x6CF1; unicode_map[0x5D77] = 0x6CD3; unicode_map[0x5D78] = 0x6CBD; unicode_map[0x5D79] = 0x6CD7; unicode_map[0x5D7A] = 0x6CC5; unicode_map[0x5D7B] = 0x6CDD; unicode_map[0x5D7C] = 0x6CAE; unicode_map[0x5D7D] = 0x6CB1; unicode_map[0x5D7E] = 0x6CBE; unicode_map[0x5E21] = 0x6CBA; unicode_map[0x5E22] = 0x6CDB; unicode_map[0x5E23] = 0x6CEF; unicode_map[0x5E24] = 0x6CD9; unicode_map[0x5E25] = 0x6CEA; unicode_map[0x5E26] = 0x6D1F; unicode_map[0x5E27] = 0x884D; unicode_map[0x5E28] = 0x6D36; unicode_map[0x5E29] = 0x6D2B; unicode_map[0x5E2A] = 0x6D3D; unicode_map[0x5E2B] = 0x6D38; unicode_map[0x5E2C] = 0x6D19; unicode_map[0x5E2D] = 0x6D35; unicode_map[0x5E2E] = 0x6D33; unicode_map[0x5E2F] = 0x6D12; unicode_map[0x5E30] = 0x6D0C; unicode_map[0x5E31] = 0x6D63; unicode_map[0x5E32] = 0x6D93; unicode_map[0x5E33] = 0x6D64; unicode_map[0x5E34] = 0x6D5A; unicode_map[0x5E35] = 0x6D79; unicode_map[0x5E36] = 0x6D59; unicode_map[0x5E37] = 0x6D8E; unicode_map[0x5E38] = 0x6D95; unicode_map[0x5E39] = 0x6FE4; unicode_map[0x5E3A] = 0x6D85; unicode_map[0x5E3B] = 0x6DF9; unicode_map[0x5E3C] = 0x6E15; unicode_map[0x5E3D] = 0x6E0A; unicode_map[0x5E3E] = 0x6DB5; unicode_map[0x5E3F] = 0x6DC7; unicode_map[0x5E40] = 0x6DE6; unicode_map[0x5E41] = 0x6DB8; unicode_map[0x5E42] = 0x6DC6; unicode_map[0x5E43] = 0x6DEC; unicode_map[0x5E44] = 0x6DDE; unicode_map[0x5E45] = 0x6DCC; unicode_map[0x5E46] = 0x6DE8; unicode_map[0x5E47] = 0x6DD2; unicode_map[0x5E48] = 0x6DC5; unicode_map[0x5E49] = 0x6DFA; unicode_map[0x5E4A] = 0x6DD9; unicode_map[0x5E4B] = 0x6DE4; unicode_map[0x5E4C] = 0x6DD5; unicode_map[0x5E4D] = 0x6DEA; unicode_map[0x5E4E] = 0x6DEE; unicode_map[0x5E4F] = 0x6E2D; unicode_map[0x5E50] = 0x6E6E; unicode_map[0x5E51] = 0x6E2E; unicode_map[0x5E52] = 0x6E19; unicode_map[0x5E53] = 0x6E72; unicode_map[0x5E54] = 0x6E5F; unicode_map[0x5E55] = 0x6E3E; unicode_map[0x5E56] = 0x6E23; unicode_map[0x5E57] = 0x6E6B; unicode_map[0x5E58] = 0x6E2B; unicode_map[0x5E59] = 0x6E76; unicode_map[0x5E5A] = 0x6E4D; unicode_map[0x5E5B] = 0x6E1F; unicode_map[0x5E5C] = 0x6E43; unicode_map[0x5E5D] = 0x6E3A; unicode_map[0x5E5E] = 0x6E4E; unicode_map[0x5E5F] = 0x6E24; unicode_map[0x5E60] = 0x6EFF; unicode_map[0x5E61] = 0x6E1D; unicode_map[0x5E62] = 0x6E38; unicode_map[0x5E63] = 0x6E82; unicode_map[0x5E64] = 0x6EAA; unicode_map[0x5E65] = 0x6E98; unicode_map[0x5E66] = 0x6EC9; unicode_map[0x5E67] = 0x6EB7; unicode_map[0x5E68] = 0x6ED3; unicode_map[0x5E69] = 0x6EBD; unicode_map[0x5E6A] = 0x6EAF; unicode_map[0x5E6B] = 0x6EC4; unicode_map[0x5E6C] = 0x6EB2; unicode_map[0x5E6D] = 0x6ED4; unicode_map[0x5E6E] = 0x6ED5; unicode_map[0x5E6F] = 0x6E8F; unicode_map[0x5E70] = 0x6EA5; unicode_map[0x5E71] = 0x6EC2; unicode_map[0x5E72] = 0x6E9F; unicode_map[0x5E73] = 0x6F41; unicode_map[0x5E74] = 0x6F11; unicode_map[0x5E75] = 0x704C; unicode_map[0x5E76] = 0x6EEC; unicode_map[0x5E77] = 0x6EF8; unicode_map[0x5E78] = 0x6EFE; unicode_map[0x5E79] = 0x6F3F; unicode_map[0x5E7A] = 0x6EF2; unicode_map[0x5E7B] = 0x6F31; unicode_map[0x5E7C] = 0x6EEF; unicode_map[0x5E7D] = 0x6F32; unicode_map[0x5E7E] = 0x6ECC; unicode_map[0x5F21] = 0x6F3E; unicode_map[0x5F22] = 0x6F13; unicode_map[0x5F23] = 0x6EF7; unicode_map[0x5F24] = 0x6F86; unicode_map[0x5F25] = 0x6F7A; unicode_map[0x5F26] = 0x6F78; unicode_map[0x5F27] = 0x6F81; unicode_map[0x5F28] = 0x6F80; unicode_map[0x5F29] = 0x6F6F; unicode_map[0x5F2A] = 0x6F5B; unicode_map[0x5F2B] = 0x6FF3; unicode_map[0x5F2C] = 0x6F6D; unicode_map[0x5F2D] = 0x6F82; unicode_map[0x5F2E] = 0x6F7C; unicode_map[0x5F2F] = 0x6F58; unicode_map[0x5F30] = 0x6F8E; unicode_map[0x5F31] = 0x6F91; unicode_map[0x5F32] = 0x6FC2; unicode_map[0x5F33] = 0x6F66; unicode_map[0x5F34] = 0x6FB3; unicode_map[0x5F35] = 0x6FA3; unicode_map[0x5F36] = 0x6FA1; unicode_map[0x5F37] = 0x6FA4; unicode_map[0x5F38] = 0x6FB9; unicode_map[0x5F39] = 0x6FC6; unicode_map[0x5F3A] = 0x6FAA; unicode_map[0x5F3B] = 0x6FDF; unicode_map[0x5F3C] = 0x6FD5; unicode_map[0x5F3D] = 0x6FEC; unicode_map[0x5F3E] = 0x6FD4; unicode_map[0x5F3F] = 0x6FD8; unicode_map[0x5F40] = 0x6FF1; unicode_map[0x5F41] = 0x6FEE; unicode_map[0x5F42] = 0x6FDB; unicode_map[0x5F43] = 0x7009; unicode_map[0x5F44] = 0x700B; unicode_map[0x5F45] = 0x6FFA; unicode_map[0x5F46] = 0x7011; unicode_map[0x5F47] = 0x7001; unicode_map[0x5F48] = 0x700F; unicode_map[0x5F49] = 0x6FFE; unicode_map[0x5F4A] = 0x701B; unicode_map[0x5F4B] = 0x701A; unicode_map[0x5F4C] = 0x6F74; unicode_map[0x5F4D] = 0x701D; unicode_map[0x5F4E] = 0x7018; unicode_map[0x5F4F] = 0x701F; unicode_map[0x5F50] = 0x7030; unicode_map[0x5F51] = 0x703E; unicode_map[0x5F52] = 0x7032; unicode_map[0x5F53] = 0x7051; unicode_map[0x5F54] = 0x7063; unicode_map[0x5F55] = 0x7099; unicode_map[0x5F56] = 0x7092; unicode_map[0x5F57] = 0x70AF; unicode_map[0x5F58] = 0x70F1; unicode_map[0x5F59] = 0x70AC; unicode_map[0x5F5A] = 0x70B8; unicode_map[0x5F5B] = 0x70B3; unicode_map[0x5F5C] = 0x70AE; unicode_map[0x5F5D] = 0x70DF; unicode_map[0x5F5E] = 0x70CB; unicode_map[0x5F5F] = 0x70DD; unicode_map[0x5F60] = 0x70D9; unicode_map[0x5F61] = 0x7109; unicode_map[0x5F62] = 0x70FD; unicode_map[0x5F63] = 0x711C; unicode_map[0x5F64] = 0x7119; unicode_map[0x5F65] = 0x7165; unicode_map[0x5F66] = 0x7155; unicode_map[0x5F67] = 0x7188; unicode_map[0x5F68] = 0x7166; unicode_map[0x5F69] = 0x7162; unicode_map[0x5F6A] = 0x714C; unicode_map[0x5F6B] = 0x7156; unicode_map[0x5F6C] = 0x716C; unicode_map[0x5F6D] = 0x718F; unicode_map[0x5F6E] = 0x71FB; unicode_map[0x5F6F] = 0x7184; unicode_map[0x5F70] = 0x7195; unicode_map[0x5F71] = 0x71A8; unicode_map[0x5F72] = 0x71AC; unicode_map[0x5F73] = 0x71D7; unicode_map[0x5F74] = 0x71B9; unicode_map[0x5F75] = 0x71BE; unicode_map[0x5F76] = 0x71D2; unicode_map[0x5F77] = 0x71C9; unicode_map[0x5F78] = 0x71D4; unicode_map[0x5F79] = 0x71CE; unicode_map[0x5F7A] = 0x71E0; unicode_map[0x5F7B] = 0x71EC; unicode_map[0x5F7C] = 0x71E7; unicode_map[0x5F7D] = 0x71F5; unicode_map[0x5F7E] = 0x71FC; unicode_map[0x6021] = 0x71F9; unicode_map[0x6022] = 0x71FF; unicode_map[0x6023] = 0x720D; unicode_map[0x6024] = 0x7210; unicode_map[0x6025] = 0x721B; unicode_map[0x6026] = 0x7228; unicode_map[0x6027] = 0x722D; unicode_map[0x6028] = 0x722C; unicode_map[0x6029] = 0x7230; unicode_map[0x602A] = 0x7232; unicode_map[0x602B] = 0x723B; unicode_map[0x602C] = 0x723C; unicode_map[0x602D] = 0x723F; unicode_map[0x602E] = 0x7240; unicode_map[0x602F] = 0x7246; unicode_map[0x6030] = 0x724B; unicode_map[0x6031] = 0x7258; unicode_map[0x6032] = 0x7274; unicode_map[0x6033] = 0x727E; unicode_map[0x6034] = 0x7282; unicode_map[0x6035] = 0x7281; unicode_map[0x6036] = 0x7287; unicode_map[0x6037] = 0x7292; unicode_map[0x6038] = 0x7296; unicode_map[0x6039] = 0x72A2; unicode_map[0x603A] = 0x72A7; unicode_map[0x603B] = 0x72B9; unicode_map[0x603C] = 0x72B2; unicode_map[0x603D] = 0x72C3; unicode_map[0x603E] = 0x72C6; unicode_map[0x603F] = 0x72C4; unicode_map[0x6040] = 0x72CE; unicode_map[0x6041] = 0x72D2; unicode_map[0x6042] = 0x72E2; unicode_map[0x6043] = 0x72E0; unicode_map[0x6044] = 0x72E1; unicode_map[0x6045] = 0x72F9; unicode_map[0x6046] = 0x72F7; unicode_map[0x6047] = 0x500F; unicode_map[0x6048] = 0x7317; unicode_map[0x6049] = 0x730A; unicode_map[0x604A] = 0x731C; unicode_map[0x604B] = 0x7316; unicode_map[0x604C] = 0x731D; unicode_map[0x604D] = 0x7334; unicode_map[0x604E] = 0x732F; unicode_map[0x604F] = 0x7329; unicode_map[0x6050] = 0x7325; unicode_map[0x6051] = 0x733E; unicode_map[0x6052] = 0x734E; unicode_map[0x6053] = 0x734F; unicode_map[0x6054] = 0x9ED8; unicode_map[0x6055] = 0x7357; unicode_map[0x6056] = 0x736A; unicode_map[0x6057] = 0x7368; unicode_map[0x6058] = 0x7370; unicode_map[0x6059] = 0x7378; unicode_map[0x605A] = 0x7375; unicode_map[0x605B] = 0x737B; unicode_map[0x605C] = 0x737A; unicode_map[0x605D] = 0x73C8; unicode_map[0x605E] = 0x73B3; unicode_map[0x605F] = 0x73CE; unicode_map[0x6060] = 0x73BB; unicode_map[0x6061] = 0x73C0; unicode_map[0x6062] = 0x73E5; unicode_map[0x6063] = 0x73EE; unicode_map[0x6064] = 0x73DE; unicode_map[0x6065] = 0x74A2; unicode_map[0x6066] = 0x7405; unicode_map[0x6067] = 0x746F; unicode_map[0x6068] = 0x7425; unicode_map[0x6069] = 0x73F8; unicode_map[0x606A] = 0x7432; unicode_map[0x606B] = 0x743A; unicode_map[0x606C] = 0x7455; unicode_map[0x606D] = 0x743F; unicode_map[0x606E] = 0x745F; unicode_map[0x606F] = 0x7459; unicode_map[0x6070] = 0x7441; unicode_map[0x6071] = 0x745C; unicode_map[0x6072] = 0x7469; unicode_map[0x6073] = 0x7470; unicode_map[0x6074] = 0x7463; unicode_map[0x6075] = 0x746A; unicode_map[0x6076] = 0x7476; unicode_map[0x6077] = 0x747E; unicode_map[0x6078] = 0x748B; unicode_map[0x6079] = 0x749E; unicode_map[0x607A] = 0x74A7; unicode_map[0x607B] = 0x74CA; unicode_map[0x607C] = 0x74CF; unicode_map[0x607D] = 0x74D4; unicode_map[0x607E] = 0x73F1; unicode_map[0x6121] = 0x74E0; unicode_map[0x6122] = 0x74E3; unicode_map[0x6123] = 0x74E7; unicode_map[0x6124] = 0x74E9; unicode_map[0x6125] = 0x74EE; unicode_map[0x6126] = 0x74F2; unicode_map[0x6127] = 0x74F0; unicode_map[0x6128] = 0x74F1; unicode_map[0x6129] = 0x74F8; unicode_map[0x612A] = 0x74F7; unicode_map[0x612B] = 0x7504; unicode_map[0x612C] = 0x7503; unicode_map[0x612D] = 0x7505; unicode_map[0x612E] = 0x750C; unicode_map[0x612F] = 0x750E; unicode_map[0x6130] = 0x750D; unicode_map[0x6131] = 0x7515; unicode_map[0x6132] = 0x7513; unicode_map[0x6133] = 0x751E; unicode_map[0x6134] = 0x7526; unicode_map[0x6135] = 0x752C; unicode_map[0x6136] = 0x753C; unicode_map[0x6137] = 0x7544; unicode_map[0x6138] = 0x754D; unicode_map[0x6139] = 0x754A; unicode_map[0x613A] = 0x7549; unicode_map[0x613B] = 0x755B; unicode_map[0x613C] = 0x7546; unicode_map[0x613D] = 0x755A; unicode_map[0x613E] = 0x7569; unicode_map[0x613F] = 0x7564; unicode_map[0x6140] = 0x7567; unicode_map[0x6141] = 0x756B; unicode_map[0x6142] = 0x756D; unicode_map[0x6143] = 0x7578; unicode_map[0x6144] = 0x7576; unicode_map[0x6145] = 0x7586; unicode_map[0x6146] = 0x7587; unicode_map[0x6147] = 0x7574; unicode_map[0x6148] = 0x758A; unicode_map[0x6149] = 0x7589; unicode_map[0x614A] = 0x7582; unicode_map[0x614B] = 0x7594; unicode_map[0x614C] = 0x759A; unicode_map[0x614D] = 0x759D; unicode_map[0x614E] = 0x75A5; unicode_map[0x614F] = 0x75A3; unicode_map[0x6150] = 0x75C2; unicode_map[0x6151] = 0x75B3; unicode_map[0x6152] = 0x75C3; unicode_map[0x6153] = 0x75B5; unicode_map[0x6154] = 0x75BD; unicode_map[0x6155] = 0x75B8; unicode_map[0x6156] = 0x75BC; unicode_map[0x6157] = 0x75B1; unicode_map[0x6158] = 0x75CD; unicode_map[0x6159] = 0x75CA; unicode_map[0x615A] = 0x75D2; unicode_map[0x615B] = 0x75D9; unicode_map[0x615C] = 0x75E3; unicode_map[0x615D] = 0x75DE; unicode_map[0x615E] = 0x75FE; unicode_map[0x615F] = 0x75FF; unicode_map[0x6160] = 0x75FC; unicode_map[0x6161] = 0x7601; unicode_map[0x6162] = 0x75F0; unicode_map[0x6163] = 0x75FA; unicode_map[0x6164] = 0x75F2; unicode_map[0x6165] = 0x75F3; unicode_map[0x6166] = 0x760B; unicode_map[0x6167] = 0x760D; unicode_map[0x6168] = 0x7609; unicode_map[0x6169] = 0x761F; unicode_map[0x616A] = 0x7627; unicode_map[0x616B] = 0x7620; unicode_map[0x616C] = 0x7621; unicode_map[0x616D] = 0x7622; unicode_map[0x616E] = 0x7624; unicode_map[0x616F] = 0x7634; unicode_map[0x6170] = 0x7630; unicode_map[0x6171] = 0x763B; unicode_map[0x6172] = 0x7647; unicode_map[0x6173] = 0x7648; unicode_map[0x6174] = 0x7646; unicode_map[0x6175] = 0x765C; unicode_map[0x6176] = 0x7658; unicode_map[0x6177] = 0x7661; unicode_map[0x6178] = 0x7662; unicode_map[0x6179] = 0x7668; unicode_map[0x617A] = 0x7669; unicode_map[0x617B] = 0x766A; unicode_map[0x617C] = 0x7667; unicode_map[0x617D] = 0x766C; unicode_map[0x617E] = 0x7670; unicode_map[0x6221] = 0x7672; unicode_map[0x6222] = 0x7676; unicode_map[0x6223] = 0x7678; unicode_map[0x6224] = 0x767C; unicode_map[0x6225] = 0x7680; unicode_map[0x6226] = 0x7683; unicode_map[0x6227] = 0x7688; unicode_map[0x6228] = 0x768B; unicode_map[0x6229] = 0x768E; unicode_map[0x622A] = 0x7696; unicode_map[0x622B] = 0x7693; unicode_map[0x622C] = 0x7699; unicode_map[0x622D] = 0x769A; unicode_map[0x622E] = 0x76B0; unicode_map[0x622F] = 0x76B4; unicode_map[0x6230] = 0x76B8; unicode_map[0x6231] = 0x76B9; unicode_map[0x6232] = 0x76BA; unicode_map[0x6233] = 0x76C2; unicode_map[0x6234] = 0x76CD; unicode_map[0x6235] = 0x76D6; unicode_map[0x6236] = 0x76D2; unicode_map[0x6237] = 0x76DE; unicode_map[0x6238] = 0x76E1; unicode_map[0x6239] = 0x76E5; unicode_map[0x623A] = 0x76E7; unicode_map[0x623B] = 0x76EA; unicode_map[0x623C] = 0x862F; unicode_map[0x623D] = 0x76FB; unicode_map[0x623E] = 0x7708; unicode_map[0x623F] = 0x7707; unicode_map[0x6240] = 0x7704; unicode_map[0x6241] = 0x7729; unicode_map[0x6242] = 0x7724; unicode_map[0x6243] = 0x771E; unicode_map[0x6244] = 0x7725; unicode_map[0x6245] = 0x7726; unicode_map[0x6246] = 0x771B; unicode_map[0x6247] = 0x7737; unicode_map[0x6248] = 0x7738; unicode_map[0x6249] = 0x7747; unicode_map[0x624A] = 0x775A; unicode_map[0x624B] = 0x7768; unicode_map[0x624C] = 0x776B; unicode_map[0x624D] = 0x775B; unicode_map[0x624E] = 0x7765; unicode_map[0x624F] = 0x777F; unicode_map[0x6250] = 0x777E; unicode_map[0x6251] = 0x7779; unicode_map[0x6252] = 0x778E; unicode_map[0x6253] = 0x778B; unicode_map[0x6254] = 0x7791; unicode_map[0x6255] = 0x77A0; unicode_map[0x6256] = 0x779E; unicode_map[0x6257] = 0x77B0; unicode_map[0x6258] = 0x77B6; unicode_map[0x6259] = 0x77B9; unicode_map[0x625A] = 0x77BF; unicode_map[0x625B] = 0x77BC; unicode_map[0x625C] = 0x77BD; unicode_map[0x625D] = 0x77BB; unicode_map[0x625E] = 0x77C7; unicode_map[0x625F] = 0x77CD; unicode_map[0x6260] = 0x77D7; unicode_map[0x6261] = 0x77DA; unicode_map[0x6262] = 0x77DC; unicode_map[0x6263] = 0x77E3; unicode_map[0x6264] = 0x77EE; unicode_map[0x6265] = 0x77FC; unicode_map[0x6266] = 0x780C; unicode_map[0x6267] = 0x7812; unicode_map[0x6268] = 0x7926; unicode_map[0x6269] = 0x7820; unicode_map[0x626A] = 0x792A; unicode_map[0x626B] = 0x7845; unicode_map[0x626C] = 0x788E; unicode_map[0x626D] = 0x7874; unicode_map[0x626E] = 0x7886; unicode_map[0x626F] = 0x787C; unicode_map[0x6270] = 0x789A; unicode_map[0x6271] = 0x788C; unicode_map[0x6272] = 0x78A3; unicode_map[0x6273] = 0x78B5; unicode_map[0x6274] = 0x78AA; unicode_map[0x6275] = 0x78AF; unicode_map[0x6276] = 0x78D1; unicode_map[0x6277] = 0x78C6; unicode_map[0x6278] = 0x78CB; unicode_map[0x6279] = 0x78D4; unicode_map[0x627A] = 0x78BE; unicode_map[0x627B] = 0x78BC; unicode_map[0x627C] = 0x78C5; unicode_map[0x627D] = 0x78CA; unicode_map[0x627E] = 0x78EC; unicode_map[0x6321] = 0x78E7; unicode_map[0x6322] = 0x78DA; unicode_map[0x6323] = 0x78FD; unicode_map[0x6324] = 0x78F4; unicode_map[0x6325] = 0x7907; unicode_map[0x6326] = 0x7912; unicode_map[0x6327] = 0x7911; unicode_map[0x6328] = 0x7919; unicode_map[0x6329] = 0x792C; unicode_map[0x632A] = 0x792B; unicode_map[0x632B] = 0x7940; unicode_map[0x632C] = 0x7960; unicode_map[0x632D] = 0x7957; unicode_map[0x632E] = 0x795F; unicode_map[0x632F] = 0x795A; unicode_map[0x6330] = 0x7955; unicode_map[0x6331] = 0x7953; unicode_map[0x6332] = 0x797A; unicode_map[0x6333] = 0x797F; unicode_map[0x6334] = 0x798A; unicode_map[0x6335] = 0x799D; unicode_map[0x6336] = 0x79A7; unicode_map[0x6337] = 0x9F4B; unicode_map[0x6338] = 0x79AA; unicode_map[0x6339] = 0x79AE; unicode_map[0x633A] = 0x79B3; unicode_map[0x633B] = 0x79B9; unicode_map[0x633C] = 0x79BA; unicode_map[0x633D] = 0x79C9; unicode_map[0x633E] = 0x79D5; unicode_map[0x633F] = 0x79E7; unicode_map[0x6340] = 0x79EC; unicode_map[0x6341] = 0x79E1; unicode_map[0x6342] = 0x79E3; unicode_map[0x6343] = 0x7A08; unicode_map[0x6344] = 0x7A0D; unicode_map[0x6345] = 0x7A18; unicode_map[0x6346] = 0x7A19; unicode_map[0x6347] = 0x7A20; unicode_map[0x6348] = 0x7A1F; unicode_map[0x6349] = 0x7980; unicode_map[0x634A] = 0x7A31; unicode_map[0x634B] = 0x7A3B; unicode_map[0x634C] = 0x7A3E; unicode_map[0x634D] = 0x7A37; unicode_map[0x634E] = 0x7A43; unicode_map[0x634F] = 0x7A57; unicode_map[0x6350] = 0x7A49; unicode_map[0x6351] = 0x7A61; unicode_map[0x6352] = 0x7A62; unicode_map[0x6353] = 0x7A69; unicode_map[0x6354] = 0x9F9D; unicode_map[0x6355] = 0x7A70; unicode_map[0x6356] = 0x7A79; unicode_map[0x6357] = 0x7A7D; unicode_map[0x6358] = 0x7A88; unicode_map[0x6359] = 0x7A97; unicode_map[0x635A] = 0x7A95; unicode_map[0x635B] = 0x7A98; unicode_map[0x635C] = 0x7A96; unicode_map[0x635D] = 0x7AA9; unicode_map[0x635E] = 0x7AC8; unicode_map[0x635F] = 0x7AB0; unicode_map[0x6360] = 0x7AB6; unicode_map[0x6361] = 0x7AC5; unicode_map[0x6362] = 0x7AC4; unicode_map[0x6363] = 0x7ABF; unicode_map[0x6364] = 0x9083; unicode_map[0x6365] = 0x7AC7; unicode_map[0x6366] = 0x7ACA; unicode_map[0x6367] = 0x7ACD; unicode_map[0x6368] = 0x7ACF; unicode_map[0x6369] = 0x7AD5; unicode_map[0x636A] = 0x7AD3; unicode_map[0x636B] = 0x7AD9; unicode_map[0x636C] = 0x7ADA; unicode_map[0x636D] = 0x7ADD; unicode_map[0x636E] = 0x7AE1; unicode_map[0x636F] = 0x7AE2; unicode_map[0x6370] = 0x7AE6; unicode_map[0x6371] = 0x7AED; unicode_map[0x6372] = 0x7AF0; unicode_map[0x6373] = 0x7B02; unicode_map[0x6374] = 0x7B0F; unicode_map[0x6375] = 0x7B0A; unicode_map[0x6376] = 0x7B06; unicode_map[0x6377] = 0x7B33; unicode_map[0x6378] = 0x7B18; unicode_map[0x6379] = 0x7B19; unicode_map[0x637A] = 0x7B1E; unicode_map[0x637B] = 0x7B35; unicode_map[0x637C] = 0x7B28; unicode_map[0x637D] = 0x7B36; unicode_map[0x637E] = 0x7B50; unicode_map[0x6421] = 0x7B7A; unicode_map[0x6422] = 0x7B04; unicode_map[0x6423] = 0x7B4D; unicode_map[0x6424] = 0x7B0B; unicode_map[0x6425] = 0x7B4C; unicode_map[0x6426] = 0x7B45; unicode_map[0x6427] = 0x7B75; unicode_map[0x6428] = 0x7B65; unicode_map[0x6429] = 0x7B74; unicode_map[0x642A] = 0x7B67; unicode_map[0x642B] = 0x7B70; unicode_map[0x642C] = 0x7B71; unicode_map[0x642D] = 0x7B6C; unicode_map[0x642E] = 0x7B6E; unicode_map[0x642F] = 0x7B9D; unicode_map[0x6430] = 0x7B98; unicode_map[0x6431] = 0x7B9F; unicode_map[0x6432] = 0x7B8D; unicode_map[0x6433] = 0x7B9C; unicode_map[0x6434] = 0x7B9A; unicode_map[0x6435] = 0x7B8B; unicode_map[0x6436] = 0x7B92; unicode_map[0x6437] = 0x7B8F; unicode_map[0x6438] = 0x7B5D; unicode_map[0x6439] = 0x7B99; unicode_map[0x643A] = 0x7BCB; unicode_map[0x643B] = 0x7BC1; unicode_map[0x643C] = 0x7BCC; unicode_map[0x643D] = 0x7BCF; unicode_map[0x643E] = 0x7BB4; unicode_map[0x643F] = 0x7BC6; unicode_map[0x6440] = 0x7BDD; unicode_map[0x6441] = 0x7BE9; unicode_map[0x6442] = 0x7C11; unicode_map[0x6443] = 0x7C14; unicode_map[0x6444] = 0x7BE6; unicode_map[0x6445] = 0x7BE5; unicode_map[0x6446] = 0x7C60; unicode_map[0x6447] = 0x7C00; unicode_map[0x6448] = 0x7C07; unicode_map[0x6449] = 0x7C13; unicode_map[0x644A] = 0x7BF3; unicode_map[0x644B] = 0x7BF7; unicode_map[0x644C] = 0x7C17; unicode_map[0x644D] = 0x7C0D; unicode_map[0x644E] = 0x7BF6; unicode_map[0x644F] = 0x7C23; unicode_map[0x6450] = 0x7C27; unicode_map[0x6451] = 0x7C2A; unicode_map[0x6452] = 0x7C1F; unicode_map[0x6453] = 0x7C37; unicode_map[0x6454] = 0x7C2B; unicode_map[0x6455] = 0x7C3D; unicode_map[0x6456] = 0x7C4C; unicode_map[0x6457] = 0x7C43; unicode_map[0x6458] = 0x7C54; unicode_map[0x6459] = 0x7C4F; unicode_map[0x645A] = 0x7C40; unicode_map[0x645B] = 0x7C50; unicode_map[0x645C] = 0x7C58; unicode_map[0x645D] = 0x7C5F; unicode_map[0x645E] = 0x7C64; unicode_map[0x645F] = 0x7C56; unicode_map[0x6460] = 0x7C65; unicode_map[0x6461] = 0x7C6C; unicode_map[0x6462] = 0x7C75; unicode_map[0x6463] = 0x7C83; unicode_map[0x6464] = 0x7C90; unicode_map[0x6465] = 0x7CA4; unicode_map[0x6466] = 0x7CAD; unicode_map[0x6467] = 0x7CA2; unicode_map[0x6468] = 0x7CAB; unicode_map[0x6469] = 0x7CA1; unicode_map[0x646A] = 0x7CA8; unicode_map[0x646B] = 0x7CB3; unicode_map[0x646C] = 0x7CB2; unicode_map[0x646D] = 0x7CB1; unicode_map[0x646E] = 0x7CAE; unicode_map[0x646F] = 0x7CB9; unicode_map[0x6470] = 0x7CBD; unicode_map[0x6471] = 0x7CC0; unicode_map[0x6472] = 0x7CC5; unicode_map[0x6473] = 0x7CC2; unicode_map[0x6474] = 0x7CD8; unicode_map[0x6475] = 0x7CD2; unicode_map[0x6476] = 0x7CDC; unicode_map[0x6477] = 0x7CE2; unicode_map[0x6478] = 0x9B3B; unicode_map[0x6479] = 0x7CEF; unicode_map[0x647A] = 0x7CF2; unicode_map[0x647B] = 0x7CF4; unicode_map[0x647C] = 0x7CF6; unicode_map[0x647D] = 0x7CFA; unicode_map[0x647E] = 0x7D06; unicode_map[0x6521] = 0x7D02; unicode_map[0x6522] = 0x7D1C; unicode_map[0x6523] = 0x7D15; unicode_map[0x6524] = 0x7D0A; unicode_map[0x6525] = 0x7D45; unicode_map[0x6526] = 0x7D4B; unicode_map[0x6527] = 0x7D2E; unicode_map[0x6528] = 0x7D32; unicode_map[0x6529] = 0x7D3F; unicode_map[0x652A] = 0x7D35; unicode_map[0x652B] = 0x7D46; unicode_map[0x652C] = 0x7D73; unicode_map[0x652D] = 0x7D56; unicode_map[0x652E] = 0x7D4E; unicode_map[0x652F] = 0x7D72; unicode_map[0x6530] = 0x7D68; unicode_map[0x6531] = 0x7D6E; unicode_map[0x6532] = 0x7D4F; unicode_map[0x6533] = 0x7D63; unicode_map[0x6534] = 0x7D93; unicode_map[0x6535] = 0x7D89; unicode_map[0x6536] = 0x7D5B; unicode_map[0x6537] = 0x7D8F; unicode_map[0x6538] = 0x7D7D; unicode_map[0x6539] = 0x7D9B; unicode_map[0x653A] = 0x7DBA; unicode_map[0x653B] = 0x7DAE; unicode_map[0x653C] = 0x7DA3; unicode_map[0x653D] = 0x7DB5; unicode_map[0x653E] = 0x7DC7; unicode_map[0x653F] = 0x7DBD; unicode_map[0x6540] = 0x7DAB; unicode_map[0x6541] = 0x7E3D; unicode_map[0x6542] = 0x7DA2; unicode_map[0x6543] = 0x7DAF; unicode_map[0x6544] = 0x7DDC; unicode_map[0x6545] = 0x7DB8; unicode_map[0x6546] = 0x7D9F; unicode_map[0x6547] = 0x7DB0; unicode_map[0x6548] = 0x7DD8; unicode_map[0x6549] = 0x7DDD; unicode_map[0x654A] = 0x7DE4; unicode_map[0x654B] = 0x7DDE; unicode_map[0x654C] = 0x7DFB; unicode_map[0x654D] = 0x7DF2; unicode_map[0x654E] = 0x7DE1; unicode_map[0x654F] = 0x7E05; unicode_map[0x6550] = 0x7E0A; unicode_map[0x6551] = 0x7E23; unicode_map[0x6552] = 0x7E21; unicode_map[0x6553] = 0x7E12; unicode_map[0x6554] = 0x7E31; unicode_map[0x6555] = 0x7E1F; unicode_map[0x6556] = 0x7E09; unicode_map[0x6557] = 0x7E0B; unicode_map[0x6558] = 0x7E22; unicode_map[0x6559] = 0x7E46; unicode_map[0x655A] = 0x7E66; unicode_map[0x655B] = 0x7E3B; unicode_map[0x655C] = 0x7E35; unicode_map[0x655D] = 0x7E39; unicode_map[0x655E] = 0x7E43; unicode_map[0x655F] = 0x7E37; unicode_map[0x6560] = 0x7E32; unicode_map[0x6561] = 0x7E3A; unicode_map[0x6562] = 0x7E67; unicode_map[0x6563] = 0x7E5D; unicode_map[0x6564] = 0x7E56; unicode_map[0x6565] = 0x7E5E; unicode_map[0x6566] = 0x7E59; unicode_map[0x6567] = 0x7E5A; unicode_map[0x6568] = 0x7E79; unicode_map[0x6569] = 0x7E6A; unicode_map[0x656A] = 0x7E69; unicode_map[0x656B] = 0x7E7C; unicode_map[0x656C] = 0x7E7B; unicode_map[0x656D] = 0x7E83; unicode_map[0x656E] = 0x7DD5; unicode_map[0x656F] = 0x7E7D; unicode_map[0x6570] = 0x8FAE; unicode_map[0x6571] = 0x7E7F; unicode_map[0x6572] = 0x7E88; unicode_map[0x6573] = 0x7E89; unicode_map[0x6574] = 0x7E8C; unicode_map[0x6575] = 0x7E92; unicode_map[0x6576] = 0x7E90; unicode_map[0x6577] = 0x7E93; unicode_map[0x6578] = 0x7E94; unicode_map[0x6579] = 0x7E96; unicode_map[0x657A] = 0x7E8E; unicode_map[0x657B] = 0x7E9B; unicode_map[0x657C] = 0x7E9C; unicode_map[0x657D] = 0x7F38; unicode_map[0x657E] = 0x7F3A; unicode_map[0x6621] = 0x7F45; unicode_map[0x6622] = 0x7F4C; unicode_map[0x6623] = 0x7F4D; unicode_map[0x6624] = 0x7F4E; unicode_map[0x6625] = 0x7F50; unicode_map[0x6626] = 0x7F51; unicode_map[0x6627] = 0x7F55; unicode_map[0x6628] = 0x7F54; unicode_map[0x6629] = 0x7F58; unicode_map[0x662A] = 0x7F5F; unicode_map[0x662B] = 0x7F60; unicode_map[0x662C] = 0x7F68; unicode_map[0x662D] = 0x7F69; unicode_map[0x662E] = 0x7F67; unicode_map[0x662F] = 0x7F78; unicode_map[0x6630] = 0x7F82; unicode_map[0x6631] = 0x7F86; unicode_map[0x6632] = 0x7F83; unicode_map[0x6633] = 0x7F88; unicode_map[0x6634] = 0x7F87; unicode_map[0x6635] = 0x7F8C; unicode_map[0x6636] = 0x7F94; unicode_map[0x6637] = 0x7F9E; unicode_map[0x6638] = 0x7F9D; unicode_map[0x6639] = 0x7F9A; unicode_map[0x663A] = 0x7FA3; unicode_map[0x663B] = 0x7FAF; unicode_map[0x663C] = 0x7FB2; unicode_map[0x663D] = 0x7FB9; unicode_map[0x663E] = 0x7FAE; unicode_map[0x663F] = 0x7FB6; unicode_map[0x6640] = 0x7FB8; unicode_map[0x6641] = 0x8B71; unicode_map[0x6642] = 0x7FC5; unicode_map[0x6643] = 0x7FC6; unicode_map[0x6644] = 0x7FCA; unicode_map[0x6645] = 0x7FD5; unicode_map[0x6646] = 0x7FD4; unicode_map[0x6647] = 0x7FE1; unicode_map[0x6648] = 0x7FE6; unicode_map[0x6649] = 0x7FE9; unicode_map[0x664A] = 0x7FF3; unicode_map[0x664B] = 0x7FF9; unicode_map[0x664C] = 0x98DC; unicode_map[0x664D] = 0x8006; unicode_map[0x664E] = 0x8004; unicode_map[0x664F] = 0x800B; unicode_map[0x6650] = 0x8012; unicode_map[0x6651] = 0x8018; unicode_map[0x6652] = 0x8019; unicode_map[0x6653] = 0x801C; unicode_map[0x6654] = 0x8021; unicode_map[0x6655] = 0x8028; unicode_map[0x6656] = 0x803F; unicode_map[0x6657] = 0x803B; unicode_map[0x6658] = 0x804A; unicode_map[0x6659] = 0x8046; unicode_map[0x665A] = 0x8052; unicode_map[0x665B] = 0x8058; unicode_map[0x665C] = 0x805A; unicode_map[0x665D] = 0x805F; unicode_map[0x665E] = 0x8062; unicode_map[0x665F] = 0x8068; unicode_map[0x6660] = 0x8073; unicode_map[0x6661] = 0x8072; unicode_map[0x6662] = 0x8070; unicode_map[0x6663] = 0x8076; unicode_map[0x6664] = 0x8079; unicode_map[0x6665] = 0x807D; unicode_map[0x6666] = 0x807F; unicode_map[0x6667] = 0x8084; unicode_map[0x6668] = 0x8086; unicode_map[0x6669] = 0x8085; unicode_map[0x666A] = 0x809B; unicode_map[0x666B] = 0x8093; unicode_map[0x666C] = 0x809A; unicode_map[0x666D] = 0x80AD; unicode_map[0x666E] = 0x5190; unicode_map[0x666F] = 0x80AC; unicode_map[0x6670] = 0x80DB; unicode_map[0x6671] = 0x80E5; unicode_map[0x6672] = 0x80D9; unicode_map[0x6673] = 0x80DD; unicode_map[0x6674] = 0x80C4; unicode_map[0x6675] = 0x80DA; unicode_map[0x6676] = 0x80D6; unicode_map[0x6677] = 0x8109; unicode_map[0x6678] = 0x80EF; unicode_map[0x6679] = 0x80F1; unicode_map[0x667A] = 0x811B; unicode_map[0x667B] = 0x8129; unicode_map[0x667C] = 0x8123; unicode_map[0x667D] = 0x812F; unicode_map[0x667E] = 0x814B; unicode_map[0x6721] = 0x968B; unicode_map[0x6722] = 0x8146; unicode_map[0x6723] = 0x813E; unicode_map[0x6724] = 0x8153; unicode_map[0x6725] = 0x8151; unicode_map[0x6726] = 0x80FC; unicode_map[0x6727] = 0x8171; unicode_map[0x6728] = 0x816E; unicode_map[0x6729] = 0x8165; unicode_map[0x672A] = 0x8166; unicode_map[0x672B] = 0x8174; unicode_map[0x672C] = 0x8183; unicode_map[0x672D] = 0x8188; unicode_map[0x672E] = 0x818A; unicode_map[0x672F] = 0x8180; unicode_map[0x6730] = 0x8182; unicode_map[0x6731] = 0x81A0; unicode_map[0x6732] = 0x8195; unicode_map[0x6733] = 0x81A4; unicode_map[0x6734] = 0x81A3; unicode_map[0x6735] = 0x815F; unicode_map[0x6736] = 0x8193; unicode_map[0x6737] = 0x81A9; unicode_map[0x6738] = 0x81B0; unicode_map[0x6739] = 0x81B5; unicode_map[0x673A] = 0x81BE; unicode_map[0x673B] = 0x81B8; unicode_map[0x673C] = 0x81BD; unicode_map[0x673D] = 0x81C0; unicode_map[0x673E] = 0x81C2; unicode_map[0x673F] = 0x81BA; unicode_map[0x6740] = 0x81C9; unicode_map[0x6741] = 0x81CD; unicode_map[0x6742] = 0x81D1; unicode_map[0x6743] = 0x81D9; unicode_map[0x6744] = 0x81D8; unicode_map[0x6745] = 0x81C8; unicode_map[0x6746] = 0x81DA; unicode_map[0x6747] = 0x81DF; unicode_map[0x6748] = 0x81E0; unicode_map[0x6749] = 0x81E7; unicode_map[0x674A] = 0x81FA; unicode_map[0x674B] = 0x81FB; unicode_map[0x674C] = 0x81FE; unicode_map[0x674D] = 0x8201; unicode_map[0x674E] = 0x8202; unicode_map[0x674F] = 0x8205; unicode_map[0x6750] = 0x8207; unicode_map[0x6751] = 0x820A; unicode_map[0x6752] = 0x820D; unicode_map[0x6753] = 0x8210; unicode_map[0x6754] = 0x8216; unicode_map[0x6755] = 0x8229; unicode_map[0x6756] = 0x822B; unicode_map[0x6757] = 0x8238; unicode_map[0x6758] = 0x8233; unicode_map[0x6759] = 0x8240; unicode_map[0x675A] = 0x8259; unicode_map[0x675B] = 0x8258; unicode_map[0x675C] = 0x825D; unicode_map[0x675D] = 0x825A; unicode_map[0x675E] = 0x825F; unicode_map[0x675F] = 0x8264; unicode_map[0x6760] = 0x8262; unicode_map[0x6761] = 0x8268; unicode_map[0x6762] = 0x826A; unicode_map[0x6763] = 0x826B; unicode_map[0x6764] = 0x822E; unicode_map[0x6765] = 0x8271; unicode_map[0x6766] = 0x8277; unicode_map[0x6767] = 0x8278; unicode_map[0x6768] = 0x827E; unicode_map[0x6769] = 0x828D; unicode_map[0x676A] = 0x8292; unicode_map[0x676B] = 0x82AB; unicode_map[0x676C] = 0x829F; unicode_map[0x676D] = 0x82BB; unicode_map[0x676E] = 0x82AC; unicode_map[0x676F] = 0x82E1; unicode_map[0x6770] = 0x82E3; unicode_map[0x6771] = 0x82DF; unicode_map[0x6772] = 0x82D2; unicode_map[0x6773] = 0x82F4; unicode_map[0x6774] = 0x82F3; unicode_map[0x6775] = 0x82FA; unicode_map[0x6776] = 0x8393; unicode_map[0x6777] = 0x8303; unicode_map[0x6778] = 0x82FB; unicode_map[0x6779] = 0x82F9; unicode_map[0x677A] = 0x82DE; unicode_map[0x677B] = 0x8306; unicode_map[0x677C] = 0x82DC; unicode_map[0x677D] = 0x8309; unicode_map[0x677E] = 0x82D9; unicode_map[0x6821] = 0x8335; unicode_map[0x6822] = 0x8334; unicode_map[0x6823] = 0x8316; unicode_map[0x6824] = 0x8332; unicode_map[0x6825] = 0x8331; unicode_map[0x6826] = 0x8340; unicode_map[0x6827] = 0x8339; unicode_map[0x6828] = 0x8350; unicode_map[0x6829] = 0x8345; unicode_map[0x682A] = 0x832F; unicode_map[0x682B] = 0x832B; unicode_map[0x682C] = 0x8317; unicode_map[0x682D] = 0x8318; unicode_map[0x682E] = 0x8385; unicode_map[0x682F] = 0x839A; unicode_map[0x6830] = 0x83AA; unicode_map[0x6831] = 0x839F; unicode_map[0x6832] = 0x83A2; unicode_map[0x6833] = 0x8396; unicode_map[0x6834] = 0x8323; unicode_map[0x6835] = 0x838E; unicode_map[0x6836] = 0x8387; unicode_map[0x6837] = 0x838A; unicode_map[0x6838] = 0x837C; unicode_map[0x6839] = 0x83B5; unicode_map[0x683A] = 0x8373; unicode_map[0x683B] = 0x8375; unicode_map[0x683C] = 0x83A0; unicode_map[0x683D] = 0x8389; unicode_map[0x683E] = 0x83A8; unicode_map[0x683F] = 0x83F4; unicode_map[0x6840] = 0x8413; unicode_map[0x6841] = 0x83EB; unicode_map[0x6842] = 0x83CE; unicode_map[0x6843] = 0x83FD; unicode_map[0x6844] = 0x8403; unicode_map[0x6845] = 0x83D8; unicode_map[0x6846] = 0x840B; unicode_map[0x6847] = 0x83C1; unicode_map[0x6848] = 0x83F7; unicode_map[0x6849] = 0x8407; unicode_map[0x684A] = 0x83E0; unicode_map[0x684B] = 0x83F2; unicode_map[0x684C] = 0x840D; unicode_map[0x684D] = 0x8422; unicode_map[0x684E] = 0x8420; unicode_map[0x684F] = 0x83BD; unicode_map[0x6850] = 0x8438; unicode_map[0x6851] = 0x8506; unicode_map[0x6852] = 0x83FB; unicode_map[0x6853] = 0x846D; unicode_map[0x6854] = 0x842A; unicode_map[0x6855] = 0x843C; unicode_map[0x6856] = 0x855A; unicode_map[0x6857] = 0x8484; unicode_map[0x6858] = 0x8477; unicode_map[0x6859] = 0x846B; unicode_map[0x685A] = 0x84AD; unicode_map[0x685B] = 0x846E; unicode_map[0x685C] = 0x8482; unicode_map[0x685D] = 0x8469; unicode_map[0x685E] = 0x8446; unicode_map[0x685F] = 0x842C; unicode_map[0x6860] = 0x846F; unicode_map[0x6861] = 0x8479; unicode_map[0x6862] = 0x8435; unicode_map[0x6863] = 0x84CA; unicode_map[0x6864] = 0x8462; unicode_map[0x6865] = 0x84B9; unicode_map[0x6866] = 0x84BF; unicode_map[0x6867] = 0x849F; unicode_map[0x6868] = 0x84D9; unicode_map[0x6869] = 0x84CD; unicode_map[0x686A] = 0x84BB; unicode_map[0x686B] = 0x84DA; unicode_map[0x686C] = 0x84D0; unicode_map[0x686D] = 0x84C1; unicode_map[0x686E] = 0x84C6; unicode_map[0x686F] = 0x84D6; unicode_map[0x6870] = 0x84A1; unicode_map[0x6871] = 0x8521; unicode_map[0x6872] = 0x84FF; unicode_map[0x6873] = 0x84F4; unicode_map[0x6874] = 0x8517; unicode_map[0x6875] = 0x8518; unicode_map[0x6876] = 0x852C; unicode_map[0x6877] = 0x851F; unicode_map[0x6878] = 0x8515; unicode_map[0x6879] = 0x8514; unicode_map[0x687A] = 0x84FC; unicode_map[0x687B] = 0x8540; unicode_map[0x687C] = 0x8563; unicode_map[0x687D] = 0x8558; unicode_map[0x687E] = 0x8548; unicode_map[0x6921] = 0x8541; unicode_map[0x6922] = 0x8602; unicode_map[0x6923] = 0x854B; unicode_map[0x6924] = 0x8555; unicode_map[0x6925] = 0x8580; unicode_map[0x6926] = 0x85A4; unicode_map[0x6927] = 0x8588; unicode_map[0x6928] = 0x8591; unicode_map[0x6929] = 0x858A; unicode_map[0x692A] = 0x85A8; unicode_map[0x692B] = 0x856D; unicode_map[0x692C] = 0x8594; unicode_map[0x692D] = 0x859B; unicode_map[0x692E] = 0x85EA; unicode_map[0x692F] = 0x8587; unicode_map[0x6930] = 0x859C; unicode_map[0x6931] = 0x8577; unicode_map[0x6932] = 0x857E; unicode_map[0x6933] = 0x8590; unicode_map[0x6934] = 0x85C9; unicode_map[0x6935] = 0x85BA; unicode_map[0x6936] = 0x85CF; unicode_map[0x6937] = 0x85B9; unicode_map[0x6938] = 0x85D0; unicode_map[0x6939] = 0x85D5; unicode_map[0x693A] = 0x85DD; unicode_map[0x693B] = 0x85E5; unicode_map[0x693C] = 0x85DC; unicode_map[0x693D] = 0x85F9; unicode_map[0x693E] = 0x860A; unicode_map[0x693F] = 0x8613; unicode_map[0x6940] = 0x860B; unicode_map[0x6941] = 0x85FE; unicode_map[0x6942] = 0x85FA; unicode_map[0x6943] = 0x8606; unicode_map[0x6944] = 0x8622; unicode_map[0x6945] = 0x861A; unicode_map[0x6946] = 0x8630; unicode_map[0x6947] = 0x863F; unicode_map[0x6948] = 0x864D; unicode_map[0x6949] = 0x4E55; unicode_map[0x694A] = 0x8654; unicode_map[0x694B] = 0x865F; unicode_map[0x694C] = 0x8667; unicode_map[0x694D] = 0x8671; unicode_map[0x694E] = 0x8693; unicode_map[0x694F] = 0x86A3; unicode_map[0x6950] = 0x86A9; unicode_map[0x6951] = 0x86AA; unicode_map[0x6952] = 0x868B; unicode_map[0x6953] = 0x868C; unicode_map[0x6954] = 0x86B6; unicode_map[0x6955] = 0x86AF; unicode_map[0x6956] = 0x86C4; unicode_map[0x6957] = 0x86C6; unicode_map[0x6958] = 0x86B0; unicode_map[0x6959] = 0x86C9; unicode_map[0x695A] = 0x8823; unicode_map[0x695B] = 0x86AB; unicode_map[0x695C] = 0x86D4; unicode_map[0x695D] = 0x86DE; unicode_map[0x695E] = 0x86E9; unicode_map[0x695F] = 0x86EC; unicode_map[0x6960] = 0x86DF; unicode_map[0x6961] = 0x86DB; unicode_map[0x6962] = 0x86EF; unicode_map[0x6963] = 0x8712; unicode_map[0x6964] = 0x8706; unicode_map[0x6965] = 0x8708; unicode_map[0x6966] = 0x8700; unicode_map[0x6967] = 0x8703; unicode_map[0x6968] = 0x86FB; unicode_map[0x6969] = 0x8711; unicode_map[0x696A] = 0x8709; unicode_map[0x696B] = 0x870D; unicode_map[0x696C] = 0x86F9; unicode_map[0x696D] = 0x870A; unicode_map[0x696E] = 0x8734; unicode_map[0x696F] = 0x873F; unicode_map[0x6970] = 0x8737; unicode_map[0x6971] = 0x873B; unicode_map[0x6972] = 0x8725; unicode_map[0x6973] = 0x8729; unicode_map[0x6974] = 0x871A; unicode_map[0x6975] = 0x8760; unicode_map[0x6976] = 0x875F; unicode_map[0x6977] = 0x8778; unicode_map[0x6978] = 0x874C; unicode_map[0x6979] = 0x874E; unicode_map[0x697A] = 0x8774; unicode_map[0x697B] = 0x8757; unicode_map[0x697C] = 0x8768; unicode_map[0x697D] = 0x876E; unicode_map[0x697E] = 0x8759; unicode_map[0x6A21] = 0x8753; unicode_map[0x6A22] = 0x8763; unicode_map[0x6A23] = 0x876A; unicode_map[0x6A24] = 0x8805; unicode_map[0x6A25] = 0x87A2; unicode_map[0x6A26] = 0x879F; unicode_map[0x6A27] = 0x8782; unicode_map[0x6A28] = 0x87AF; unicode_map[0x6A29] = 0x87CB; unicode_map[0x6A2A] = 0x87BD; unicode_map[0x6A2B] = 0x87C0; unicode_map[0x6A2C] = 0x87D0; unicode_map[0x6A2D] = 0x96D6; unicode_map[0x6A2E] = 0x87AB; unicode_map[0x6A2F] = 0x87C4; unicode_map[0x6A30] = 0x87B3; unicode_map[0x6A31] = 0x87C7; unicode_map[0x6A32] = 0x87C6; unicode_map[0x6A33] = 0x87BB; unicode_map[0x6A34] = 0x87EF; unicode_map[0x6A35] = 0x87F2; unicode_map[0x6A36] = 0x87E0; unicode_map[0x6A37] = 0x880F; unicode_map[0x6A38] = 0x880D; unicode_map[0x6A39] = 0x87FE; unicode_map[0x6A3A] = 0x87F6; unicode_map[0x6A3B] = 0x87F7; unicode_map[0x6A3C] = 0x880E; unicode_map[0x6A3D] = 0x87D2; unicode_map[0x6A3E] = 0x8811; unicode_map[0x6A3F] = 0x8816; unicode_map[0x6A40] = 0x8815; unicode_map[0x6A41] = 0x8822; unicode_map[0x6A42] = 0x8821; unicode_map[0x6A43] = 0x8831; unicode_map[0x6A44] = 0x8836; unicode_map[0x6A45] = 0x8839; unicode_map[0x6A46] = 0x8827; unicode_map[0x6A47] = 0x883B; unicode_map[0x6A48] = 0x8844; unicode_map[0x6A49] = 0x8842; unicode_map[0x6A4A] = 0x8852; unicode_map[0x6A4B] = 0x8859; unicode_map[0x6A4C] = 0x885E; unicode_map[0x6A4D] = 0x8862; unicode_map[0x6A4E] = 0x886B; unicode_map[0x6A4F] = 0x8881; unicode_map[0x6A50] = 0x887E; unicode_map[0x6A51] = 0x889E; unicode_map[0x6A52] = 0x8875; unicode_map[0x6A53] = 0x887D; unicode_map[0x6A54] = 0x88B5; unicode_map[0x6A55] = 0x8872; unicode_map[0x6A56] = 0x8882; unicode_map[0x6A57] = 0x8897; unicode_map[0x6A58] = 0x8892; unicode_map[0x6A59] = 0x88AE; unicode_map[0x6A5A] = 0x8899; unicode_map[0x6A5B] = 0x88A2; unicode_map[0x6A5C] = 0x888D; unicode_map[0x6A5D] = 0x88A4; unicode_map[0x6A5E] = 0x88B0; unicode_map[0x6A5F] = 0x88BF; unicode_map[0x6A60] = 0x88B1; unicode_map[0x6A61] = 0x88C3; unicode_map[0x6A62] = 0x88C4; unicode_map[0x6A63] = 0x88D4; unicode_map[0x6A64] = 0x88D8; unicode_map[0x6A65] = 0x88D9; unicode_map[0x6A66] = 0x88DD; unicode_map[0x6A67] = 0x88F9; unicode_map[0x6A68] = 0x8902; unicode_map[0x6A69] = 0x88FC; unicode_map[0x6A6A] = 0x88F4; unicode_map[0x6A6B] = 0x88E8; unicode_map[0x6A6C] = 0x88F2; unicode_map[0x6A6D] = 0x8904; unicode_map[0x6A6E] = 0x890C; unicode_map[0x6A6F] = 0x890A; unicode_map[0x6A70] = 0x8913; unicode_map[0x6A71] = 0x8943; unicode_map[0x6A72] = 0x891E; unicode_map[0x6A73] = 0x8925; unicode_map[0x6A74] = 0x892A; unicode_map[0x6A75] = 0x892B; unicode_map[0x6A76] = 0x8941; unicode_map[0x6A77] = 0x8944; unicode_map[0x6A78] = 0x893B; unicode_map[0x6A79] = 0x8936; unicode_map[0x6A7A] = 0x8938; unicode_map[0x6A7B] = 0x894C; unicode_map[0x6A7C] = 0x891D; unicode_map[0x6A7D] = 0x8960; unicode_map[0x6A7E] = 0x895E; unicode_map[0x6B21] = 0x8966; unicode_map[0x6B22] = 0x8964; unicode_map[0x6B23] = 0x896D; unicode_map[0x6B24] = 0x896A; unicode_map[0x6B25] = 0x896F; unicode_map[0x6B26] = 0x8974; unicode_map[0x6B27] = 0x8977; unicode_map[0x6B28] = 0x897E; unicode_map[0x6B29] = 0x8983; unicode_map[0x6B2A] = 0x8988; unicode_map[0x6B2B] = 0x898A; unicode_map[0x6B2C] = 0x8993; unicode_map[0x6B2D] = 0x8998; unicode_map[0x6B2E] = 0x89A1; unicode_map[0x6B2F] = 0x89A9; unicode_map[0x6B30] = 0x89A6; unicode_map[0x6B31] = 0x89AC; unicode_map[0x6B32] = 0x89AF; unicode_map[0x6B33] = 0x89B2; unicode_map[0x6B34] = 0x89BA; unicode_map[0x6B35] = 0x89BD; unicode_map[0x6B36] = 0x89BF; unicode_map[0x6B37] = 0x89C0; unicode_map[0x6B38] = 0x89DA; unicode_map[0x6B39] = 0x89DC; unicode_map[0x6B3A] = 0x89DD; unicode_map[0x6B3B] = 0x89E7; unicode_map[0x6B3C] = 0x89F4; unicode_map[0x6B3D] = 0x89F8; unicode_map[0x6B3E] = 0x8A03; unicode_map[0x6B3F] = 0x8A16; unicode_map[0x6B40] = 0x8A10; unicode_map[0x6B41] = 0x8A0C; unicode_map[0x6B42] = 0x8A1B; unicode_map[0x6B43] = 0x8A1D; unicode_map[0x6B44] = 0x8A25; unicode_map[0x6B45] = 0x8A36; unicode_map[0x6B46] = 0x8A41; unicode_map[0x6B47] = 0x8A5B; unicode_map[0x6B48] = 0x8A52; unicode_map[0x6B49] = 0x8A46; unicode_map[0x6B4A] = 0x8A48; unicode_map[0x6B4B] = 0x8A7C; unicode_map[0x6B4C] = 0x8A6D; unicode_map[0x6B4D] = 0x8A6C; unicode_map[0x6B4E] = 0x8A62; unicode_map[0x6B4F] = 0x8A85; unicode_map[0x6B50] = 0x8A82; unicode_map[0x6B51] = 0x8A84; unicode_map[0x6B52] = 0x8AA8; unicode_map[0x6B53] = 0x8AA1; unicode_map[0x6B54] = 0x8A91; unicode_map[0x6B55] = 0x8AA5; unicode_map[0x6B56] = 0x8AA6; unicode_map[0x6B57] = 0x8A9A; unicode_map[0x6B58] = 0x8AA3; unicode_map[0x6B59] = 0x8AC4; unicode_map[0x6B5A] = 0x8ACD; unicode_map[0x6B5B] = 0x8AC2; unicode_map[0x6B5C] = 0x8ADA; unicode_map[0x6B5D] = 0x8AEB; unicode_map[0x6B5E] = 0x8AF3; unicode_map[0x6B5F] = 0x8AE7; unicode_map[0x6B60] = 0x8AE4; unicode_map[0x6B61] = 0x8AF1; unicode_map[0x6B62] = 0x8B14; unicode_map[0x6B63] = 0x8AE0; unicode_map[0x6B64] = 0x8AE2; unicode_map[0x6B65] = 0x8AF7; unicode_map[0x6B66] = 0x8ADE; unicode_map[0x6B67] = 0x8ADB; unicode_map[0x6B68] = 0x8B0C; unicode_map[0x6B69] = 0x8B07; unicode_map[0x6B6A] = 0x8B1A; unicode_map[0x6B6B] = 0x8AE1; unicode_map[0x6B6C] = 0x8B16; unicode_map[0x6B6D] = 0x8B10; unicode_map[0x6B6E] = 0x8B17; unicode_map[0x6B6F] = 0x8B20; unicode_map[0x6B70] = 0x8B33; unicode_map[0x6B71] = 0x97AB; unicode_map[0x6B72] = 0x8B26; unicode_map[0x6B73] = 0x8B2B; unicode_map[0x6B74] = 0x8B3E; unicode_map[0x6B75] = 0x8B28; unicode_map[0x6B76] = 0x8B41; unicode_map[0x6B77] = 0x8B4C; unicode_map[0x6B78] = 0x8B4F; unicode_map[0x6B79] = 0x8B4E; unicode_map[0x6B7A] = 0x8B49; unicode_map[0x6B7B] = 0x8B56; unicode_map[0x6B7C] = 0x8B5B; unicode_map[0x6B7D] = 0x8B5A; unicode_map[0x6B7E] = 0x8B6B; unicode_map[0x6C21] = 0x8B5F; unicode_map[0x6C22] = 0x8B6C; unicode_map[0x6C23] = 0x8B6F; unicode_map[0x6C24] = 0x8B74; unicode_map[0x6C25] = 0x8B7D; unicode_map[0x6C26] = 0x8B80; unicode_map[0x6C27] = 0x8B8C; unicode_map[0x6C28] = 0x8B8E; unicode_map[0x6C29] = 0x8B92; unicode_map[0x6C2A] = 0x8B93; unicode_map[0x6C2B] = 0x8B96; unicode_map[0x6C2C] = 0x8B99; unicode_map[0x6C2D] = 0x8B9A; unicode_map[0x6C2E] = 0x8C3A; unicode_map[0x6C2F] = 0x8C41; unicode_map[0x6C30] = 0x8C3F; unicode_map[0x6C31] = 0x8C48; unicode_map[0x6C32] = 0x8C4C; unicode_map[0x6C33] = 0x8C4E; unicode_map[0x6C34] = 0x8C50; unicode_map[0x6C35] = 0x8C55; unicode_map[0x6C36] = 0x8C62; unicode_map[0x6C37] = 0x8C6C; unicode_map[0x6C38] = 0x8C78; unicode_map[0x6C39] = 0x8C7A; unicode_map[0x6C3A] = 0x8C82; unicode_map[0x6C3B] = 0x8C89; unicode_map[0x6C3C] = 0x8C85; unicode_map[0x6C3D] = 0x8C8A; unicode_map[0x6C3E] = 0x8C8D; unicode_map[0x6C3F] = 0x8C8E; unicode_map[0x6C40] = 0x8C94; unicode_map[0x6C41] = 0x8C7C; unicode_map[0x6C42] = 0x8C98; unicode_map[0x6C43] = 0x621D; unicode_map[0x6C44] = 0x8CAD; unicode_map[0x6C45] = 0x8CAA; unicode_map[0x6C46] = 0x8CBD; unicode_map[0x6C47] = 0x8CB2; unicode_map[0x6C48] = 0x8CB3; unicode_map[0x6C49] = 0x8CAE; unicode_map[0x6C4A] = 0x8CB6; unicode_map[0x6C4B] = 0x8CC8; unicode_map[0x6C4C] = 0x8CC1; unicode_map[0x6C4D] = 0x8CE4; unicode_map[0x6C4E] = 0x8CE3; unicode_map[0x6C4F] = 0x8CDA; unicode_map[0x6C50] = 0x8CFD; unicode_map[0x6C51] = 0x8CFA; unicode_map[0x6C52] = 0x8CFB; unicode_map[0x6C53] = 0x8D04; unicode_map[0x6C54] = 0x8D05; unicode_map[0x6C55] = 0x8D0A; unicode_map[0x6C56] = 0x8D07; unicode_map[0x6C57] = 0x8D0F; unicode_map[0x6C58] = 0x8D0D; unicode_map[0x6C59] = 0x8D10; unicode_map[0x6C5A] = 0x9F4E; unicode_map[0x6C5B] = 0x8D13; unicode_map[0x6C5C] = 0x8CCD; unicode_map[0x6C5D] = 0x8D14; unicode_map[0x6C5E] = 0x8D16; unicode_map[0x6C5F] = 0x8D67; unicode_map[0x6C60] = 0x8D6D; unicode_map[0x6C61] = 0x8D71; unicode_map[0x6C62] = 0x8D73; unicode_map[0x6C63] = 0x8D81; unicode_map[0x6C64] = 0x8D99; unicode_map[0x6C65] = 0x8DC2; unicode_map[0x6C66] = 0x8DBE; unicode_map[0x6C67] = 0x8DBA; unicode_map[0x6C68] = 0x8DCF; unicode_map[0x6C69] = 0x8DDA; unicode_map[0x6C6A] = 0x8DD6; unicode_map[0x6C6B] = 0x8DCC; unicode_map[0x6C6C] = 0x8DDB; unicode_map[0x6C6D] = 0x8DCB; unicode_map[0x6C6E] = 0x8DEA; unicode_map[0x6C6F] = 0x8DEB; unicode_map[0x6C70] = 0x8DDF; unicode_map[0x6C71] = 0x8DE3; unicode_map[0x6C72] = 0x8DFC; unicode_map[0x6C73] = 0x8E08; unicode_map[0x6C74] = 0x8E09; unicode_map[0x6C75] = 0x8DFF; unicode_map[0x6C76] = 0x8E1D; unicode_map[0x6C77] = 0x8E1E; unicode_map[0x6C78] = 0x8E10; unicode_map[0x6C79] = 0x8E1F; unicode_map[0x6C7A] = 0x8E42; unicode_map[0x6C7B] = 0x8E35; unicode_map[0x6C7C] = 0x8E30; unicode_map[0x6C7D] = 0x8E34; unicode_map[0x6C7E] = 0x8E4A; unicode_map[0x6D21] = 0x8E47; unicode_map[0x6D22] = 0x8E49; unicode_map[0x6D23] = 0x8E4C; unicode_map[0x6D24] = 0x8E50; unicode_map[0x6D25] = 0x8E48; unicode_map[0x6D26] = 0x8E59; unicode_map[0x6D27] = 0x8E64; unicode_map[0x6D28] = 0x8E60; unicode_map[0x6D29] = 0x8E2A; unicode_map[0x6D2A] = 0x8E63; unicode_map[0x6D2B] = 0x8E55; unicode_map[0x6D2C] = 0x8E76; unicode_map[0x6D2D] = 0x8E72; unicode_map[0x6D2E] = 0x8E7C; unicode_map[0x6D2F] = 0x8E81; unicode_map[0x6D30] = 0x8E87; unicode_map[0x6D31] = 0x8E85; unicode_map[0x6D32] = 0x8E84; unicode_map[0x6D33] = 0x8E8B; unicode_map[0x6D34] = 0x8E8A; unicode_map[0x6D35] = 0x8E93; unicode_map[0x6D36] = 0x8E91; unicode_map[0x6D37] = 0x8E94; unicode_map[0x6D38] = 0x8E99; unicode_map[0x6D39] = 0x8EAA; unicode_map[0x6D3A] = 0x8EA1; unicode_map[0x6D3B] = 0x8EAC; unicode_map[0x6D3C] = 0x8EB0; unicode_map[0x6D3D] = 0x8EC6; unicode_map[0x6D3E] = 0x8EB1; unicode_map[0x6D3F] = 0x8EBE; unicode_map[0x6D40] = 0x8EC5; unicode_map[0x6D41] = 0x8EC8; unicode_map[0x6D42] = 0x8ECB; unicode_map[0x6D43] = 0x8EDB; unicode_map[0x6D44] = 0x8EE3; unicode_map[0x6D45] = 0x8EFC; unicode_map[0x6D46] = 0x8EFB; unicode_map[0x6D47] = 0x8EEB; unicode_map[0x6D48] = 0x8EFE; unicode_map[0x6D49] = 0x8F0A; unicode_map[0x6D4A] = 0x8F05; unicode_map[0x6D4B] = 0x8F15; unicode_map[0x6D4C] = 0x8F12; unicode_map[0x6D4D] = 0x8F19; unicode_map[0x6D4E] = 0x8F13; unicode_map[0x6D4F] = 0x8F1C; unicode_map[0x6D50] = 0x8F1F; unicode_map[0x6D51] = 0x8F1B; unicode_map[0x6D52] = 0x8F0C; unicode_map[0x6D53] = 0x8F26; unicode_map[0x6D54] = 0x8F33; unicode_map[0x6D55] = 0x8F3B; unicode_map[0x6D56] = 0x8F39; unicode_map[0x6D57] = 0x8F45; unicode_map[0x6D58] = 0x8F42; unicode_map[0x6D59] = 0x8F3E; unicode_map[0x6D5A] = 0x8F4C; unicode_map[0x6D5B] = 0x8F49; unicode_map[0x6D5C] = 0x8F46; unicode_map[0x6D5D] = 0x8F4E; unicode_map[0x6D5E] = 0x8F57; unicode_map[0x6D5F] = 0x8F5C; unicode_map[0x6D60] = 0x8F62; unicode_map[0x6D61] = 0x8F63; unicode_map[0x6D62] = 0x8F64; unicode_map[0x6D63] = 0x8F9C; unicode_map[0x6D64] = 0x8F9F; unicode_map[0x6D65] = 0x8FA3; unicode_map[0x6D66] = 0x8FAD; unicode_map[0x6D67] = 0x8FAF; unicode_map[0x6D68] = 0x8FB7; unicode_map[0x6D69] = 0x8FDA; unicode_map[0x6D6A] = 0x8FE5; unicode_map[0x6D6B] = 0x8FE2; unicode_map[0x6D6C] = 0x8FEA; unicode_map[0x6D6D] = 0x8FEF; unicode_map[0x6D6E] = 0x9087; unicode_map[0x6D6F] = 0x8FF4; unicode_map[0x6D70] = 0x9005; unicode_map[0x6D71] = 0x8FF9; unicode_map[0x6D72] = 0x8FFA; unicode_map[0x6D73] = 0x9011; unicode_map[0x6D74] = 0x9015; unicode_map[0x6D75] = 0x9021; unicode_map[0x6D76] = 0x900D; unicode_map[0x6D77] = 0x901E; unicode_map[0x6D78] = 0x9016; unicode_map[0x6D79] = 0x900B; unicode_map[0x6D7A] = 0x9027; unicode_map[0x6D7B] = 0x9036; unicode_map[0x6D7C] = 0x9035; unicode_map[0x6D7D] = 0x9039; unicode_map[0x6D7E] = 0x8FF8; unicode_map[0x6E21] = 0x904F; unicode_map[0x6E22] = 0x9050; unicode_map[0x6E23] = 0x9051; unicode_map[0x6E24] = 0x9052; unicode_map[0x6E25] = 0x900E; unicode_map[0x6E26] = 0x9049; unicode_map[0x6E27] = 0x903E; unicode_map[0x6E28] = 0x9056; unicode_map[0x6E29] = 0x9058; unicode_map[0x6E2A] = 0x905E; unicode_map[0x6E2B] = 0x9068; unicode_map[0x6E2C] = 0x906F; unicode_map[0x6E2D] = 0x9076; unicode_map[0x6E2E] = 0x96A8; unicode_map[0x6E2F] = 0x9072; unicode_map[0x6E30] = 0x9082; unicode_map[0x6E31] = 0x907D; unicode_map[0x6E32] = 0x9081; unicode_map[0x6E33] = 0x9080; unicode_map[0x6E34] = 0x908A; unicode_map[0x6E35] = 0x9089; unicode_map[0x6E36] = 0x908F; unicode_map[0x6E37] = 0x90A8; unicode_map[0x6E38] = 0x90AF; unicode_map[0x6E39] = 0x90B1; unicode_map[0x6E3A] = 0x90B5; unicode_map[0x6E3B] = 0x90E2; unicode_map[0x6E3C] = 0x90E4; unicode_map[0x6E3D] = 0x6248; unicode_map[0x6E3E] = 0x90DB; unicode_map[0x6E3F] = 0x9102; unicode_map[0x6E40] = 0x9112; unicode_map[0x6E41] = 0x9119; unicode_map[0x6E42] = 0x9132; unicode_map[0x6E43] = 0x9130; unicode_map[0x6E44] = 0x914A; unicode_map[0x6E45] = 0x9156; unicode_map[0x6E46] = 0x9158; unicode_map[0x6E47] = 0x9163; unicode_map[0x6E48] = 0x9165; unicode_map[0x6E49] = 0x9169; unicode_map[0x6E4A] = 0x9173; unicode_map[0x6E4B] = 0x9172; unicode_map[0x6E4C] = 0x918B; unicode_map[0x6E4D] = 0x9189; unicode_map[0x6E4E] = 0x9182; unicode_map[0x6E4F] = 0x91A2; unicode_map[0x6E50] = 0x91AB; unicode_map[0x6E51] = 0x91AF; unicode_map[0x6E52] = 0x91AA; unicode_map[0x6E53] = 0x91B5; unicode_map[0x6E54] = 0x91B4; unicode_map[0x6E55] = 0x91BA; unicode_map[0x6E56] = 0x91C0; unicode_map[0x6E57] = 0x91C1; unicode_map[0x6E58] = 0x91C9; unicode_map[0x6E59] = 0x91CB; unicode_map[0x6E5A] = 0x91D0; unicode_map[0x6E5B] = 0x91D6; unicode_map[0x6E5C] = 0x91DF; unicode_map[0x6E5D] = 0x91E1; unicode_map[0x6E5E] = 0x91DB; unicode_map[0x6E5F] = 0x91FC; unicode_map[0x6E60] = 0x91F5; unicode_map[0x6E61] = 0x91F6; unicode_map[0x6E62] = 0x921E; unicode_map[0x6E63] = 0x91FF; unicode_map[0x6E64] = 0x9214; unicode_map[0x6E65] = 0x922C; unicode_map[0x6E66] = 0x9215; unicode_map[0x6E67] = 0x9211; unicode_map[0x6E68] = 0x925E; unicode_map[0x6E69] = 0x9257; unicode_map[0x6E6A] = 0x9245; unicode_map[0x6E6B] = 0x9249; unicode_map[0x6E6C] = 0x9264; unicode_map[0x6E6D] = 0x9248; unicode_map[0x6E6E] = 0x9295; unicode_map[0x6E6F] = 0x923F; unicode_map[0x6E70] = 0x924B; unicode_map[0x6E71] = 0x9250; unicode_map[0x6E72] = 0x929C; unicode_map[0x6E73] = 0x9296; unicode_map[0x6E74] = 0x9293; unicode_map[0x6E75] = 0x929B; unicode_map[0x6E76] = 0x925A; unicode_map[0x6E77] = 0x92CF; unicode_map[0x6E78] = 0x92B9; unicode_map[0x6E79] = 0x92B7; unicode_map[0x6E7A] = 0x92E9; unicode_map[0x6E7B] = 0x930F; unicode_map[0x6E7C] = 0x92FA; unicode_map[0x6E7D] = 0x9344; unicode_map[0x6E7E] = 0x932E; unicode_map[0x6F21] = 0x9319; unicode_map[0x6F22] = 0x9322; unicode_map[0x6F23] = 0x931A; unicode_map[0x6F24] = 0x9323; unicode_map[0x6F25] = 0x933A; unicode_map[0x6F26] = 0x9335; unicode_map[0x6F27] = 0x933B; unicode_map[0x6F28] = 0x935C; unicode_map[0x6F29] = 0x9360; unicode_map[0x6F2A] = 0x937C; unicode_map[0x6F2B] = 0x936E; unicode_map[0x6F2C] = 0x9356; unicode_map[0x6F2D] = 0x93B0; unicode_map[0x6F2E] = 0x93AC; unicode_map[0x6F2F] = 0x93AD; unicode_map[0x6F30] = 0x9394; unicode_map[0x6F31] = 0x93B9; unicode_map[0x6F32] = 0x93D6; unicode_map[0x6F33] = 0x93D7; unicode_map[0x6F34] = 0x93E8; unicode_map[0x6F35] = 0x93E5; unicode_map[0x6F36] = 0x93D8; unicode_map[0x6F37] = 0x93C3; unicode_map[0x6F38] = 0x93DD; unicode_map[0x6F39] = 0x93D0; unicode_map[0x6F3A] = 0x93C8; unicode_map[0x6F3B] = 0x93E4; unicode_map[0x6F3C] = 0x941A; unicode_map[0x6F3D] = 0x9414; unicode_map[0x6F3E] = 0x9413; unicode_map[0x6F3F] = 0x9403; unicode_map[0x6F40] = 0x9407; unicode_map[0x6F41] = 0x9410; unicode_map[0x6F42] = 0x9436; unicode_map[0x6F43] = 0x942B; unicode_map[0x6F44] = 0x9435; unicode_map[0x6F45] = 0x9421; unicode_map[0x6F46] = 0x943A; unicode_map[0x6F47] = 0x9441; unicode_map[0x6F48] = 0x9452; unicode_map[0x6F49] = 0x9444; unicode_map[0x6F4A] = 0x945B; unicode_map[0x6F4B] = 0x9460; unicode_map[0x6F4C] = 0x9462; unicode_map[0x6F4D] = 0x945E; unicode_map[0x6F4E] = 0x946A; unicode_map[0x6F4F] = 0x9229; unicode_map[0x6F50] = 0x9470; unicode_map[0x6F51] = 0x9475; unicode_map[0x6F52] = 0x9477; unicode_map[0x6F53] = 0x947D; unicode_map[0x6F54] = 0x945A; unicode_map[0x6F55] = 0x947C; unicode_map[0x6F56] = 0x947E; unicode_map[0x6F57] = 0x9481; unicode_map[0x6F58] = 0x947F; unicode_map[0x6F59] = 0x9582; unicode_map[0x6F5A] = 0x9587; unicode_map[0x6F5B] = 0x958A; unicode_map[0x6F5C] = 0x9594; unicode_map[0x6F5D] = 0x9596; unicode_map[0x6F5E] = 0x9598; unicode_map[0x6F5F] = 0x9599; unicode_map[0x6F60] = 0x95A0; unicode_map[0x6F61] = 0x95A8; unicode_map[0x6F62] = 0x95A7; unicode_map[0x6F63] = 0x95AD; unicode_map[0x6F64] = 0x95BC; unicode_map[0x6F65] = 0x95BB; unicode_map[0x6F66] = 0x95B9; unicode_map[0x6F67] = 0x95BE; unicode_map[0x6F68] = 0x95CA; unicode_map[0x6F69] = 0x6FF6; unicode_map[0x6F6A] = 0x95C3; unicode_map[0x6F6B] = 0x95CD; unicode_map[0x6F6C] = 0x95CC; unicode_map[0x6F6D] = 0x95D5; unicode_map[0x6F6E] = 0x95D4; unicode_map[0x6F6F] = 0x95D6; unicode_map[0x6F70] = 0x95DC; unicode_map[0x6F71] = 0x95E1; unicode_map[0x6F72] = 0x95E5; unicode_map[0x6F73] = 0x95E2; unicode_map[0x6F74] = 0x9621; unicode_map[0x6F75] = 0x9628; unicode_map[0x6F76] = 0x962E; unicode_map[0x6F77] = 0x962F; unicode_map[0x6F78] = 0x9642; unicode_map[0x6F79] = 0x964C; unicode_map[0x6F7A] = 0x964F; unicode_map[0x6F7B] = 0x964B; unicode_map[0x6F7C] = 0x9677; unicode_map[0x6F7D] = 0x965C; unicode_map[0x6F7E] = 0x965E; unicode_map[0x7021] = 0x965D; unicode_map[0x7022] = 0x965F; unicode_map[0x7023] = 0x9666; unicode_map[0x7024] = 0x9672; unicode_map[0x7025] = 0x966C; unicode_map[0x7026] = 0x968D; unicode_map[0x7027] = 0x9698; unicode_map[0x7028] = 0x9695; unicode_map[0x7029] = 0x9697; unicode_map[0x702A] = 0x96AA; unicode_map[0x702B] = 0x96A7; unicode_map[0x702C] = 0x96B1; unicode_map[0x702D] = 0x96B2; unicode_map[0x702E] = 0x96B0; unicode_map[0x702F] = 0x96B4; unicode_map[0x7030] = 0x96B6; unicode_map[0x7031] = 0x96B8; unicode_map[0x7032] = 0x96B9; unicode_map[0x7033] = 0x96CE; unicode_map[0x7034] = 0x96CB; unicode_map[0x7035] = 0x96C9; unicode_map[0x7036] = 0x96CD; unicode_map[0x7037] = 0x894D; unicode_map[0x7038] = 0x96DC; unicode_map[0x7039] = 0x970D; unicode_map[0x703A] = 0x96D5; unicode_map[0x703B] = 0x96F9; unicode_map[0x703C] = 0x9704; unicode_map[0x703D] = 0x9706; unicode_map[0x703E] = 0x9708; unicode_map[0x703F] = 0x9713; unicode_map[0x7040] = 0x970E; unicode_map[0x7041] = 0x9711; unicode_map[0x7042] = 0x970F; unicode_map[0x7043] = 0x9716; unicode_map[0x7044] = 0x9719; unicode_map[0x7045] = 0x9724; unicode_map[0x7046] = 0x972A; unicode_map[0x7047] = 0x9730; unicode_map[0x7048] = 0x9739; unicode_map[0x7049] = 0x973D; unicode_map[0x704A] = 0x973E; unicode_map[0x704B] = 0x9744; unicode_map[0x704C] = 0x9746; unicode_map[0x704D] = 0x9748; unicode_map[0x704E] = 0x9742; unicode_map[0x704F] = 0x9749; unicode_map[0x7050] = 0x975C; unicode_map[0x7051] = 0x9760; unicode_map[0x7052] = 0x9764; unicode_map[0x7053] = 0x9766; unicode_map[0x7054] = 0x9768; unicode_map[0x7055] = 0x52D2; unicode_map[0x7056] = 0x976B; unicode_map[0x7057] = 0x9771; unicode_map[0x7058] = 0x9779; unicode_map[0x7059] = 0x9785; unicode_map[0x705A] = 0x977C; unicode_map[0x705B] = 0x9781; unicode_map[0x705C] = 0x977A; unicode_map[0x705D] = 0x9786; unicode_map[0x705E] = 0x978B; unicode_map[0x705F] = 0x978F; unicode_map[0x7060] = 0x9790; unicode_map[0x7061] = 0x979C; unicode_map[0x7062] = 0x97A8; unicode_map[0x7063] = 0x97A6; unicode_map[0x7064] = 0x97A3; unicode_map[0x7065] = 0x97B3; unicode_map[0x7066] = 0x97B4; unicode_map[0x7067] = 0x97C3; unicode_map[0x7068] = 0x97C6; unicode_map[0x7069] = 0x97C8; unicode_map[0x706A] = 0x97CB; unicode_map[0x706B] = 0x97DC; unicode_map[0x706C] = 0x97ED; unicode_map[0x706D] = 0x9F4F; unicode_map[0x706E] = 0x97F2; unicode_map[0x706F] = 0x7ADF; unicode_map[0x7070] = 0x97F6; unicode_map[0x7071] = 0x97F5; unicode_map[0x7072] = 0x980F; unicode_map[0x7073] = 0x980C; unicode_map[0x7074] = 0x9838; unicode_map[0x7075] = 0x9824; unicode_map[0x7076] = 0x9821; unicode_map[0x7077] = 0x9837; unicode_map[0x7078] = 0x983D; unicode_map[0x7079] = 0x9846; unicode_map[0x707A] = 0x984F; unicode_map[0x707B] = 0x984B; unicode_map[0x707C] = 0x986B; unicode_map[0x707D] = 0x986F; unicode_map[0x707E] = 0x9870; unicode_map[0x7121] = 0x9871; unicode_map[0x7122] = 0x9874; unicode_map[0x7123] = 0x9873; unicode_map[0x7124] = 0x98AA; unicode_map[0x7125] = 0x98AF; unicode_map[0x7126] = 0x98B1; unicode_map[0x7127] = 0x98B6; unicode_map[0x7128] = 0x98C4; unicode_map[0x7129] = 0x98C3; unicode_map[0x712A] = 0x98C6; unicode_map[0x712B] = 0x98E9; unicode_map[0x712C] = 0x98EB; unicode_map[0x712D] = 0x9903; unicode_map[0x712E] = 0x9909; unicode_map[0x712F] = 0x9912; unicode_map[0x7130] = 0x9914; unicode_map[0x7131] = 0x9918; unicode_map[0x7132] = 0x9921; unicode_map[0x7133] = 0x991D; unicode_map[0x7134] = 0x991E; unicode_map[0x7135] = 0x9924; unicode_map[0x7136] = 0x9920; unicode_map[0x7137] = 0x992C; unicode_map[0x7138] = 0x992E; unicode_map[0x7139] = 0x993D; unicode_map[0x713A] = 0x993E; unicode_map[0x713B] = 0x9942; unicode_map[0x713C] = 0x9949; unicode_map[0x713D] = 0x9945; unicode_map[0x713E] = 0x9950; unicode_map[0x713F] = 0x994B; unicode_map[0x7140] = 0x9951; unicode_map[0x7141] = 0x9952; unicode_map[0x7142] = 0x994C; unicode_map[0x7143] = 0x9955; unicode_map[0x7144] = 0x9997; unicode_map[0x7145] = 0x9998; unicode_map[0x7146] = 0x99A5; unicode_map[0x7147] = 0x99AD; unicode_map[0x7148] = 0x99AE; unicode_map[0x7149] = 0x99BC; unicode_map[0x714A] = 0x99DF; unicode_map[0x714B] = 0x99DB; unicode_map[0x714C] = 0x99DD; unicode_map[0x714D] = 0x99D8; unicode_map[0x714E] = 0x99D1; unicode_map[0x714F] = 0x99ED; unicode_map[0x7150] = 0x99EE; unicode_map[0x7151] = 0x99F1; unicode_map[0x7152] = 0x99F2; unicode_map[0x7153] = 0x99FB; unicode_map[0x7154] = 0x99F8; unicode_map[0x7155] = 0x9A01; unicode_map[0x7156] = 0x9A0F; unicode_map[0x7157] = 0x9A05; unicode_map[0x7158] = 0x99E2; unicode_map[0x7159] = 0x9A19; unicode_map[0x715A] = 0x9A2B; unicode_map[0x715B] = 0x9A37; unicode_map[0x715C] = 0x9A45; unicode_map[0x715D] = 0x9A42; unicode_map[0x715E] = 0x9A40; unicode_map[0x715F] = 0x9A43; unicode_map[0x7160] = 0x9A3E; unicode_map[0x7161] = 0x9A55; unicode_map[0x7162] = 0x9A4D; unicode_map[0x7163] = 0x9A5B; unicode_map[0x7164] = 0x9A57; unicode_map[0x7165] = 0x9A5F; unicode_map[0x7166] = 0x9A62; unicode_map[0x7167] = 0x9A65; unicode_map[0x7168] = 0x9A64; unicode_map[0x7169] = 0x9A69; unicode_map[0x716A] = 0x9A6B; unicode_map[0x716B] = 0x9A6A; unicode_map[0x716C] = 0x9AAD; unicode_map[0x716D] = 0x9AB0; unicode_map[0x716E] = 0x9ABC; unicode_map[0x716F] = 0x9AC0; unicode_map[0x7170] = 0x9ACF; unicode_map[0x7171] = 0x9AD1; unicode_map[0x7172] = 0x9AD3; unicode_map[0x7173] = 0x9AD4; unicode_map[0x7174] = 0x9ADE; unicode_map[0x7175] = 0x9ADF; unicode_map[0x7176] = 0x9AE2; unicode_map[0x7177] = 0x9AE3; unicode_map[0x7178] = 0x9AE6; unicode_map[0x7179] = 0x9AEF; unicode_map[0x717A] = 0x9AEB; unicode_map[0x717B] = 0x9AEE; unicode_map[0x717C] = 0x9AF4; unicode_map[0x717D] = 0x9AF1; unicode_map[0x717E] = 0x9AF7; unicode_map[0x7221] = 0x9AFB; unicode_map[0x7222] = 0x9B06; unicode_map[0x7223] = 0x9B18; unicode_map[0x7224] = 0x9B1A; unicode_map[0x7225] = 0x9B1F; unicode_map[0x7226] = 0x9B22; unicode_map[0x7227] = 0x9B23; unicode_map[0x7228] = 0x9B25; unicode_map[0x7229] = 0x9B27; unicode_map[0x722A] = 0x9B28; unicode_map[0x722B] = 0x9B29; unicode_map[0x722C] = 0x9B2A; unicode_map[0x722D] = 0x9B2E; unicode_map[0x722E] = 0x9B2F; unicode_map[0x722F] = 0x9B32; unicode_map[0x7230] = 0x9B44; unicode_map[0x7231] = 0x9B43; unicode_map[0x7232] = 0x9B4F; unicode_map[0x7233] = 0x9B4D; unicode_map[0x7234] = 0x9B4E; unicode_map[0x7235] = 0x9B51; unicode_map[0x7236] = 0x9B58; unicode_map[0x7237] = 0x9B74; unicode_map[0x7238] = 0x9B93; unicode_map[0x7239] = 0x9B83; unicode_map[0x723A] = 0x9B91; unicode_map[0x723B] = 0x9B96; unicode_map[0x723C] = 0x9B97; unicode_map[0x723D] = 0x9B9F; unicode_map[0x723E] = 0x9BA0; unicode_map[0x723F] = 0x9BA8; unicode_map[0x7240] = 0x9BB4; unicode_map[0x7241] = 0x9BC0; unicode_map[0x7242] = 0x9BCA; unicode_map[0x7243] = 0x9BB9; unicode_map[0x7244] = 0x9BC6; unicode_map[0x7245] = 0x9BCF; unicode_map[0x7246] = 0x9BD1; unicode_map[0x7247] = 0x9BD2; unicode_map[0x7248] = 0x9BE3; unicode_map[0x7249] = 0x9BE2; unicode_map[0x724A] = 0x9BE4; unicode_map[0x724B] = 0x9BD4; unicode_map[0x724C] = 0x9BE1; unicode_map[0x724D] = 0x9C3A; unicode_map[0x724E] = 0x9BF2; unicode_map[0x724F] = 0x9BF1; unicode_map[0x7250] = 0x9BF0; unicode_map[0x7251] = 0x9C15; unicode_map[0x7252] = 0x9C14; unicode_map[0x7253] = 0x9C09; unicode_map[0x7254] = 0x9C13; unicode_map[0x7255] = 0x9C0C; unicode_map[0x7256] = 0x9C06; unicode_map[0x7257] = 0x9C08; unicode_map[0x7258] = 0x9C12; unicode_map[0x7259] = 0x9C0A; unicode_map[0x725A] = 0x9C04; unicode_map[0x725B] = 0x9C2E; unicode_map[0x725C] = 0x9C1B; unicode_map[0x725D] = 0x9C25; unicode_map[0x725E] = 0x9C24; unicode_map[0x725F] = 0x9C21; unicode_map[0x7260] = 0x9C30; unicode_map[0x7261] = 0x9C47; unicode_map[0x7262] = 0x9C32; unicode_map[0x7263] = 0x9C46; unicode_map[0x7264] = 0x9C3E; unicode_map[0x7265] = 0x9C5A; unicode_map[0x7266] = 0x9C60; unicode_map[0x7267] = 0x9C67; unicode_map[0x7268] = 0x9C76; unicode_map[0x7269] = 0x9C78; unicode_map[0x726A] = 0x9CE7; unicode_map[0x726B] = 0x9CEC; unicode_map[0x726C] = 0x9CF0; unicode_map[0x726D] = 0x9D09; unicode_map[0x726E] = 0x9D08; unicode_map[0x726F] = 0x9CEB; unicode_map[0x7270] = 0x9D03; unicode_map[0x7271] = 0x9D06; unicode_map[0x7272] = 0x9D2A; unicode_map[0x7273] = 0x9D26; unicode_map[0x7274] = 0x9DAF; unicode_map[0x7275] = 0x9D23; unicode_map[0x7276] = 0x9D1F; unicode_map[0x7277] = 0x9D44; unicode_map[0x7278] = 0x9D15; unicode_map[0x7279] = 0x9D12; unicode_map[0x727A] = 0x9D41; unicode_map[0x727B] = 0x9D3F; unicode_map[0x727C] = 0x9D3E; unicode_map[0x727D] = 0x9D46; unicode_map[0x727E] = 0x9D48; unicode_map[0x7321] = 0x9D5D; unicode_map[0x7322] = 0x9D5E; unicode_map[0x7323] = 0x9D64; unicode_map[0x7324] = 0x9D51; unicode_map[0x7325] = 0x9D50; unicode_map[0x7326] = 0x9D59; unicode_map[0x7327] = 0x9D72; unicode_map[0x7328] = 0x9D89; unicode_map[0x7329] = 0x9D87; unicode_map[0x732A] = 0x9DAB; unicode_map[0x732B] = 0x9D6F; unicode_map[0x732C] = 0x9D7A; unicode_map[0x732D] = 0x9D9A; unicode_map[0x732E] = 0x9DA4; unicode_map[0x732F] = 0x9DA9; unicode_map[0x7330] = 0x9DB2; unicode_map[0x7331] = 0x9DC4; unicode_map[0x7332] = 0x9DC1; unicode_map[0x7333] = 0x9DBB; unicode_map[0x7334] = 0x9DB8; unicode_map[0x7335] = 0x9DBA; unicode_map[0x7336] = 0x9DC6; unicode_map[0x7337] = 0x9DCF; unicode_map[0x7338] = 0x9DC2; unicode_map[0x7339] = 0x9DD9; unicode_map[0x733A] = 0x9DD3; unicode_map[0x733B] = 0x9DF8; unicode_map[0x733C] = 0x9DE6; unicode_map[0x733D] = 0x9DED; unicode_map[0x733E] = 0x9DEF; unicode_map[0x733F] = 0x9DFD; unicode_map[0x7340] = 0x9E1A; unicode_map[0x7341] = 0x9E1B; unicode_map[0x7342] = 0x9E1E; unicode_map[0x7343] = 0x9E75; unicode_map[0x7344] = 0x9E79; unicode_map[0x7345] = 0x9E7D; unicode_map[0x7346] = 0x9E81; unicode_map[0x7347] = 0x9E88; unicode_map[0x7348] = 0x9E8B; unicode_map[0x7349] = 0x9E8C; unicode_map[0x734A] = 0x9E92; unicode_map[0x734B] = 0x9E95; unicode_map[0x734C] = 0x9E91; unicode_map[0x734D] = 0x9E9D; unicode_map[0x734E] = 0x9EA5; unicode_map[0x734F] = 0x9EA9; unicode_map[0x7350] = 0x9EB8; unicode_map[0x7351] = 0x9EAA; unicode_map[0x7352] = 0x9EAD; unicode_map[0x7353] = 0x9761; unicode_map[0x7354] = 0x9ECC; unicode_map[0x7355] = 0x9ECE; unicode_map[0x7356] = 0x9ECF; unicode_map[0x7357] = 0x9ED0; unicode_map[0x7358] = 0x9ED4; unicode_map[0x7359] = 0x9EDC; unicode_map[0x735A] = 0x9EDE; unicode_map[0x735B] = 0x9EDD; unicode_map[0x735C] = 0x9EE0; unicode_map[0x735D] = 0x9EE5; unicode_map[0x735E] = 0x9EE8; unicode_map[0x735F] = 0x9EEF; unicode_map[0x7360] = 0x9EF4; unicode_map[0x7361] = 0x9EF6; unicode_map[0x7362] = 0x9EF7; unicode_map[0x7363] = 0x9EF9; unicode_map[0x7364] = 0x9EFB; unicode_map[0x7365] = 0x9EFC; unicode_map[0x7366] = 0x9EFD; unicode_map[0x7367] = 0x9F07; unicode_map[0x7368] = 0x9F08; unicode_map[0x7369] = 0x76B7; unicode_map[0x736A] = 0x9F15; unicode_map[0x736B] = 0x9F21; unicode_map[0x736C] = 0x9F2C; unicode_map[0x736D] = 0x9F3E; unicode_map[0x736E] = 0x9F4A; unicode_map[0x736F] = 0x9F52; unicode_map[0x7370] = 0x9F54; unicode_map[0x7371] = 0x9F63; unicode_map[0x7372] = 0x9F5F; unicode_map[0x7373] = 0x9F60; unicode_map[0x7374] = 0x9F61; unicode_map[0x7375] = 0x9F66; unicode_map[0x7376] = 0x9F67; unicode_map[0x7377] = 0x9F6C; unicode_map[0x7378] = 0x9F6A; unicode_map[0x7379] = 0x9F77; unicode_map[0x737A] = 0x9F72; unicode_map[0x737B] = 0x9F76; unicode_map[0x737C] = 0x9F95; unicode_map[0x737D] = 0x9F9C; unicode_map[0x737E] = 0x9FA0; unicode_map[0x7421] = 0x582F; unicode_map[0x7422] = 0x69C7; unicode_map[0x7423] = 0x9059; unicode_map[0x7424] = 0x7464; unicode_map[0x7425] = 0x51DC; unicode_map[0x7426] = 0x7199; } #endif /* FREETYPE_CHARSET16 */ void latin_unicode_map_init(){ latin_unicode_map[0][0xA1] = 0x0104; latin_unicode_map[0][0xA2] = 0x02D8; latin_unicode_map[0][0xA3] = 0x0141; latin_unicode_map[0][0xA5] = 0x013D; latin_unicode_map[0][0xA6] = 0x015A; latin_unicode_map[0][0xA9] = 0x0160; latin_unicode_map[0][0xAA] = 0x015E; latin_unicode_map[0][0xAB] = 0x0164; latin_unicode_map[0][0xAC] = 0x0179; latin_unicode_map[0][0xAE] = 0x017D; latin_unicode_map[0][0xAF] = 0x017B; latin_unicode_map[0][0xB1] = 0x0105; latin_unicode_map[0][0xB2] = 0x02DB; latin_unicode_map[0][0xB3] = 0x0142; latin_unicode_map[0][0xB5] = 0x013E; latin_unicode_map[0][0xB6] = 0x015B; latin_unicode_map[0][0xB7] = 0x02C7; latin_unicode_map[0][0xB9] = 0x0161; latin_unicode_map[0][0xBA] = 0x015F; latin_unicode_map[0][0xBB] = 0x0165; latin_unicode_map[0][0xBC] = 0x017A; latin_unicode_map[0][0xBD] = 0x02DD; latin_unicode_map[0][0xBE] = 0x017E; latin_unicode_map[0][0xBF] = 0x017C; latin_unicode_map[0][0xC0] = 0x0154; latin_unicode_map[0][0xC3] = 0x0102; latin_unicode_map[0][0xC5] = 0x0139; latin_unicode_map[0][0xC6] = 0x0106; latin_unicode_map[0][0xC8] = 0x010C; latin_unicode_map[0][0xCA] = 0x0118; latin_unicode_map[0][0xCC] = 0x011A; latin_unicode_map[0][0xCF] = 0x010E; latin_unicode_map[0][0xD0] = 0x0110; latin_unicode_map[0][0xD1] = 0x0143; latin_unicode_map[0][0xD2] = 0x0147; latin_unicode_map[0][0xD5] = 0x0150; latin_unicode_map[0][0xD8] = 0x0158; latin_unicode_map[0][0xD9] = 0x016E; latin_unicode_map[0][0xDB] = 0x0170; latin_unicode_map[0][0xDE] = 0x0162; latin_unicode_map[0][0xDF] = 0x00DF; latin_unicode_map[0][0xE0] = 0x0155; latin_unicode_map[0][0xE3] = 0x0103; latin_unicode_map[0][0xE5] = 0x013A; latin_unicode_map[0][0xE6] = 0x0107; latin_unicode_map[0][0xE8] = 0x010D; latin_unicode_map[0][0xEA] = 0x0119; latin_unicode_map[0][0xEC] = 0x011B; latin_unicode_map[0][0xEF] = 0x010F; latin_unicode_map[0][0xF0] = 0x0111; latin_unicode_map[0][0xF1] = 0x0144; latin_unicode_map[0][0xF2] = 0x0148; latin_unicode_map[0][0xF5] = 0x0151; latin_unicode_map[0][0xF8] = 0x0159; latin_unicode_map[0][0xF9] = 0x016F; latin_unicode_map[0][0xFB] = 0x0171; latin_unicode_map[0][0xFE] = 0x0163; latin_unicode_map[0][0xFF] = 0x02D9; latin_unicode_map[1][0xA1] = 0x0126; latin_unicode_map[1][0xA2] = 0x02D8; latin_unicode_map[1][0xA6] = 0x0124; latin_unicode_map[1][0xA9] = 0x0130; latin_unicode_map[1][0xAA] = 0x015E; latin_unicode_map[1][0xAB] = 0x011E; latin_unicode_map[1][0xAC] = 0x0134; latin_unicode_map[1][0xAF] = 0x017B; latin_unicode_map[1][0xB1] = 0x0127; latin_unicode_map[1][0xB6] = 0x0125; latin_unicode_map[1][0xB9] = 0x0131; latin_unicode_map[1][0xBA] = 0x015F; latin_unicode_map[1][0xBB] = 0x011F; latin_unicode_map[1][0xBC] = 0x0135; latin_unicode_map[1][0xBF] = 0x017C; latin_unicode_map[1][0xC5] = 0x010A; latin_unicode_map[1][0xC6] = 0x0108; latin_unicode_map[1][0xD5] = 0x0120; latin_unicode_map[1][0xD8] = 0x011C; latin_unicode_map[1][0xDD] = 0x016C; latin_unicode_map[1][0xDE] = 0x015C; latin_unicode_map[1][0xDF] = 0x00DF; latin_unicode_map[1][0xE5] = 0x010B; latin_unicode_map[1][0xE6] = 0x0109; latin_unicode_map[1][0xF5] = 0x0121; latin_unicode_map[1][0xF8] = 0x011D; latin_unicode_map[1][0xFD] = 0x016D; latin_unicode_map[1][0xFE] = 0x015D; latin_unicode_map[1][0xFF] = 0x02D9; latin_unicode_map[2][0xA1] = 0x0104; latin_unicode_map[2][0xA2] = 0x0138; latin_unicode_map[2][0xA3] = 0x0156; latin_unicode_map[2][0xA5] = 0x0128; latin_unicode_map[2][0xA6] = 0x013B; latin_unicode_map[2][0xA9] = 0x0160; latin_unicode_map[2][0xAA] = 0x0112; latin_unicode_map[2][0xAB] = 0x0122; latin_unicode_map[2][0xAC] = 0x0166; latin_unicode_map[2][0xAE] = 0x017D; latin_unicode_map[2][0xB1] = 0x0105; latin_unicode_map[2][0xB2] = 0x02DB; latin_unicode_map[2][0xB3] = 0x0157; latin_unicode_map[2][0xB5] = 0x0129; latin_unicode_map[2][0xB6] = 0x013C; latin_unicode_map[2][0xB7] = 0x02C7; latin_unicode_map[2][0xB9] = 0x0161; latin_unicode_map[2][0xBA] = 0x0113; latin_unicode_map[2][0xBB] = 0x0123; latin_unicode_map[2][0xBC] = 0x0167; latin_unicode_map[2][0xBD] = 0x014A; latin_unicode_map[2][0xBE] = 0x017E; latin_unicode_map[2][0xBF] = 0x014B; latin_unicode_map[2][0xC0] = 0x0100; latin_unicode_map[2][0xC7] = 0x012E; latin_unicode_map[2][0xC8] = 0x010C; latin_unicode_map[2][0xCA] = 0x0118; latin_unicode_map[2][0xCC] = 0x0116; latin_unicode_map[2][0xCF] = 0x012A; latin_unicode_map[2][0xD0] = 0x0110; latin_unicode_map[2][0xD1] = 0x0145; latin_unicode_map[2][0xD2] = 0x014C; latin_unicode_map[2][0xD3] = 0x0136; latin_unicode_map[2][0xD9] = 0x0172; latin_unicode_map[2][0xDD] = 0x0168; latin_unicode_map[2][0xDE] = 0x016A; latin_unicode_map[2][0xDF] = 0x00DF; latin_unicode_map[2][0xE0] = 0x0101; latin_unicode_map[2][0xE7] = 0x012F; latin_unicode_map[2][0xE8] = 0x010D; latin_unicode_map[2][0xEA] = 0x0119; latin_unicode_map[2][0xEC] = 0x0117; latin_unicode_map[2][0xEF] = 0x012B; latin_unicode_map[2][0xF0] = 0x0111; latin_unicode_map[2][0xF1] = 0x0146; latin_unicode_map[2][0xF2] = 0x014D; latin_unicode_map[2][0xF3] = 0x0137; latin_unicode_map[2][0xF9] = 0x0173; latin_unicode_map[2][0xFD] = 0x0169; latin_unicode_map[2][0xFE] = 0x016B; latin_unicode_map[2][0xFF] = 0x02D9; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/x11.c�������������������������������������������������������������������������������������������0100644�0023745�0000000�00000027074�10746131025�0011734�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: x11.c,v 1.35 2008/01/24 15:43:17 nishida Exp $ */ #include "mgp.h" /* covered by gcconf */ GC gcfore; GC gcpen; GC gcred; GC gcgreen; GC gcyellow; /* not covered by gcconf */ GC gc_pl; GC gc_plrev; GC gc_pta; GC gc_ptk; /* for caching */ GC gc_cache; long xeventmask = EVENT_DEFAULT | EVENT_RAKUGAKI; static u_long zero = 0; static struct gcconf { GC *gc; int func; u_long *fore; u_long *back; char *color; } gcconf[] = { { &gcfore, GXcopy, &fore_color[0], &zero }, { &gcpen, GXcopy, NULL, NULL, "red" }, { &gcred, GXcopy, NULL, NULL, "red" }, { &gcgreen, GXcopy, NULL, NULL, "green" }, { &gcyellow, GXcopy, NULL, NULL, "yellow" }, { NULL }, }; static XWindowAttributes xa; int window_x; int window_y; Visual * get_visual(display, screen, depthp) Display *display; int screen; u_int *depthp; { XVisualInfo *best, *vinfo, vinfo_template; Visual *ret; int vinfo_mask, i, ninfo; vinfo_template.screen = screen; vinfo_mask = VisualScreenMask; vinfo = XGetVisualInfo(display, vinfo_mask, &vinfo_template, &ninfo); best = NULL; for (i = 0; i < ninfo; i++) { switch (vinfo[i].class) { case TrueColor: if (vinfo[i].depth < 15 || 24 < vinfo[i].depth) break; if (best == NULL || best->class != TrueColor || best->depth < vinfo[i].depth) best = &vinfo[i]; break; case PseudoColor: if (best == NULL) best = &vinfo[i]; break; } } if (best) { ret = best->visual; *depthp = best->depth; } else { ret = DefaultVisual(display, screen); *depthp = DefaultDepth(display, screen); } XFree(vinfo); return ret; } void init_win1(geometry) char *geometry; { int xloc, yloc; int xsiz, ysiz; int mode; u_int i; if ((display = XOpenDisplay(NULL)) == NULL) { fprintf(stderr, "Can't open display\n"); exit(-1); } screen = DefaultScreen(display); visual = get_visual(display, screen, &depth); depth_mask = 1; for (i = depth; i; i--) depth_mask *= 2; depth_mask--; /* depth_mask is the max value of pixel */ XGetWindowAttributes(display, DefaultRootWindow(display), &xa); /* determine geometry to use. */ window_width = window_height = -1; window_x = window_y = -1; if (geometry) { mode = XParseGeometry(geometry, &xloc, &yloc, &xsiz, &ysiz); if (mode == 0) { fprintf(stderr, "bad geometry string %s\n", geometry); exit(-1); } if (!(mode & WidthValue)) xsiz = -1; if (!(mode & HeightValue)) ysiz = -1; if (!(mode & XValue)) xloc = -1; if (!(mode & YValue)) yloc = -1; } else { xsiz = ysiz = -1; xloc = yloc = -1; mode = 0; } if (xsiz < 0) { window_width = ((mgp_flag & FL_OVER) && !(mgp_flag & FL_NODECORATION)) ? (int)(xa.width * 96 / 100) : xa.width; } else window_width = xsiz; if (ysiz < 0) { window_height = ((mgp_flag & FL_OVER) && !(mgp_flag & FL_NODECORATION)) ? (int)(xa.height * 96 / 100) : xa.height; } else window_height = ysiz; if (0 <= xloc) { window_x = (mode & XNegative) ? xa.width - window_width - xloc : xloc; } if (0 <= yloc) { window_y = (mode & YNegative) ? xa.height - window_height - yloc : yloc; } #if 0 if (window_x < 0) window_x = 0; /*XXX*/ if (window_y < 0) window_y = 0; /*XXX*/ #endif if (visual != DefaultVisual(display, screen)) colormap = XCreateColormap(display, RootWindow(display, screen), visual, AllocNone); else { colormap = DefaultColormap(display, screen); if (mgp_flag & FL_PRIVATE) colormap = XCopyColormapAndFree(display, colormap); } char_size[0] = window_height * DEFAULT_CHARSIZE / 100; nonscaled_size[0] = char_size[0]; sup_off = DEFAULT_SUPOFF; sub_off = DEFAULT_SUBOFF; sup_scale = DEFAULT_SUPSCALE; (void)get_color(DEFAULT_FORE, &fore_color[0]); ctrl_color[0] = fore_color[0]; (void)get_color(back_clname, &back_color[0]); } void init_win2() { XSetWindowAttributes xsa; XSizeHints hints; u_long mask; struct gcconf *pc; u_long color; XClassHint res = { "MagicPoint", "MagicPoint" }; int i; xsa.border_pixel = fore_color[0]; xsa.background_pixel = back_color[0]; xsa.backing_store = Always; xsa.colormap = colormap; mask = CWBorderPixel | CWBackPixel | CWBackingStore | CWColormap; #if 1 // this method is old. we should use WM_STATE_FULLSCREEN. if (!(mgp_flag & FL_OVER)) { xsa.override_redirect = True; mask |= CWOverrideRedirect; } #endif window = XCreateWindow(display, RootWindow(display, screen), (window_x < 0) ? 0 : window_x, (window_y < 0) ? 0 : window_y, (window_width < 0) ? 0 : window_width, (window_height < 0) ? 0 : window_height, 0, depth, InputOutput, visual, mask, &xsa); XStoreName(display, window, mgp_wname); XSetIconName(display, window, mgp_wname); XSetClassHint(display, window, &res); pixmap = XCreatePixmap(display, window, xa.width, xa.height, depth); maskpix = XCreatePixmap(display, window, xa.width, xa.height, depth); cachewin = XCreatePixmap(display, window, xa.width, xa.height, depth); cachetmp = XCreatePixmap(display, window, xa.width, xa.height, depth); gc_cache = XCreateGC(display, window, 0, 0); XSetGraphicsExposures(display, gc_cache, False); for (pc = &gcconf[0]; pc->gc; pc++) { *pc->gc = XCreateGC(display, window, 0, 0); XSetFunction(display, *pc->gc, pc->func); if (pc->fore) XSetForeground(display, *pc->gc, *pc->fore); if (pc->back) XSetBackground(display, *pc->gc, *pc->back); if (pc->color) { (void)get_color(pc->color, &color); XSetForeground(display, *pc->gc, color); } } if (mgp_flag & FL_OVER){ if (0 <= window_x && 0 <= window_y) { hints.x = window_x; hints.y = window_y; hints.flags = USPosition; XSetNormalHints(display, window, &hints); } } if (mgp_flag & FL_NODECORATION) XSetTransientForHint(display, window, window); XMapRaised(display, window); #if 0 #if 0 if (!(mgp_flag & FL_OVER)) #else if (0 <= window_x && 0 <= window_y) #endif XMoveWindow(display, window, window_x, window_y); XFlush(display); #endif gc_pl = XCreateGC(display, window, 0, 0); gc_plrev = XCreateGC(display, window, 0, 0); gc_pta = XCreateGC(display, window, 0, 0); gc_ptk = XCreateGC(display, window, 0, 0); plfs = XLoadQueryFont(display, PAGELIST_FONT); plkfs = XLoadQueryFont(display, PAGELIST_KFONT); if (plfs) { XSetFont(display, gc_pl, plfs->fid); XSetFont(display, gc_plrev, plfs->fid); XSetFont(display, gc_pta, plfs->fid); } else fprintf(stderr, "cannot find %s font. please modify PAGELIST_FONT to display page guide.\n", PAGELIST_FONT); if (plkfs) XSetFont(display, gc_ptk, plkfs->fid); else fprintf(stderr, "cannot find %s font.\n", PAGELIST_KFONT); XSetFunction(display, gc_pl, GXcopy); XSetFunction(display, gc_plrev, GXcopy); XSetFunction(display, gc_pta, GXcopy); XSetFunction(display, gc_ptk, GXcopy); XSetForeground(display, gc_pl, BlackPixel(display, screen)); XSetBackground(display, gc_pl, WhitePixel(display, screen)); XSetForeground(display, gc_plrev, WhitePixel(display, screen)); XSetBackground(display, gc_plrev, BlackPixel(display, screen)); if (plfs) { pl_fh = (plfs->max_bounds.ascent + plfs->max_bounds.descent) * 1.2; pl_fw = plfs->max_bounds.rbearing + plfs->max_bounds.lbearing; if (!plkfs) plkfs = plfs; } } void init_win3() { Window dummy; int revert; XSelectInput(display, window, xeventmask); if (!(mgp_flag & FL_OVER)) { XGetInputFocus(display, &dummy, &revert); XSetInputFocus(display, window, RevertToParent, CurrentTime); if (XGrabKeyboard(display, window, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess) { fprintf(stderr, "XGrabKeyboard failed. sorry \n"); exit(-1); } if (XGrabPointer(display, window, True, ButtonPressMask, GrabModeAsync, GrabModeAsync, window, None, CurrentTime) != GrabSuccess) { fprintf(stderr, "XGrabPointer failed. sorry \n"); exit(-1); } } // do fullscreen if (!(mgp_flag & FL_OVER)) { toggle_fullscreen(); } } void toggle_fullscreen() { static fullscreen = 0; XClientMessageEvent xev; fullscreen = ++fullscreen % 2; memset(&xev, 0, sizeof(xev)); xev.type=ClientMessage; xev.message_type=XInternAtom(display, "_NET_WM_STATE", False); xev.display=display; xev.window=window; xev.format=32; xev.data.l[0]=fullscreen; xev.data.l[1]= XInternAtom(display, "_NET_WM_STATE_FULLSCREEN", False); xev.data.l[2]=0; XSendEvent(display, DefaultRootWindow(display), False, SubstructureRedirectMask, (XEvent*)&xev); } void finish_win() { XUngrabKeyboard(display, CurrentTime); XUngrabPointer(display, CurrentTime); XCloseDisplay(display); } int get_color(colorname, value) char *colorname; u_long *value; { XColor c0, c1; screen = DefaultScreen(display); /*XXX*/ if (strcasecmp(colorname, "darkblue") == 0) colorname = "#00008b"; if (XAllocNamedColor(display, colormap, colorname, &c1, &c0) == 0) return -1; if (value) *value = c1.pixel; return 0; } struct g_color * name2gcolor(colorname) char *colorname; { XColor c0, c1; struct g_color *color; color = (struct g_color *)malloc(sizeof(struct g_color)); if (XLookupColor(display, colormap, colorname, &c1, &c0)) { color->r = (c1.red >> 8) & 0xff; color->g = (c1.green >> 8) & 0xff; color->b = (c1.blue >> 8) & 0xff; } else { fprintf(stderr,"color '%s' unknown. ignored.\n", colorname); } return color; } void free_alloc_colors(clr) struct alloc_color *clr; { #ifndef COLOR_BUGFIX if (!(mgp_flag & FL_PRIVATE)) return; #endif if (clr->num){ XFreeColors(display, colormap, clr->colors, clr->num, 0); free(clr->colors); clr->colors = NULL; clr->num = 0; } } void regist_alloc_colors(clr, colors, num) struct alloc_color *clr; u_long *colors; int num; { u_int i; #ifndef COLOR_BUGFIX if (!(mgp_flag & FL_PRIVATE)) return; #endif if (!clr->num) clr->colors = (long *)malloc(sizeof(u_long) * num); else clr->colors = (long *)realloc(clr->colors, sizeof(u_long) * (clr->num + num)); for (i = 0; i < num; i++) clr->colors[clr->num +i] = (u_long)*(colors +i); clr->num += num; } void reset_cache_pixmap() { int i; XFreePixmap(display, cachewin); XFreePixmap(display, cachetmp); cachewin = XCreatePixmap(display, window, xa.width, xa.height, depth); cachetmp = XCreatePixmap(display, window, xa.width, xa.height, depth); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/x11dummy.c��������������������������������������������������������������������������������������0100644�0023745�0000000�00000010337�07060073374�0013011�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: x11dummy.c,v 1.13 2000/03/04 02:37:48 nishida Exp $ */ #include "mgp.h" int window_x; int window_y; void init_win1(geometry) char *geometry; { if ((display = XOpenDisplay(NULL)) == NULL) { fprintf(stderr, "Can't open display\n"); exit(-1); } } void init_win2() { XWindowAttributes xa; XSetWindowAttributes xsa; u_long mask = 0; screen = DefaultScreen(display); depth = DefaultDepth(display, screen); visual = DefaultVisual(display, screen); XGetWindowAttributes(display, DefaultRootWindow(display), &xa); if (window_width == 0 || window_height == 0) { window_width = xa.width; window_height = xa.height; } window = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0, 800, 600, 0, fore_color[0], back_color[0]); pixmap = XCreatePixmap(display, window, window_width, window_height, depth); xsa.override_redirect = True; mask |= CWOverrideRedirect; xsa.backing_store = Always; mask |= CWBackingStore; XChangeWindowAttributes(display, window, mask, &xsa); XFlush(display); } void finish_win() { XCloseDisplay(display); } #if 0 int get_color(colorname, value) char *colorname; u_long *value; { if (*value) *value = 0; return 0; /*ok*/ } #endif int get_color(colorname, value) char *colorname; u_long *value; { XColor c0, c1; screen = DefaultScreen(display); colormap = DefaultColormap(display, screen); /*XXX*/ if (strcasecmp(colorname, "darkblue") == 0) colorname = "#00008b"; if (XAllocNamedColor(display, colormap, colorname, &c1, &c0) == 0) return -1; if (value) *value = c1.pixel; return 0; } struct g_color * name2gcolor(colorname) char *colorname; { Colormap cmap; XColor c0, c1; struct g_color *color; color = (struct g_color *)malloc(sizeof(struct g_color)); cmap = DefaultColormap(display, 0); if (XLookupColor(display, cmap, colorname, &c1, &c0)) { color->r = (c1.red >> 8) & 0xff; color->g = (c1.green >> 8) & 0xff; color->b = (c1.blue >> 8) & 0xff; } else fprintf(stderr, "color '%s' unknown. ignored.\n", colorname); return color; } void free_alloc_colors(clr) struct alloc_color *clr; { #ifdef COLOR_BUGFIX if (!(mgp_flag & FL_PRIVATE)) return; #endif if (clr->num){ XFreeColors(display, colormap, clr->colors, clr->num, 0); free(clr->colors); clr->colors = NULL; clr->num = 0; } } void regist_alloc_colors(clr, colors, num) struct alloc_color *clr; u_long *colors; int num; { u_int i; #ifdef COLOR_BUGFIX if (!(mgp_flag & FL_PRIVATE)) return; #endif if (!clr->num) clr->colors = (long *)malloc(sizeof(u_long) * num); else clr->colors = (long *)realloc(clr->colors, sizeof(u_long) * (clr->num + num)); for (i = 0; i < num; i++) clr->colors[clr->num +i] = (u_long)*(colors +i); clr->num += num; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/contrib�����������������������������������������������������������������������������������������0040755�0023745�0000000�00000000000�11147124753�0012537�5����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/contrib/.cvsignore������������������������������������������������������������������������������0100644�0023745�0000000�00000000127�10624270231�0014603�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tp2latex.pl tp2html.pl mgp2latex.pl mgp2html.pl Makefile mgpnet mgpnet.0 mgpnet.1.html �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/contrib/Imakefile�������������������������������������������������������������������������������0100644�0023745�0000000�00000001033�06470775305�0014431�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define IHaveSubdirs #define PassCDebugFlags SUBDIRS= xwintoppm MakeSubdirs($(SUBDIRS)) #if defined(ImakeConfigRelease) && ImakeConfigRelease >= 6 InstallNamedTarget(install,mgpnet,$(INSTBINFLAGS),$(BINDIR),mgpnet) /*R6 only*/ #else InstallNamedProg(mgpnet,mgpnet,$(BINDIR)) /*obsoleted in R6?*/ #endif InstallManPage(mgpnet,$(MANDIR)) all:: depend:: install:: distclean:: clean for i in $(SUBDIRS); do \ (cd $$i; if [ -f Makefile ]; then make distclean; fi) ;\ done -/bin/rm -f mgpnet mgpnet.0 mgp2latex.pl mgp2html.pl Makefile �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/contrib/eqn2eps.sh������������������������������������������������������������������������������0100755�0023745�0000000�00000002006�07672036340�0014527�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # The script is originary contributed by # Sylvain Pion <Sylvain.Pion@sophia.inria.fr> # modified by Youjiro UO to support of eqn format formula # modifictaions by Christoph Dalitz: # - caching mechanism added # - support for eqn/eps files in different directory # # Expected usage: # %filter "eqn2eps.sh eqn1" # 1 over sqrt {ax sup 2+bx+c} # %endfilter # %center, image "eqn1.eps" 0 400 400 1 # # temporary filename (without .eps suffix) tmp=$1 # in case a different directory is given: datadir="`dirname $tmp`" if [ ! -z "$datadir" ] then tmp="`basename $tmp`" cd "$datadir" fi # target eqn file and temporary new file eqn=$tmp.eqn eqnnew=$tmp.eqn.new # write new eqn file echo '.EQN' > $eqnnew echo '.EQ' >> $eqnnew cat >> $eqnnew echo '.EN' >> $eqnnew # exit when no change test -e $tmp.eps && test -e $eqn && diff $eqn $eqnnew >/dev/null 2>&1 && { /bin/rm -f $eqnnew exit 0; } # otherwise process eqn file mv $eqnnew $eqn groff -e $eqn > $tmp.ps ps2epsi $tmp.ps $tmp.eps /bin/rm -f $tmp.ps ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/contrib/latex2eps.sh����������������������������������������������������������������������������0100755�0023745�0000000�00000002715�07730224710�0015063�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # # latex2eps.sh - translates latex math formula to EPS # # Expected usage: # %filter "latex2eps.sh eqn" # \begin{displaymath} # \frac{1}{x+y} # \end{displaymath} # %endfilter # %image "eqn.eps" 250x200 # # additional style can be used with option -sty, eg. # latex2eps -sty pslatex -sty color eqn # # History: # 18.03.2003 first creation # 06.03.2003 support for subdirs added # #parse command line options STYLES="" while [ $# -gt 0 ] do case "$1" in # additional styles -sty) STYLES="$STYLES $2"; shift;; # temporary filename (without .eps suffix) *) tmp=$1;; esac shift done # in case a different directory is given: datadir="`dirname $tmp`" if [ ! -z "$datadir" ] then tmp="`basename $tmp`" cd "$datadir" fi # target TeX file and temporary new file tex=$tmp.tex texnew=$tmp.tex.new # write new TeX file echo '\documentclass[fleqn]{article}' > $texnew echo '\usepackage[latin1]{inputenc}' >> $texnew for sty in $STYLES do echo "\usepackage{$sty}" >> $texnew done echo '\begin{document}' >> $texnew echo '\thispagestyle{empty}' >> $texnew echo '\mathindent0cm' >> $texnew echo '\parindent0cm' >> $texnew cat >> $texnew echo '\end{document}' >> $texnew # exit when no change test -e $tmp.eps && test -e $tex && diff $tex $texnew >/dev/null 2>&1 && { /bin/rm -f $texnew exit 0; } # otherwise process TeX file mv $texnew $tex latex $tex > /dev/null 2> /dev/null dvips -q -E $tmp.dvi -o $tmp.eps /bin/rm -f $tmp.log $tmp.dvi $tmp.aux ���������������������������������������������������kit/contrib/mgp-mode-cd.el��������������������������������������������������������������������������0100644�0023745�0000000�00000023274�07730224710�0015233�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;; mgp-mode-cd.el - An Emacs major-mode for editing MagicPoint files. ;; Filename: mgp-mode-cd.el ;; Author: Christoph Dalitz ;; Version: 1.6 ;; License: GNU General Public License ;; Homepage: http://lionel.kr.hsnr.de/~dalitz/data/software/mgp/mgp.html ;; Abstract: ;; ;; This mode is called "mgp-mode-cd" in order to distinguish it from the ;; official "mgp-mode" that is shipped with MagicPoint. In contrast to the ;; official "mgp-mode", which I find too complicated for the average user, ;; this mode focuses on ease of use: all actions are accessible from a ;; self-explanatory main menu entry. Moreover this mode supports the ;; option to preview only the current page. ;; Installation: ;; ;; 1) Optionally, byte-compile this file ;; 2) Put this file in a directory Emacs can find ;; 3) Tell Emacs when to load this file ;; 4) Customize some variables for your system ;; ;; ad 1) ;; Byte-compilation speeds up the load time for this mode ;; and is therefore recommended. Just load this file into ;; Emacs and select "Byte-compile This File" from the ;; "Emacs-Lisp" main menu. This will create the compiled ;; file with the extension "elc". ;; ;; ad 2) ;; The directories that Emacs searches are given by the ;; load-path variable, which you can query within Emacs with ;; ESC-x describe-variable RET load-path Ret ;; To add a directory (eg. ~/.emacs) to load-path, add ;; the following code to your $HOME/.emacs file: ;; (add-to-list 'load-path "~/elisp") ;; ;; ad 3) ;; Add the following lines to your $HOME/.emacs file: ;; (autoload 'mgp-mode "mgp-mode-cd" "MGP mode." t) ;; (add-to-list 'auto-mode-alist '("\\.mgp$" . mgp-mode)) ;; The first line tells Emacs to load mgp-mode-cd.elc or ;; mgp-mode-cd.el when the command 'mgp-mode' is called. ;; The second line tells emacs to invoke the command 'mgp-mode' ;; when a file with a name ending on ".mgp" is opened. ;; ;; ad 4) ;; Some variables might need adjustment to your local system ;; environment. You can do it in your $HOME/.emacs file with ;; commands like ;; (setq mgp-command "mgp -x vflib") ;; (setq mgp-tmpfile "/tmp/preview.mgp") ;; (setq mgp-helpcommand "zcat /usr/share/doc/mgp/SYNTAX.gz | xless") ;; You can also set these variables interactively from the ;; entry "Options" in the "MGP" main menu that is created ;; when mgp-mode is entered. ;; History ;; ;; 01.05.2001 first creation for GNU Emacs ;; 27.02.2002 added installation instructions ;; added options menu for setting of mgp command line ;; bugfix preview-file when cursor in header ;; 01.03.2002 bugfix in mark-page for last page ;; 10.05.2002 new option "Syntax Help" in MGP main menu ;; 30.05.2002 "Syntax Help" now displayed asynchronously ;; ported to Xemacs ;; 12.06.2002 workaround for undefined builtin-face in Xemacs ;; preview-page now also works when cursor in preamble ;; 12.12.2002 added support for ispell ;; List of functions called when mgp-mode is entered (defcustom mgp-mode-hook '() "*Hook for customising `mgp-mode'." :type 'hook :group 'Mgp) ;; custom variables (defcustom mgp-command "mgp -x vflib" "mgp command line. Must be adjusted according to the compilation options, eg. 'mgp -x vflib' when mgp is compile with vflib, but vflib is not installed." :group 'Mgp) (defcustom mgp-tmpfile "/tmp/page.mgp" "Temporary file generated when only parts are previewed." :group 'Mgp) (defcustom mgp-helpcommand "zcat /usr/share/doc/mgp/SYNTAX.gz | xless" "Command for display of MGP syntax documentation." :group 'Mgp) ;; shortcut key bindings (defvar mgp-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "C-c C-b") 'mgp-preview-file) (define-key map (kbd "C-c C-p") 'mgp-preview-page) (define-key map (kbd "C-c C-c") 'mgp-comment-region) (define-key map (kbd "C-c C-u") 'mgp-uncomment-region) (define-key map (kbd "C-c C-m") 'mgp-mark-page) map) "Mode map used for `mgp-mode'.") ;; main menu entry (easy-menu-define mgp-mode-menu mgp-mode-map "Menu for `mgp-mode'." '("MGP" ["Preview Buffer" mgp-preview-file ] ["Preview Page" mgp-preview-page ] ;; automatic menu deactivation when no region marked ;; only works with GNU Emacs and crashes (!) Xemacs ;; ["Comment Region" mgp-comment-region (region-beginning) ] ;; ["Uncomment Region" mgp-uncomment-region (region-beginning) ] ["Comment Region" mgp-comment-region ] ["Uncomment Region" mgp-uncomment-region ] ["Mark Page" mgp-mark-page ] ["Syntax Help" (start-process-shell-command "bla" nil mgp-helpcommand) ] ["-" nil ] ["Options" (customize-group "Mgp") ] )) ;; syntax table ;; currently not used; see comment below font-lock-defaults (defvar mgp-mode-syntax-table (let ((table (make-syntax-table))) ;; comments start with # and end with newline (modify-syntax-entry ?\# "<" table) (modify-syntax-entry 10 ">" table) (modify-syntax-entry 12 ">" table) table) "Syntax table used in 'mgp-mode'.") (defvar mgp-mode-font-lock-keywords nil "Mgp keywords used by font-lock.") (if mgp-mode-font-lock-keywords () (let () (setq mgp-mode-font-lock-keywords (list ;; comments (cons "^#.*" 'font-lock-comment-face) (cons "^%%.*" 'font-lock-comment-face) ;; new page (cons "^%page" 'font-lock-string-face) ;; filters (cons "^%filter.*" 'font-lock-builtin-face) (cons "^%endfilter.*" 'font-lock-builtin-face) ;; other format parameters (cons "^%.*" 'font-lock-function-name-face) )) )) ;; function definitions (defun mgp-comment-region (start end) "Comments out the current region with '# '." (interactive "r") (goto-char end) (beginning-of-line) (setq end (point)) (goto-char start) (beginning-of-line) (setq start (point)) (let () (save-excursion (save-restriction (narrow-to-region start end) (while (not (eobp)) (insert "# ") (forward-line 1))))) ) (defun mgp-uncomment-region (start end) "Remove '# ' comments from current region." (interactive "r") (goto-char end) (beginning-of-line) (setq end (point)) (goto-char start) (beginning-of-line) (setq start (point)) (let ((prefix-len '2)) (save-excursion (save-restriction (narrow-to-region start end) (while (not (eobp)) (if (string= "# " (buffer-substring (point) (+ (point) prefix-len))) (delete-char prefix-len)) (forward-line 1))))) ) (defun mgp-preview-file () "Previews current file with mgp. Starts at the page where the cursor currently is." (interactive) (save-buffer) (save-excursion (let ((pnum (string-to-number (how-many "^%page")))) ;; calculate current page number (goto-char (point-min)) (setq pnum (- (string-to-number (how-many "^%page")) pnum)) (when (< pnum 1) (setq pnum 1)) ;;(y-or-n-p (format "Pages %d" pnum)) (shell-command (format "%s -p %d %s" mgp-command pnum (shell-quote-argument buffer-file-name))) )) ) (defun mgp-mark-page () "Marks the current page. In mgp-mode, one page is one paragraph. Thus you can mark a page with `mark-paragraph' as well." (interactive) (mark-paragraph) ) (defun mgp-preview-page () "Previews current page with mgp." (interactive) (save-buffer) ;; write preamble... (save-excursion (goto-char (point-min)) (mgp-mark-page) (write-region (region-beginning) (region-end) mgp-tmpfile) ) ;; ...and current page (save-excursion ;; move to first page when cursor before first page (let ((pnum (string-to-number (how-many "^%page")))) (save-excursion (goto-char (point-min)) (setq pnum (- (string-to-number (how-many "^%page")) pnum))) (when (< pnum 1) (re-search-forward "^%page" nil t))) (mgp-mark-page) (append-to-file (region-beginning) (region-end) mgp-tmpfile) (shell-command (format "%s %s" mgp-command mgp-tmpfile)) ) ) ;;;###autoload (defun mgp-mode () "Major mode for editing mgp2 source. Comments etc. are highlighted with font-lock. There are also a number of commands that make editing and working with MGP files more convenient. These commands are available from the main menu `MGP' or via the following shortcuts: \\[mgp-preview-file] - Run mgp on the current file. \\[mgp-comment-region] - Comments out the current region. \\[mgp-uncomment-region] - Uncomments the current region. \\[mgp-mark-page] - Marks the current page (== paragraph). " (interactive) (kill-all-local-variables) (setq major-mode 'mgp-mode) (setq mode-name "mgp") (use-local-map mgp-mode-map) ;; workarounds for xemacs: ;; - menu must be explicitly added ;; - xemacs uses preprocessor-face instead of builtin-face (easy-menu-add mgp-mode-menu mgp-mode-map) (if (string-match "XEmacs\\|Lucid" emacs-version) (progn (make-face 'font-lock-builtin-face) (copy-face 'font-lock-preprocessor-face 'font-lock-builtin-face))) ;; syntax table is not used (see below) (set-syntax-table mgp-mode-syntax-table) (make-local-variable 'font-lock-defaults) (setq font-lock-defaults '(mgp-mode-font-lock-keywords t t ((?_ . "w") (?. . "w")))) ;; ^^^ ;; (otherwise syntax table wins and keywords are ignored!) ;; paragraph == page (make-local-variable 'paragraph-start) (setq paragraph-start "[%#]?.*%page") ;; additional options ;;(make-local-variable 'require-final-newline) ;;(setq require-final-newline t) ;;(setq blink-matching-paren t) ;; TAB must insert TAB rather than Spaces (setq indent-tabs-mode t) ;; let ispell skip %-directives (make-local-variable 'ispell-skip-region-alists) (add-to-list 'ispell-skip-region-alist (list "^%.*$")) ;; case insensitive pattern matching (setq font-lock-keywords-case-fold-search t) (put 'mgp-mode 'font-lock-keywords-case-fold-search t) (run-hooks 'mgp-mode-hook) ) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/contrib/mgp-mode.el�����������������������������������������������������������������������������0100644�0023745�0000000�00000041430�07026506457�0014652�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;; mgp-mode.el ;; --- A mode for editing MagicPoint files ;; ;; Tested on Mule 2.3, based on GNU Emacs 19.28 ;; Copyright (C) 1999 Hirotsugu Kakugawa ;; Maintainer: Hirotsugu Kakugawa (h.kakugawa@computer.org) ;; 1 Apr 1999 1.00 First Implementation ;; 2 Apr 1999 1.01 Added mgp-direc-emph. Changed key bindings. ;; 2 Apr 1999 1.10 Added jumping to error line in MagicPoint file ;; 4 Apr 1999 1.20 Added directive completion input feature ;; 5 Apr 1999 1.21 Added starting MagicPoint at the current page ;; 9 Apr 1999 1.22 Changed mistakes in software license. ;; 8 Dec 1999 1.30 Added syntax hilighting. Carlos Puchol (cpg@puchol.com) ;; This software is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This software is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;; In your ~/.emacs (for example) ;; ;; (setq auto-mode-alist ;; (cons '("\\.mgp?\\'" . mgp-mode) ;; auto-mode-alist)) ;; (autoload 'mgp-mode "mgp-mode") ;; (setq mgp-options "-g 800x600") ;; (setq mgp-window-height 6) ;; (cond ;; ((= emacs-major-version 19) ;; Emacs 19, Mule 2.3 ;; (setq mgp-mode-hook ;; (function (lambda () ;; (set-file-coding-system '*iso-2022-jp*unix))))) ;; ((= emacs-major-version 20) ;; Emacs 20 ;; (setq mgp-mode-hook ;; (function (lambda () ;; (set-file-coding-system-for-read 'iso-2022-jp-unix)))))) ;; Editting Commands: ;; ;; KEY SEQUENCE DESCRIPTION ;; ------------ ---------------------------------------------------------- ;; M-x mgp-mode Change the mode of current buffer to Magic-Point mode ;; C-c C-v Run MagicPoint for the current buffer. ;; If prefix argument with explicit numbers are given, the ;; specified page number is displayed as an inital page. ;; If prefix argument without numbe (only 'C-u') is given, ;; the page where the cursor is displayed. ;; Example 1: C-c C-v ==> the first page ;; Example 2: C-u C-c C-v ==> the current page ;; Example 3: C-u 7 C-c C-v ==> the seventh page ;; C-x ` or C-c ` Jump the cursor to the error line in the MagicPoint file. ;; C-c C-c Kill the running MagicPoint (if any). ;; M-TAB Completing input. If the character at the beginning of ;; line is %, MagicPoint directives are completed. Othewise, ;; ISPELL is invoked to complete a word. ;; C-c C-f Insert the "fore" directive. ;; C-c C-b Insert the "back" directive. ;; C-c C-p Insert the "page" directive. ;; C-c C-l Insert the "lcutin" directive. ;; C-c C-r Insert the "rcutin" directive. ;; C-c C-i Insert the "image" directive. ;; C-c C-e Insert a sequence of directives to emphasizing text. ;; C-c c Insert the "center" directive. ;; C-c l Insert the "leftfill" directive. ;; C-c L Insert the "left-line" directive. ;; C-c r Insert the "right-line" directive. ;; C-c f Insert the "font" directive. ;; C-c b Insert the "bimage" directive. ;; C-c e Insert the "embed, endembed" directive sequnce. ;; C-c i Insert the "icon" directive. ;; C-c p Insert the "pause" directive. ;; C-c a Insert the "again" directive. ;; C-c m Insert the "mark" directive. ;; C-c n Insert the "nodefault" directive. ;; C-c s Insert the "size" directive. ;; C-c B Insert the "bar" directive. ;; C-c C Insert the "cont" directive. ;; C-c G Insert the "bgrad" directive. ;; C-c P Insert the "prefix" directive. ;; C-c S Insert the "system" directive. ;; C-c F Insert the "filter, endfilter" directive sequence. ;; Variables for customization ;; NAME DISCRIPTION (buffer local var. is marked *) ;; -------------------- --------------------------------------------- ;; mgp-program MagicPoint program name ;; mgp-options *Command line option for MagicPoint ;; mgp-directives-optional List of directives for input completion ;; mgp-window-height Height of window for output of MagicPoint ;; mgp-page-separator *String inserted before %page directive ;; mgp-emph-color *Color name for emphasized text, C-c C-e ;; mgp-emph-color-normal *Color name for unemphasizing text, C-c C-e ;; (require 'compile) ;; Program name of MagicPoint (defvar mgp-program "mgp" "*MagicPoint program name") ;; Command line option for MagicPoint (defvar mgp-options nil "*MagicPoint optional arguments. nil or string. Buffer local.") ;; Height of MagicPoint message window (defvar mgp-window-height nil "*Number of lines of a MagicPoint window. If nil, use Emacs default.") ;; MagicPoint directive alist for completing input (defvar mgp-directives '("size" "fore" "back" "bgrad" "ccolor" "left" "leftfill" "center" "right" "shrink" "lcutin" "rcutin" "cont" "nodefault" "xfont" "vfont" "tfont" "tfont0" "bar" "image" "prefix" "icon" "bimage" "default" "tab" "tabprefix" "page" "vgap" "hgap" "pause" "mark" "again" "system" "xsystem" "filter" "endfilter" "vfcap" "tfdir" "deffont" "font" "embed" "endembed" "noop" "linestart" "lineend" "quality") "*List of MagicPoint directives for completing input.") (defvar mgp-directives-optional nil "*List of optional MagicPoint directives for completing input. For customization.") ;; Style (defvar mgp-page-separator "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" "Page separator string.") (defvar mgp-emph-color "red" "The text color name for emphasized words, for mgp-direc-emph function.") (defvar mgp-emph-color-normal "black" "The text color name for non-emphasized words, for mgp-direc-emph function.") (cond ((= emacs-major-version 19) ;; Emacs 19 settings (cond ((fboundp 'copy-face) (require 'hilit19) (hilit-set-mode-patterns '(mgp-mode) '( ("^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*" nil Yellow) ("^#.*" nil comment) ("\"" "[^\\]\"" string) ("\\<\\(size\\|fore\\|back\\|bgrad\\|ccolor\\|left\\|leftfill\\|center\\|right\\|shrink\\|lcutin\\|rcutin\\|cont\\|nodefault\\|xfont\\|vfont\\|tfont\\|tfont0\\|bar\\|image\\|prefix\\|icon\\|bimage\\|default\\|tab\\|tabprefix\\|page\\|vgap\\|hgap\\|pause\\|mark\\|again\\|system\\|xsystem\\|filter\\|endfilter\\|vfcap\\|tfdir\\|deffont\\|font\\|embed\\|endembed\\|noop\\|linestart\\|lineend\\|quality\\)\\>" nil keyword) ("^%.*" nil defun) )))))) ;; History (defvar mgp-history nil "History of mgp commands.") ;; Abbrev Table (defvar mgp-mode-abbrev-table nil "Abbrev table used while in mgp mode.") (define-abbrev-table 'mgp-mode-abbrev-table ()) ;; Directive Completion (defvar mgp-directive-alist nil "Alist of MagicPoint directives.") (if mgp-directive-alist () (setq mgp-directive-alist (mapcar (function (lambda (direc) (list direc))) (sort (append mgp-directives mgp-directives-optional) 'string<)))) ;; Syntax Table (defvar mgp-mode-syntax-table nil "Syntax table used while in mgp mode.") (if mgp-mode-syntax-table () (setq mgp-mode-syntax-table (make-syntax-table)) (modify-syntax-entry ?% ". " mgp-mode-syntax-table) (modify-syntax-entry ?\" ". " mgp-mode-syntax-table) (modify-syntax-entry ?\\ ". " mgp-mode-syntax-table) (modify-syntax-entry ?' "w " mgp-mode-syntax-table)) ;; Mode Map (defvar mgp-mode-map nil "Keymap for Mgp (MagicPoint) mode. Many other modes, such as Mail mode, Outline mode and Indented Mgp mode, inherit all the commands defined in this map.") (if mgp-mode-map () (setq mgp-mode-map (make-sparse-keymap)) (define-key mgp-mode-map "\t" 'tab-to-tab-stop) (define-key mgp-mode-map "\e\t" 'mgp-complete-word) (define-key mgp-mode-map "\C-c\C-v" 'mgp-run-mgp) (define-key mgp-mode-map "\C-c\C-c" 'kill-compilation) (define-key mgp-mode-map "\C-c`" 'next-error) (define-key mgp-mode-map "\C-x`" 'next-error) (define-key mgp-mode-map "\C-c\C-f" 'mgp-direc-fore) (define-key mgp-mode-map "\C-c\C-b" 'mgp-direc-back) (define-key mgp-mode-map "\C-c\C-p" 'mgp-direc-page) (define-key mgp-mode-map "\C-c\C-l" 'mgp-direc-lcutin) (define-key mgp-mode-map "\C-c\C-r" 'mgp-direc-rcutin) (define-key mgp-mode-map "\C-c\C-i" 'mgp-direc-image) (define-key mgp-mode-map "\C-c\C-e" 'mgp-direc-emph) (define-key mgp-mode-map "\C-cc" 'mgp-direc-center-line) (define-key mgp-mode-map "\C-cl" 'mgp-direc-leftfill) (define-key mgp-mode-map "\C-cL" 'mgp-direc-left-line) (define-key mgp-mode-map "\C-cr" 'mgp-direc-right-line) (define-key mgp-mode-map "\C-cf" 'mgp-direc-font) (define-key mgp-mode-map "\C-cb" 'mgp-direc-bimage) (define-key mgp-mode-map "\C-ce" 'mgp-direc-embed) (define-key mgp-mode-map "\C-ci" 'mgp-direc-icon) (define-key mgp-mode-map "\C-cp" 'mgp-direc-pause) (define-key mgp-mode-map "\C-ca" 'mgp-direc-again) (define-key mgp-mode-map "\C-cm" 'mgp-direc-mark) (define-key mgp-mode-map "\C-cn" 'mgp-direc-nodefault) (define-key mgp-mode-map "\C-cs" 'mgp-direc-size) (define-key mgp-mode-map "\C-cB" 'mgp-direc-bar) (define-key mgp-mode-map "\C-cC" 'mgp-direc-cont) (define-key mgp-mode-map "\C-cG" 'mgp-direc-bgrad) (define-key mgp-mode-map "\C-cP" 'mgp-direc-prefix) (define-key mgp-mode-map "\C-cS" 'mgp-direc-system) (define-key mgp-mode-map "\C-cF" 'mgp-direc-filter)) ;; MagicPoint mode (defun mgp-mode () "Major mode for editing MagicPoint files. Special commands: \\{mgp-mode-map} Turning on Mgp mode calls the value of the variable `mgp-mode-hook', if that value is non-nil. Variables for customization NAME DISCRIPTION (buffer local var. is marked *) -------------------- --------------------------------------------- mgp-program MagicPoint program name mgp-options *Command line option for MagicPoint mgp-directives-optional List of directives for input completion mgp-window-height Height of window for output of MagicPoint mgp-page-separator *String inserted before %page directive mgp-emph-color *Color name for emphasized text, C-c C-e mgp-emph-color-normal *Color name for unemphasizing text, C-c C-e " (interactive) (kill-all-local-variables) (use-local-map mgp-mode-map) (setq mode-name "MagicPoint") (setq major-mode 'mgp-mode) (setq local-abbrev-table mgp-mode-abbrev-table) (set-syntax-table mgp-mode-syntax-table) (make-local-variable 'mgp-options) (make-local-variable 'mgp-page-separator) (make-local-variable 'mgp-emph-color) (make-local-variable 'mgp-emph-color-normal) (run-hooks 'mgp-mode-hook)) ;; Inserting Directives (defun mgp-direc-center-line () (interactive) (mgp-insert-directive "center")) (defun mgp-direc-left-line () (interactive) (mgp-insert-directive "left")) (defun mgp-direc-leftfill () (interactive) (mgp-insert-directive "leftfill")) (defun mgp-direc-right-line () (interactive) (mgp-insert-directive "right")) (defun mgp-direc-image () (interactive) (mgp-insert-directive "image" "")) (defun mgp-direc-fore () (interactive) (mgp-insert-directive "fore" "")) (defun mgp-direc-back () (interactive) (mgp-insert-directive "back" "")) (defun mgp-direc-lcutin () (interactive) (mgp-insert-directive "lcutin")) (defun mgp-direc-rcutin () (interactive) (mgp-insert-directive "rcutin")) (defun mgp-direc-cont () (interactive) (mgp-insert-directive "cont")) (defun mgp-direc-nodefault () (interactive) (mgp-insert-directive "nodefault")) (defun mgp-direc-bar () (interactive) (mgp-insert-directive "bar" t)) (defun mgp-direc-pause () (interactive) (mgp-insert-directive "pause")) (defun mgp-direc-font () (interactive) (mgp-insert-directive "font" "")) (defun mgp-direc-noop () (interactive) (mgp-insert-directive "noop")) (defun mgp-direc-system () (interactive) (mgp-insert-directive "system" "")) (defun mgp-direc-bgrad () (interactive) (mgp-insert-directive "bgrad" t)) (defun mgp-direc-size () (interactive) (mgp-insert-directive "size" t)) (defun mgp-direc-prefix () (interactive) (mgp-insert-directive "prefix" "")) (defun mgp-direc-icon () (interactive) (mgp-insert-directive "icon" t)) (defun mgp-direc-bimage () (interactive) (mgp-insert-directive "bimage" "")) (defun mgp-direc-mark () (interactive) (mgp-insert-directive "mark")) (defun mgp-direc-again () (interactive) (mgp-insert-directive "again")) (defun mgp-insert-directive (dirc &optional arg) (let ((pos-eol (save-excursion (end-of-line) (point)))) (beginning-of-line) (if (looking-at "%") (if (re-search-forward "[a-zA-Z]" pos-eol t) (progn (end-of-line) (insert ", ")) (beginning-of-line) (forward-char 1)) (insert "%"))) (insert dirc) (if arg (if (stringp arg) (insert (concat " " "\"" arg "\"")) (insert " ") (backward-char 1)))) (defun mgp-direc-page () (interactive) (insert mgp-page-separator) (insert "\n%page\n")) (defun mgp-direc-filter () (interactive) (mgp-insert-directive2 "filter")) (defun mgp-direc-embed () (interactive) (mgp-insert-directive2 "embed")) (defun mgp-insert-directive2 (direc) (insert (concat "%" direc "\n%end" direc "\n"))) (defun mgp-direc-emph (n) (interactive "P") (let ((cn (concat "%" (if n "cont, " "") "fore ")) (c1 (if mgp-emph-color mgp-emph-color "")) (c2 (if mgp-emph-color-normal mgp-emph-color-normal ""))) (insert (concat cn "\"" c1 "\"\n\n")) (insert (concat cn "\"" c2 "\"\n")) (previous-line 2))) ;; Running MagicPoint (defun mgp-run-mgp (command-args) (interactive (list (let ((page-opt "")) (if current-prefix-arg (setq page-opt (concat " -p " (mgp-current-page-position current-prefix-arg) " "))) (read-from-minibuffer "Run MagicPoint: " (concat mgp-program " " mgp-options page-opt) nil nil 'mgp-history)))) (if (buffer-modified-p) (if (y-or-n-p "MagicPoint document is modified. Save it? ") (save-buffer))) (if (buffer-file-name (current-buffer)) (let ((compilation-window-height mgp-window-height)) (compile-internal (concat command-args " " (file-name-nondirectory (buffer-file-name (current-buffer)))) "No more errors" "MagicPoint")))) (defun mgp-current-page-position (arg) (if (numberp arg) (if (<= arg 0) 1 (let ((total (mgp-total-pages))) (if (< arg total) arg total))) (save-excursion (end-of-line) (let ((bound (point)) (page 0)) (goto-char (point-min)) (while (search-forward "\n%page" bound t) (setq page (+ page 1))) (number-to-string (if (= page 0) 1 page)))))) (defun mgp-total-pages () (save-excursion (let ((pages 0)) (goto-char (point-min)) (while (search-forward "\n%page" (point-max) t) (setq pages (+ pages 1))) pages))) ;; Completion (defun mgp-complete-word () "Perform completion on a MagicPoint directive or a word preceding point." (interactive) (if (not (save-excursion (beginning-of-line) (looking-at "%"))) (ispell-complete-word) (if (save-excursion (goto-char (max (point-min) (- (point) 1))) (= (char-syntax (following-char)) ?\w)) (let* ((end (point)) (beg (save-excursion (backward-word 1) (while (= (char-syntax (following-char)) ?\') (forward-char 1)) (point))) (pattern (buffer-substring beg end))) (mgp-complete-directive pattern)) (mgp-complete-directive "")))) (defun mgp-complete-directive (pattern) (let ((completion (try-completion pattern mgp-directive-alist))) (cond ((eq completion t) (message "Sole completion")) ((null completion) (message "Can't find completion for \"%s\"" pattern) (ding)) ((not (string= pattern completion)) (delete-region beg end) (insert completion)) (t (message "Making completion list...") (let* ((lizt (all-completions pattern mgp-directive-alist)) (new)) (while lizt (setq new (cons (car lizt) new)) (setq lizt (cdr lizt))) (setq lizt (nreverse new)) (with-output-to-temp-buffer "*Completions*" (display-completion-list lizt))) (message "Making completion list...%s" "done"))))) ;;; mgp-mode.el ends here ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/contrib/mgp-mode20.el���������������������������������������������������������������������������0100644�0023745�0000000�00000044321�10113574620�0015002�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;; mgp-mode.el ;; --- A mode for editing MagicPoint files ;; ;; Tested on Mule 2.3, based on GNU Emacs 20 ;; Copyright (C) 1999 Hirotsugu Kakugawa ;; Maintainer: Hirotsugu Kakugawa (h.kakugawa@computer.org) ;; 1 Apr 1999 1.00 First Implementation ;; 2 Apr 1999 1.01 Added mgp-direc-emph. Changed key bindings. ;; 2 Apr 1999 1.10 Added jumping to error line in MagicPoint file ;; 4 Apr 1999 1.20 Added directive completion input feature ;; 5 Apr 1999 1.21 Added starting MagicPoint at the current page ;; 9 Apr 1999 1.22 Changed mistakes in software license. ;; 8 Dec 1999 1.30 Added syntax hilighting. Carlos Puchol (cpg@puchol.com) ;; 8 Jan 2004 1.40 emacs-20 support Shigeharu TAKENO <shige@iee.niit.ac.jp> ;; This software is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This software is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;; In your ~/.emacs (for example) ;; ;; (setq auto-mode-alist ;; (cons '("\\.mgp?\\'" . mgp-mode) ;; auto-mode-alist)) ;; (autoload 'mgp-mode "mgp-mode") ;; (setq mgp-options "-g 800x600") ;; (setq mgp-window-height 6) ;; (cond ;; ((= emacs-major-version 19) ;; Emacs 19, Mule 2.3 ;; (setq mgp-mode-hook ;; (function (lambda () ;; (set-file-coding-system '*iso-2022-jp*unix))))) ;; ((= emacs-major-version 20) ;; Emacs 20 ;; (setq mgp-mode-hook ;; (function (lambda () ;; (let ((modified-p (buffer-modified-p))) ;; (set-buffer-file-coding-system 'iso-2022-jp-unix) ;; (set-buffer-modified-p modified-p))))) ;; Editting Commands: ;; ;; KEY SEQUENCE DESCRIPTION ;; ------------ ---------------------------------------------------------- ;; M-x mgp-mode Change the mode of current buffer to Magic-Point mode ;; C-c C-v Run MagicPoint for the current buffer. ;; If prefix argument with explicit numbers are given, the ;; specified page number is displayed as an inital page. ;; If prefix argument without numbe (only 'C-u') is given, ;; the page where the cursor is displayed. ;; Example 1: C-c C-v ==> the first page ;; Example 2: C-u C-c C-v ==> the current page ;; Example 3: C-u 7 C-c C-v ==> the seventh page ;; C-x ` or C-c ` Jump the cursor to the error line in the MagicPoint file. ;; C-c C-c Kill the running MagicPoint (if any). ;; M-TAB Completing input. If the character at the beginning of ;; line is %, MagicPoint directives are completed. Othewise, ;; ISPELL is invoked to complete a word. ;; C-c C-f Insert the "fore" directive. ;; C-c C-b Insert the "back" directive. ;; C-c C-p Insert the "page" directive. ;; C-c C-l Insert the "lcutin" directive. ;; C-c C-r Insert the "rcutin" directive. ;; C-c C-i Insert the "image" directive. ;; C-c C-e Insert a sequence of directives to emphasizing text. ;; C-c c Insert the "center" directive. ;; C-c l Insert the "leftfill" directive. ;; C-c L Insert the "left-line" directive. ;; C-c r Insert the "right-line" directive. ;; C-c f Insert the "font" directive. ;; C-c b Insert the "bimage" directive. ;; C-c e Insert the "embed, endembed" directive sequnce. ;; C-c i Insert the "icon" directive. ;; C-c p Insert the "pause" directive. ;; C-c a Insert the "again" directive. ;; C-c m Insert the "mark" directive. ;; C-c n Insert the "nodefault" directive. ;; C-c s Insert the "size" directive. ;; C-c B Insert the "bar" directive. ;; C-c C Insert the "cont" directive. ;; C-c G Insert the "bgrad" directive. ;; C-c P Insert the "prefix" directive. ;; C-c S Insert the "system" directive. ;; C-c F Insert the "filter, endfilter" directive sequence. ;; Variables for customization ;; NAME DISCRIPTION (buffer local var. is marked *) ;; -------------------- --------------------------------------------- ;; mgp-program MagicPoint program name ;; mgp-options *Command line option for MagicPoint ;; mgp-directives-optional List of directives for input completion ;; mgp-window-height Height of window for output of MagicPoint ;; mgp-page-separator *String inserted before %page directive ;; mgp-emph-color *Color name for emphasized text, C-c C-e ;; mgp-emph-color-normal *Color name for unemphasizing text, C-c C-e ;; (require 'compile) ;; Program name of MagicPoint (defvar mgp-program "mgp" "*MagicPoint program name") ;; Command line option for MagicPoint (defvar mgp-options nil "*MagicPoint optional arguments. nil or string. Buffer local.") ;; Height of MagicPoint message window (defvar mgp-window-height nil "*Number of lines of a MagicPoint window. If nil, use Emacs default.") ;; MagicPoint directive alist for completing input (defvar mgp-directives '("size" "fore" "back" "bgrad" "ccolor" "left" "leftfill" "center" "right" "shrink" "lcutin" "rcutin" "cont" "nodefault" "xfont" "vfont" "tfont" "tfont0" "bar" "image" "prefix" "icon" "bimage" "default" "tab" "tabprefix" "page" "vgap" "hgap" "pause" "mark" "again" "system" "xsystem" "filter" "endfilter" "vfcap" "tfdir" "deffont" "font" "embed" "endembed" "noop" "linestart" "lineend" "quality") "*List of MagicPoint directives for completing input.") (defvar mgp-directives-optional nil "*List of optional MagicPoint directives for completing input. For customization.") ;; Style (defvar mgp-page-separator "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" "Page separator string.") (defvar mgp-emph-color "red" "The text color name for emphasized words, for mgp-direc-emph function.") (defvar mgp-emph-color-normal "black" "The text color name for non-emphasized words, for mgp-direc-emph function.") (cond ((= emacs-major-version 19) ;; Emacs 19 settings (cond ((fboundp 'copy-face) (require 'hilit19) (hilit-set-mode-patterns '(mgp-mode) '( ("^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*" nil Yellow) ("^#.*" nil comment) ("^%%.*" nil comment) ("\"" "[^\\]\"" string) ("\\<\\(size\\|fore\\|back\\|bgrad\\|ccolor\\|left\\|leftfill\\|center\\|right\\|shrink\\|lcutin\\|rcutin\\|cont\\|nodefault\\|xfont\\|vfont\\|tfont\\|tfont0\\|bar\\|image\\|prefix\\|icon\\|bimage\\|default\\|tab\\|tabprefix\\|page\\|vgap\\|hgap\\|pause\\|mark\\|again\\|system\\|xsystem\\|filter\\|endfilter\\|vfcap\\|tfdir\\|deffont\\|font\\|embed\\|endembed\\|noop\\|linestart\\|lineend\\|quality\\)\\>" nil keyword) ("^%.*" nil defun) ))))) ((= emacs-major-version 20) (progn (defconst mgp-font-lock-strings-1 (concat "\\<\\(" "size\\|fore\\|back\\|bgrad\\|ccolor\\|" "left\\|leftfill\\|center\\|right\\|" "shrink\\|lcutin\\|rcutin\\|cont\\|nodefault\\|" "xfont\\|vfont\\|tfont\\|tfont0\\|" "bar\\|image\\|prefix\\|icon\\|bimage\\|default\\|" "tab\\|tabprefix\\|page\\|vgap\\|hgap\\|" "pause\\|mark\\|again\\|system\\|xsystem\\|" "filter\\|endfilter\\|vfcap\\|tfdir\\|" "deffont\\|font\\|embed\\|endembed\\|noop\\|" "linestart\\|lineend\\|quality\\|include" "\\)\\>" )) (defvar mgp-font-lock-keywords (list (cons mgp-page-separator '(. font-lock-variable-name-face)) (cons "^\\(#\\|%%\\).*" '(. font-lock-comment-face)) (cons "\".*\"" '(. font-lock-string-face)) (cons "^%" '(. font-lock-function-name-face)) (cons "^\t[^\t].*" '(. font-lock-constant-face)) (cons "^\t\t.*" '(. font-lock-type-face)) (cons mgp-font-lock-strings-1 '(. font-lock-keyword-face)) ) "Default expressions to highlight in mgp mode") (add-hook 'mgp-mode-hook (function (lambda () (make-local-variable 'font-lock-defaults) (setq font-lock-defaults '(mgp-font-lock-keywords t)))))))) ;; History (defvar mgp-history nil "History of mgp commands.") ;; Abbrev Table (defvar mgp-mode-abbrev-table nil "Abbrev table used while in mgp mode.") (define-abbrev-table 'mgp-mode-abbrev-table ()) ;; Directive Completion (defvar mgp-directive-alist nil "Alist of MagicPoint directives.") (if mgp-directive-alist () (setq mgp-directive-alist (mapcar (function (lambda (direc) (list direc))) (sort (append mgp-directives mgp-directives-optional) 'string<)))) ;; Syntax Table (defvar mgp-mode-syntax-table nil "Syntax table used while in mgp mode.") (if mgp-mode-syntax-table () (setq mgp-mode-syntax-table (make-syntax-table)) (modify-syntax-entry ?% ". " mgp-mode-syntax-table) (modify-syntax-entry ?\" ". " mgp-mode-syntax-table) (modify-syntax-entry ?\\ ". " mgp-mode-syntax-table) (modify-syntax-entry ?' "w " mgp-mode-syntax-table)) ;; Mode Map (defvar mgp-mode-map nil "Keymap for Mgp (MagicPoint) mode. Many other modes, such as Mail mode, Outline mode and Indented Mgp mode, inherit all the commands defined in this map.") (if mgp-mode-map () (setq mgp-mode-map (make-sparse-keymap)) (define-key mgp-mode-map "\t" 'tab-to-tab-stop) (define-key mgp-mode-map "\e\t" 'mgp-complete-word) (define-key mgp-mode-map "\C-c\C-v" 'mgp-run-mgp) (define-key mgp-mode-map "\C-c\C-c" 'kill-compilation) (define-key mgp-mode-map "\C-c`" 'next-error) (define-key mgp-mode-map "\C-x`" 'next-error) (define-key mgp-mode-map "\C-c\C-f" 'mgp-direc-fore) (define-key mgp-mode-map "\C-c\C-b" 'mgp-direc-back) (define-key mgp-mode-map "\C-c\C-p" 'mgp-direc-page) (define-key mgp-mode-map "\C-c\C-l" 'mgp-direc-lcutin) (define-key mgp-mode-map "\C-c\C-r" 'mgp-direc-rcutin) (define-key mgp-mode-map "\C-c\C-i" 'mgp-direc-image) (define-key mgp-mode-map "\C-c\C-e" 'mgp-direc-emph) (define-key mgp-mode-map "\C-cc" 'mgp-direc-center-line) (define-key mgp-mode-map "\C-cl" 'mgp-direc-leftfill) (define-key mgp-mode-map "\C-cL" 'mgp-direc-left-line) (define-key mgp-mode-map "\C-cr" 'mgp-direc-right-line) (define-key mgp-mode-map "\C-cf" 'mgp-direc-font) (define-key mgp-mode-map "\C-cb" 'mgp-direc-bimage) (define-key mgp-mode-map "\C-ce" 'mgp-direc-embed) (define-key mgp-mode-map "\C-ci" 'mgp-direc-icon) (define-key mgp-mode-map "\C-cp" 'mgp-direc-pause) (define-key mgp-mode-map "\C-ca" 'mgp-direc-again) (define-key mgp-mode-map "\C-cm" 'mgp-direc-mark) (define-key mgp-mode-map "\C-cn" 'mgp-direc-nodefault) (define-key mgp-mode-map "\C-cs" 'mgp-direc-size) (define-key mgp-mode-map "\C-cB" 'mgp-direc-bar) (define-key mgp-mode-map "\C-cC" 'mgp-direc-cont) (define-key mgp-mode-map "\C-cG" 'mgp-direc-bgrad) (define-key mgp-mode-map "\C-cP" 'mgp-direc-prefix) (define-key mgp-mode-map "\C-cS" 'mgp-direc-system) (define-key mgp-mode-map "\C-cF" 'mgp-direc-filter)) ;; MagicPoint mode (defun mgp-mode () "Major mode for editing MagicPoint files. Special commands: \\{mgp-mode-map} Turning on Mgp mode calls the value of the variable `mgp-mode-hook', if that value is non-nil. Variables for customization NAME DISCRIPTION (buffer local var. is marked *) -------------------- --------------------------------------------- mgp-program MagicPoint program name mgp-options *Command line option for MagicPoint mgp-directives-optional List of directives for input completion mgp-window-height Height of window for output of MagicPoint mgp-page-separator *String inserted before %page directive mgp-emph-color *Color name for emphasized text, C-c C-e mgp-emph-color-normal *Color name for unemphasizing text, C-c C-e " (interactive) (kill-all-local-variables) (use-local-map mgp-mode-map) (setq mode-name "MagicPoint") (setq major-mode 'mgp-mode) (setq local-abbrev-table mgp-mode-abbrev-table) (set-syntax-table mgp-mode-syntax-table) (make-local-variable 'mgp-options) (make-local-variable 'mgp-page-separator) (make-local-variable 'mgp-emph-color) (make-local-variable 'mgp-emph-color-normal) (run-hooks 'mgp-mode-hook)) ;; Inserting Directives (defun mgp-direc-center-line () (interactive) (mgp-insert-directive "center")) (defun mgp-direc-left-line () (interactive) (mgp-insert-directive "left")) (defun mgp-direc-leftfill () (interactive) (mgp-insert-directive "leftfill")) (defun mgp-direc-right-line () (interactive) (mgp-insert-directive "right")) (defun mgp-direc-image () (interactive) (mgp-insert-directive "image" "")) (defun mgp-direc-fore () (interactive) (mgp-insert-directive "fore" "")) (defun mgp-direc-back () (interactive) (mgp-insert-directive "back" "")) (defun mgp-direc-lcutin () (interactive) (mgp-insert-directive "lcutin")) (defun mgp-direc-rcutin () (interactive) (mgp-insert-directive "rcutin")) (defun mgp-direc-cont () (interactive) (mgp-insert-directive "cont")) (defun mgp-direc-nodefault () (interactive) (mgp-insert-directive "nodefault")) (defun mgp-direc-bar () (interactive) (mgp-insert-directive "bar" t)) (defun mgp-direc-pause () (interactive) (mgp-insert-directive "pause")) (defun mgp-direc-font () (interactive) (mgp-insert-directive "font" "")) (defun mgp-direc-noop () (interactive) (mgp-insert-directive "noop")) (defun mgp-direc-system () (interactive) (mgp-insert-directive "system" "")) (defun mgp-direc-bgrad () (interactive) (mgp-insert-directive "bgrad" t)) (defun mgp-direc-size () (interactive) (mgp-insert-directive "size" t)) (defun mgp-direc-prefix () (interactive) (mgp-insert-directive "prefix" "")) (defun mgp-direc-icon () (interactive) (mgp-insert-directive "icon" t)) (defun mgp-direc-bimage () (interactive) (mgp-insert-directive "bimage" "")) (defun mgp-direc-mark () (interactive) (mgp-insert-directive "mark")) (defun mgp-direc-again () (interactive) (mgp-insert-directive "again")) (defun mgp-insert-directive (dirc &optional arg) (let ((pos-eol (save-excursion (end-of-line) (point)))) (beginning-of-line) (if (looking-at "%") (if (re-search-forward "[a-zA-Z]" pos-eol t) (progn (end-of-line) (insert ", ")) (beginning-of-line) (forward-char 1)) (insert "%"))) (insert dirc) (if arg (if (stringp arg) (insert (concat " " "\"" arg "\"")) (insert " ") (backward-char 1)))) (defun mgp-direc-page () (interactive) (insert mgp-page-separator) (insert "\n%page\n")) (defun mgp-direc-filter () (interactive) (mgp-insert-directive2 "filter")) (defun mgp-direc-embed () (interactive) (mgp-insert-directive2 "embed")) (defun mgp-insert-directive2 (direc) (insert (concat "%" direc "\n%end" direc "\n"))) (defun mgp-direc-emph (n) (interactive "P") (let ((cn (concat "%" (if n "cont, " "") "fore ")) (c1 (if mgp-emph-color mgp-emph-color "")) (c2 (if mgp-emph-color-normal mgp-emph-color-normal ""))) (insert (concat cn "\"" c1 "\"\n\n")) (insert (concat cn "\"" c2 "\"\n")) (previous-line 2))) ;; Running MagicPoint (defun mgp-run-mgp (command-args) (interactive (list (let ((page-opt "")) (if current-prefix-arg (setq page-opt (concat " -p " (mgp-current-page-position current-prefix-arg) " "))) (read-from-minibuffer "Run MagicPoint: " (concat mgp-program " " mgp-options page-opt) nil nil 'mgp-history)))) (if (buffer-modified-p) (if (y-or-n-p "MagicPoint document is modified. Save it? ") (save-buffer))) (if (buffer-file-name (current-buffer)) (let ((compilation-window-height mgp-window-height)) (compile-internal (concat command-args " " (file-name-nondirectory (buffer-file-name (current-buffer)))) "No more errors" "MagicPoint")))) (defun mgp-current-page-position (arg) (if (numberp arg) (if (<= arg 0) 1 (let ((total (mgp-total-pages))) (if (< arg total) arg total))) (save-excursion (end-of-line) (let ((bound (point)) (page 0)) (goto-char (point-min)) (while (search-forward "\n%page" bound t) (setq page (+ page 1))) (number-to-string (if (= page 0) 1 page)))))) (defun mgp-total-pages () (save-excursion (let ((pages 0)) (goto-char (point-min)) (while (search-forward "\n%page" (point-max) t) (setq pages (+ pages 1))) pages))) ;; Completion (defun mgp-complete-word () "Perform completion on a MagicPoint directive or a word preceding point." (interactive) (if (not (save-excursion (beginning-of-line) (looking-at "%"))) (ispell-complete-word) (if (save-excursion (goto-char (max (point-min) (- (point) 1))) (= (char-syntax (following-char)) ?\w)) (let* ((end (point)) (beg (save-excursion (backward-word 1) (while (= (char-syntax (following-char)) ?\') (forward-char 1)) (point))) (pattern (buffer-substring beg end))) (mgp-complete-directive pattern)) (mgp-complete-directive "")))) (defun mgp-complete-directive (pattern) (let ((completion (try-completion pattern mgp-directive-alist))) (cond ((eq completion t) (message "Sole completion")) ((null completion) (message "Can't find completion for \"%s\"" pattern) (ding)) ((not (string= pattern completion)) (delete-region beg end) (insert completion)) (t (message "Making completion list...") (let* ((lizt (all-completions pattern mgp-directive-alist)) (new)) (while lizt (setq new (cons (car lizt) new)) (setq lizt (cdr lizt))) (setq lizt (nreverse new)) (with-output-to-temp-buffer "*Completions*" (display-completion-list lizt))) (message "Making completion list...%s" "done"))))) ;;; mgp-mode.el ends here ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/contrib/mgp2html.pl.in��������������������������������������������������������������������������0100644�0023745�0000000�00000021700�11146763217�0015312�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! @mgp_cv_path_perl@ # mgp2html.pl # converts MagicPoint input file to simple dumb html file. # $Id: mgp2html.pl.in,v 1.13 2009/02/18 10:44:31 nishida Exp $ # # Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the project nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. @keywords = split(/\s+/, <<EOF); @mgp_keywords@ EOF $alignmode = ''; $outputsomething = 0; $page = -1; $line = 0; $doimage = 1; $nodefault = 0; $indent = 0; $cont = 0; $colortext = ""; $colorbg = ""; $colorlink = ""; $colorvflink = ""; $mgpdefaultfontsize = 5; $mgpfontsize = -1; $htmldefaultfontsize = -1; $htmlfontsize = -1; $htmlfontsizemin = 1; $htmlfontsizemax = 9; $htmlfontcol = ""; $colormode = 0; $colorlast = ""; $infont = 0; $filtermode = 0; $filtercmd = ""; $filterinput = ""; while ($_ = $ARGV[0], /^-/) { shift; last if /^--$/; if (/^-c/) { $colormode = 1; next; } if (/^-text$/) { $colortext = shift; next; } if (/^-link$/) { $colorlink = shift; next; } if (/^-vlink$/) { $colorvlink = shift; next; } if (/^-bgcolor$/) { $colorbg = shift; next; } if (/^-f$/) { $mgpdefaultfontsize = shift; next; } if (/^-fh$/) { $htmldefaultfontsize = shift; next; } if (/^-fhmin$/) { $htmlfontsizemin = shift; next; } if (/^-fhmax$/) { $htmlfontsizemax = shift; next; } } $fontsize = $defaultfontsize; $mgpfontsize = $mgpdefaultfontsize; $| = 1; &prologue; while (<>) { s/[\n\r]*$//; # trim CR and LF s/</</g; # escape < as < $_ = '' if (/^#/o); # multiline processing (lines ending with '\') while ((/\\$/) && (not eof())) { $_=substr($_,0,-1); # cuts last char (should be '\') $_=$_.<>; # concatenate next line s/[\n\r]*$//; # trim CR and LF } if ($_ eq '' || $_ =~ /^[^%]/) { $line++; $cont = 0 if ($cont == 2); $cont = 2 if ($cont == 1); if ($default[$line] && !$nodefault) { &cmds($default[$line]); } if ($filtermode) { if ($filterinput eq "") { $filterinput = $_; } else { $filterinput = $filterinput . "\n" . $_; } next; } next if ($page == -1); &output($_); next; } $cont = 0 if ($cont == 2); $cont = 2 if ($cont == 1); &cmds($_); } &pageepilogue; &epilogue; exit 0; sub cmds { local($_) = @_; # special directives if (/^%page/i) { &fontreset; if ($page != -1) { &alignreset; &pageepilogue; } else { $page = 0; } &pageprologue; $line = 0; $nodefault = 0; $htmlfontsize = $htmldefaultfontsize; $mgpfontsize = $mgpdefaultfontsize; $fontchange; next; } elsif (/^%default/i) { $x = (split(/\s+/, $_))[1]; $default[$x] = $_; $default[$x] =~ s/^%default\s+\d+\s+/\%/; next; } elsif (/^%%/) { &output(''); next; } # parsed directives @dirs = split(/,\s*/, substr($_, 1)); foreach $j (@dirs) { @dir = split(/\s+/, $j); $dir[0] =~ tr/A-Z/a-z/; if ($dir[0] eq 'image') { if ($dir[$#dir] =~ /^\d+x\d+/) { $#dir--; } $dir[1] =~ s/\"//g; if (!$doimage) { # don't use images } elsif (scalar(@dir) == 2 || scalar(@dir) == 3) { &output("<IMG SRC=\"$dir[1]\" ALT=\"$dir[1]\">\n"); } elsif (scalar(@dir) == 4) { # interpretation wrong &output("<IMG SRC=\"$dir[1]\" WIDTH=$dir[3]% HEIGHT=$dir[3]% ALT=\"$dir[1]\">\n"); } elsif (scalar(@dir) >= 5) { # interpretation wrong &output("<IMG SRC=\"$dir[1]\" WIDTH=$dir[3]% HEIGHT=$dir[4]% ALT=\"$dir[1]\">\n"); } $endline = "<BR>\n"; } elsif ($dir[0] eq 'nodefault') { $nodefault++; } elsif ($dir[0] =~ /^(left|leftfill|right|center)$/) { $dir[0] =~ tr/A-Z/a-z/; &fontreset; &alignreset; &alignmode($dir[0]); &fontchange; } elsif ($dir[0] =~ /^filter$/) { &filter; } elsif ($dir[0] =~ /^endfilter$/) { &endfilter; } elsif ($dir[0] =~ /^cont$/) { $cont = 1; } elsif ($dir[0] =~ /^fore/) { $dir[1] =~ s/\"//g; $htmlfontcol = $dir[1]; &fontchange if ($colormode == 1); } elsif ($dir[0] =~ /^size/) { $dir[1] =~ s/\"//g; $mgpfontsize = $dir[1]; &fontchange; } elsif (grep($dir[0] eq $_, @keywords)) { # unsupported directive with 1 parameter } else { die "unsupported directive $dir[0]\n"; } } } sub prologue { print "<HTML>\n"; print "<BODY"; print " TEXT=" . $colortext if ($colortext ne ''); print " BGCOLOR=" . $colorbg if ($colorbg ne ''); print " LINK=" . $colorlink if ($colorlink ne ''); print " VLINK=" . $colorvlink if ($colorvlink ne ''); print ">\n"; if ($htmldefaultfontsize > 0) { print "<FONT SIZE="; print $htmldefaultfontsize; print ">\n"; } } sub epilogue { if ($htmldefaultfontsize > 0){ print "</FONT>\n"; } print <<EOF; </BODY> </HTML> EOF } sub pageprologue { print <<EOF <HR> EOF } sub pageepilogue { &output_eol; $page++; &doindent(0); print <<EOF (page $page)<BR> EOF } sub output { local($str) = @_; local($i) = 0; while ($str =~ /^\t/) { $i++; $str = substr($str, 1); } if ($cont == 0) { &output_eol; &doindent($i); if (length($str)) { $str =~ s/http:\/\/\S*/<A HREF=$&>$&<\/A>/g; if ($indent) { print "\t" x $indent . "<LI>" . $str; $endline = "\n"; } else { print $str; $endline = "<BR>\n"; } $outputsomething++; } else { $endline = "<BR>\n"; } } else { $endline = ""; if (length($str)) { $str =~ s/http:\/\/\S*/<A HREF=$&>$&<\/A>/g; print $str; $outputsomething++; } } } sub output_eol { print $endline; $endline = ""; } sub doindent { local($level) = @_; if ($indent > $level) { while ($indent > $level) { print "\t" x $indent . "</UL>\n"; $indent--; } } else { while ($indent < $level) { $indent++; print "\t" x $indent . "<UL>\n"; } } } sub alignreset { return if ($alignmode eq ''); if ($alignmode eq 'left') { print "</DIV>\n"; } elsif ($alignmode eq 'leftfill') { print "</DIV>\n"; } elsif ($alignmode eq 'right') { print "</DIV>\n"; } elsif ($alignmode eq 'center') { print "</DIV>\n"; } else { die "unknown alignment $alignmode\n"; } $alignmode = ''; } sub alignmode { local($mode) = @_; $alignmode = $mode; if ($alignmode eq 'left') { print "<DIV ALIGN=LEFT>\n"; } elsif ($alignmode eq 'leftfill') { print "<DIV ALIGN=LEFT>\n"; } elsif ($alignmode eq 'right') { print "<DIV ALIGN=RIGHT>\n"; } elsif ($alignmode eq 'center') { print "<DIV ALIGN=CENTER>\n"; } else { die "unknown alignment $mode\n"; } $outputsomething = 0; } sub filter { $filtercmd = ""; for ($i = 1; $i < scalar(@dir); $i++) { $dir[$i] =~ s/\\/\\\\/g; if ($i == 1) { $dir[$i] =~ s/^\"//; } elsif ($i == scalar(@dir) - 1) { $dir[$i] =~ s/\"$//; } else { $dir[$i] =~ s/\"/\\"/g; } $filtercmd = $filtercmd . " " . $dir[$i]; } $filtermode = 1; } sub endfilter { if ($filterinput eq '') { } else { $filterinput =~ s/\\/\\\\/g; $filterinput =~ s/"/\\"/g; $filtercmd = "echo \"" . $filterinput . "\"" . " | " . $filtercmd; } &output_eol; print "<PRE>\n"; system($filtercmd); print "</PRE>\n"; $filterinput = ""; $filtermode = 0; } sub fontchange { local($fs, $fsh); &fontreset; if ($mgpdefaultfontsize > 0) { $fs = $mgpfontsize - $mgpdefaultfontsize; } else { $fs = 0; } if ($htmldefaultfontsize > 0) { $fsh = $fs + $htmldefaultfontsize; $fs = $htmlfontsizemin if ($fsh < $htmlfontsizemin); $fs = $htmlfontsizemax if ($fsh > $htmlfontsizemax); } if (($fs != 0) || (($colormode == 1) && ($colorlast ne $htmlfontcol))){ print "<FONT"; if ($fs != 0) { print " SIZE="; print "+" if ($fs >= 0); print $fs; } if (($colormode == 1) && ($colorlast ne $htmlfontcol)) { print " COLOR=\"" . $htmlfontcol . "\""; $colorlast = $htmlfontcol; } print ">"; $infont = 1; } } sub fontreset { $colorlast = ""; if ($infont == 1) { print "</FONT>"; } $infont = 0; } ����������������������������������������������������������������kit/contrib/mgp2latex.pl.in�������������������������������������������������������������������������0100644�0023745�0000000�00000011075�06570716544�0015475�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! @mgp_cv_path_perl@ # mgp2latex.pl # converts MagicPoint input file to latex "seminar" style document. # $Id: mgp2latex.pl.in,v 1.8 1998/08/26 05:30:12 itojun Exp $ # # Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the project nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. @keywords = split(/\s+/, <<EOF); @mgp_keywords@ EOF $alignmode = ''; $outputsomething = 0; $page = -1; $line = 0; $doimage = 0; $nodefault = 0; $ignoremode = 0; &prologue; while (<>) { s/\n$//; $_ = '' if (/^#/o); if ($_ eq '' || $_ =~ /^[^%]/) { $line++; if ($default[$line] && !$nodefault) { &cmds($default[$line]); } next if ($ignoremode); next if ($page == -1); &output($_); next; } &cmds($_); } &pageepilogue; &epilogue; exit 0; sub cmds { local($_) = @_; # special directives if (/^%page/i) { if ($page != -1) { &alignreset; &pageepilogue; } else { $page = 0; } &pageprologue; $line = 0; $nodefault = 0; next; } elsif (/^%default/i) { $x = (split(/\s+/, $_))[1]; $default[$x] = $_; $default[$x] =~ s/^%default\s+\d+\s+/\%/; next; } elsif (/^%%/) { &output(''); next; } # parsed directives @dirs = split(/,\s*/, substr($_, 1)); foreach $j (@dirs) { @dir = split(/\s+/, $j); $dir[0] =~ tr/A-Z/a-z/; if ($dir[0] eq 'image') { # if (!$doimage) { # # don't use images # } elsif (scalar(@dir) == 2 || scalar(@dir) == 3) { # print "<IMG SRC=\"$dir[1]\" ALT=\"$dir[1]\">\n"; # } elsif (scalar(@dir) == 4) { # # interpretation wrong # print "<IMG SRC=\"$dir[1]\" WIDTH=$dir[3]% HEIGHT=$dir[3]% ALT=\"$dir[1]\">\n"; # } elsif (scalar(@dir) >= 5) { # # interpretation wrong # print "<IMG SRC=\"$dir[1]\" WIDTH=$dir[3]% HEIGHT=$dir[4]% ALT=\"$dir[1]\">\n"; # } } elsif ($dir[0] eq 'nodefault') { $nodefault++; } elsif ($dir[0] =~ /^(left|right|center)$/) { $dir[0] =~ tr/A-Z/a-z/; &alignreset; &alignmode($dir[0]); } elsif ($dir[0] =~ /^filter$/) { $ignoremode = 1; } elsif ($dir[0] =~ /^endfilter$/) { $ignoremode = 0; } elsif (grep($dir[0] eq $_, @keywords)) { # unsupported directive with 1 parameter } else { die "unsupported directive $dir[0]\n"; } } } sub prologue { print <<EOF; \\documentstyle{seminar} \\begin{document} EOF } sub epilogue { print <<EOF; \\end{document} EOF } sub pageprologue { print <<EOF \\begin{slide} EOF } sub pageepilogue { print <<EOF \\end{slide} EOF } sub output { local($str) = @_; if (length($str)) { print $str . "\\\\\n"; $outputsomething++; } else { print "\\vspace{3mm}\n"; } } sub alignreset { return if ($alignmode eq ''); if (!$outputsomething) { print "\\quad\n"; } if ($alignmode eq 'left') { print "\\end{flushleft}\n"; } elsif ($alignmode eq 'right') { print "\\end{flushright}\n"; } elsif ($alignmode eq 'center') { print "\\end{center}\n"; } else { die "unknown alignment $alignmode\n"; } $alignmode = ''; } sub alignmode { local($mode) = @_; $alignmode = $mode; if ($alignmode eq 'left') { print "\\begin{flushleft}\n"; } elsif ($alignmode eq 'right') { print "\\begin{flushright}\n"; } elsif ($alignmode eq 'center') { print "\\begin{center}\n"; } else { die "unknown alignment $mode\n"; } $outputsomething = 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kit/contrib/mgpnet.in�������������������������������������������������������������������������������0100644�0023745�0000000�00000026574�11146763217�0014456�0����������������������������������������������������������������������������������������������������ustar �nishida�������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! @mgp_cv_path_perl@ # # Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the project nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # $Id: mgpnet.in,v 1.5 2009/02/18 10:44:31 nishida Exp $ # # configurations $tmpdir = '/tmp'; $httpdatestr = "date '+\%a, \%d \%b \%Y \%H:\%M:\%S \%Z'"; $seltimeout = 1; $refreshtimeout = 10; $debug = 0; $port = 9999; # it looks that "charset" parameter for Content-type makes many browsers # unhappy. it is a shame. $usecharset = 0; # do not edit beyond here $hostname = `hostname`; $hostname =~ s/\n$//; # portable? if (scalar(@ARGV) == 0) { open(IN, "ifconfig -a | grep 'inet '|") && do { do { $hostname = (split(/\s+/, <IN>))[2]; } while ($hostname =~ /^127\./); close(IN); }; print "http://$hostname:$port/\n"; exit 0; } # greeting print STDERR "welcome to MagicPoint Netserver...\n"; # parameter parsing $tmpseed = 0; $checkfile = &tmpname; if (grep($ARGV[$_] eq '-T', 0 .. scalar(@ARGV) - 1)) { $checkfile = $ARGV[$_ + 1]; } else { @ARGV = ('-T', $checkfile, @ARGV); } $imagefile = &tmpname; $checkcontent = ''; # OS parameter &guessparam; if (!defined $AF_INET || !defined $PF_INET || !defined $SOCK_STREAM || !defined $sockaddr || !defined $WNOHANG) { print STDERR "could not guess system parameter. edit by hand.\n"; exit 1; } # HTTP/1.0 related $tmp = <<EOF; 200 OK 201 Created 202 Accepted 204 No Content 301 Moved Permanently 302 Moved Temporarily 304 Not Modified 400 Bad Request 401 Unauthorized 403 Forbidden 404 Not Found 500 Internal Server Error 501 Not Implemented 502 Bad Gateway 503 Service Unavailable EOF foreach $i (split(/\n/, $tmp)) { ($j, $k) = split(/\t/, $i); $httpmsg{$j} = $k; } # setting up socket. $anyinaddr = pack('C4', 0, 0, 0, 0); if ($havesinlen) { $mysockaddr = pack($sockaddr, 14, $AF_INET, $port, $anyinaddr); $hissockaddr = pack($sockaddr, 14, $AF_INET, $port, $anyinaddr); } else { $mysockaddr = pack($sockaddr, $AF_INET, $port, $anyinaddr); $hissockaddr = pack($sockaddr, $AF_INET, $port, $anyinaddr); } $proto = (getprotobyname('tcp'))[2]; socket(S, $PF_INET, $SOCK_STREAM, $proto) || die "socket: $!"; if (defined $SOL_SOCKET && defined $SO_REUSEPORT) { setsockopt(S, $SOL_SOCKET, $SO_REUSEPORT, 1); } bind(S, $mysockaddr) || die "bind: $!"; listen(S, 5) || die "listen: $!"; # fork/exec mgp $mgppid = fork; if ($mgppid < 0) { print STDERR "could not invoke MagicPoint (fork): $!\n"; exit -1; } $SIG{'CHLD'} = 'chldhandler'; if ($mgppid == 0){ close(S); exec 'mgp', @ARGV; print STDERR "could not invoke MagicPoint (exec): $!\n" } $SIG{'TERM'} = 'IGNORE'; print STDERR "waiting for connection on port $port.\n"; $acceptstat = 0; while (1) { if (waitpid($mgppid, $WNOHANG) == -1) { print STDERR "MagicPoint terminated.\n"; last; } # page changed? &checkimgfile; # wait for an event... $rin = $win = $ein = ''; vec($rin, fileno(S), 1) = 1; vec($win, fileno(S), 1) = 1; $ewin = $rin | $win; print STDERR "waiting for connection...\n" if ($debug); ($nfound, $timeleft) = select($rout = $rin, $wout = $win, $eout = $ein, $seltimeout); next if ($nfound <= 0); if (vec($rout, fileno(S), 1)) { print STDERR "accepting connection...\n" if ($debug); accept(NS, S) || do { print STDERR "server: accept fail\n" if ($debug); next; }; $acceptstat++; print STDERR "connection accepted...\n" if ($debug); $pid = fork; if ($pid < 0) { print STDERR "server: fork fail\n" if ($debug); close(NS); next; } elsif ($pid) { print STDERR "server: fork success\n" if ($debug); close(NS); next; } # http server task print STDERR "http server task started...\n" if ($debug); select(NS); $/ = "\n"; $| = 1; &httpserver; close(NS); close(S); exit; } } print STDERR "leaving MagicPoint Netserver...\n"; print STDERR "accepted $acceptstat connections so far.\n"; close(NS); close(S); unlink($imagefile); exit 0; sub checkimgfile { local($junk, $t); local($imgtmp); local($pid, $errout); open(CHK, "< $checkfile") || return; $junk = select(CHK); $/ = ''; $| = 1; select($junk); $t = <CHK>; close(CHK); if ($checkcontent ne $t) { print STDERR "page updated.\n"; $checkcontent = $t; $pid = fork; return if (0 < $pid); # if fork success, parent returns. if ($pid == 0) { print STDERR "window grab: fork success.\n" if ($debug); } else { print STDERR "window grab: fork fail, ". "process without fork.\n" if ($debug); } $imgtmp = &tmpname; $errout = ($debug ? '' : '2>&-'); system "xwintoppm -silent -name MagicPoint | ". "ppmquant 256 $errout | ppmtogif $errout > $imgtmp"; if (-z $imgtmp) { unlink $imgtmp; $checkcontent = ''; } else { unlink $imagefile; link($imgtmp, $imagefile); unlink $imgtmp; $checkcontent = $t; } print STDERR 'window grab: done with ' . ($checkcontent eq '' ? 'failure' : 'success') . ".\n"; if ($pid == 0) { print STDERR "window grab: forked process dies.\n" if ($debug); # if fork success, child dies. exit 0; } } } sub chldhandler { local($sig) = @_; return if ($sig ne 'CHLD'); wait; } sub httpserver { local($httpreq, $httpmethod, $httppath, $httpver, $httphost); local($httpagent); local($imgplace, $imgwidth, $imgheight, $buf, $imglen); local($cthtml, $ctgif); $cthtml = ($usecharset ? 'text/html; charset=us-ascii' : 'text/html'); $ctgif = 'image/gif'; $httpreq = <NS>; print STDERR 'HTTP in> ' . $httpreq if ($debug); $httpreq =~ s/[\r\n]+$//; $httpmethod = $httppath = $httpver = ''; ($httpmethod, $httppath, $httpver) = split(/\s+/, $httpreq); $httppath =~ s/http:\/\/[^:\/]+(:\d+)\//\//; if ($httpver eq '' || $httpver eq 'HTTP/1.0') { ; # ok } else { &httpheader(501, $cthtml) if ($httpver); print <<EOF; <HEAD><TITLE>Version not implemented

Version not implemented

HTTP protocol version $httpversion not supported.

EOF return; } $httphost = "$hostname:$port"; if ($httpver) { while () { $_ =~ s/[\r\n]+$//; $httphost = $1 if ($_ =~ /^Host:\s*(\S+)$/i); $httpagent = $1 if ($_ =~ /^User-Agent:\s*(\S+)$/i); last if ($_ eq ''); print STDERR 'HTTP in> ' . $_ . "\n" if ($debug); } } if ($httpmethod !~ /^(GET|HEAD)$/) { &httpheader(501, $cthtml) if ($httpver); print <Method not implemented

Method not implemented

$httpmethod to $httppath not supported.

EOF return; } $imgwidth = $imgheight = 0; if ($httppath =~ /^\/(\d+)x(\d+)\.html$/) { $imgwidth = $1; $imgheight = $2; $httppath = '/index.html'; } if ($httppath eq '/' || $httppath eq '/index.html') { if ($imgwidth && $imgheight) { $imgplace = "WIDTH=$imgwidth HEIGHT=$imgheight "; } else { $imgplace = ''; } &httpheader(200, $cthtml) if ($httpver); return if ($httpmethod ne 'GET'); if ($refreshtimeout) { print < EOF } print <MagicPoint Netserver \"presentation
normal
800x600
640x480
400x300
100x75


MagicPoint Netserver Presented by itojun.org
Supported by MagicPoint Project, WIDE Internet
EOF } elsif ($httppath eq '/presentation.gif') { open(IMG, "< $imagefile") || do { $checkcontent = ''; # invalidate &httpheader(404, $cthtml) if ($httpver); return if ($httpmethod ne 'GET'); print <File Not found

File Not found

The requested URL $httppath was not found on this server.

Looks like a mitake in configuration. Contact the administrator.

EOF return; }; &httpheader(200, $ctgif) if ($httpver); return if ($httpmethod ne 'GET'); while (0 < ($imglen = sysread(IMG, $buf, 4096))) { syswrite(NS, $buf, $imglen); } close(IMG); } else { &httpheader(404, $cthtml) if ($httpver); return if ($httpmethod ne 'GET'); print <File Not found

File Not found

The requested URL $httppath was not found on this server.

EOF } } sub httpheader { local($code, $ct) = @_; local($tmp); local($date); $date = `$httpdatestr`; $date =~ s/[\r\n]+//; $tmp = < ", split(/\n/, $tmp)); $tmp = 'HTTP out> ' . $tmp . "\n"; print STDERR $tmp; } } #------------------------------------------------------------ sub guessparam { local($tmpnam, $tmp, @tmp1, @tmp2); local(%varnames); %varnames = ( 'XXX1', 'AF_INET', 'XXX2', 'PF_INET', 'XXX3', 'SOL_SOCKET', 'XXX4', 'SO_REUSEPORT', 'XXX5', 'SOCK_STREAM', 'XXX6', 'WNOHANG', ); $tmpnam = &tmpname; open(CPP, "| @CPP@ >$tmpnam") || return; print CPP "#include \n"; print CPP "#include \n"; foreach $tmp (keys %varnames) { print CPP "$tmp $varnames{$tmp}\n"; } close(CPP) || return; $tmp = ''; open(CPP, "< $tmpnam") || return; while () { $tmp .= $_; } close(CPP); unlink $tmpnam; @tmp1 = split(/\n/, $tmp); if (grep($_ =~ /sin_len/, @tmp1)) { $havesinlen = 1; $sockaddr = 'C C n a4 x8'; } else { $havesinlen = 0; $sockaddr = 'S n a4 x8'; } foreach $i (keys %varnames) { if (@tmp2 = grep($_ =~ /^$i/, @tmp1)) { $tmp = (split(/\s+/, @tmp2[0]))[1]; $tmp = oct($tmp) if ($tmp =~ /^0/); next if ($tmp !~ /^[0-9]+$/); eval "\$$varnames{$i} = \$tmp;"; } } } sub tmpname { local($fname); do { $fname = $tmpdir . '/' . time . '.' . $$ . '.' . $tmpseed++; } while (-e $fname); return $fname; } kit/contrib/mgpnet.man010064400237450000000000000060430657071654600146200ustar nishidawheel.\" Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. Neither the name of the project nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" $Id: mgpnet.man,v 1.3 1998/08/26 05:30:14 itojun Exp $ .\" .Dd December 1997 .Dt MGPNET 1 .Os .Sh NAME .Nm mgpnet .Nd MagicPoint Netserver (provide MagicPoint presentation over the net) .Sh SYNOPSIS .Nm mgpnet .Op arguments to mgp .Sh DESCRIPTION .Nm mgpnet is a small http server to be executed on the presenter's notebook computer. It lets audience read MagicPoint presentation foils on her notebook computers, over the net. .Pp When a presenter performs a presentation, she should invoke .Nm mgpnet instead of .Nm mgp , with the same argument. .Nm mgpnet will become an http server running on tcp port 9999 (by default), and invokes .Nm mgp as a child process. By accessing URL .Fa http://hostname:9999/ , audience will be able to read the MagicPoint window currently displayed on the presenter's notebook. The webpage provided by .Nm mgpnet is designed in "client pull" manner; audience's notebook will reload the page, several times a minute. .Pp If no option is specified, .Nm mgpnet will print the URL to be accessed by the audience to the standard output. This is useful for indicating the URL to be accessed on the presentation, like: .Bd -literal %filter "mgpnet" %endfilter .Ed .Sh TODO Be network conscious. Current implementation is too naive about CPU/network usage. Presenter's notebook may be overloaded if there's too many audiences. .Sh SEE ALSO .Xr mgp 1 , .Xr xwintoppm 1 . .Sh HISTORY .Nm mgpnet was created by Jun-ichiro itojun Itoh , on the day before the newyear's eve, 1997. kit/contrib/tex2eps.sh010064400237450000000000000007670663051576300145610ustar nishidawheel#! /bin/sh # # The script is contributed by Sylvain Pion . # Subject: (mgp-users 00071) Re: remarks against 1.04a # # Expected usage: # %filter "tex2eps.sh b" # My \TeX\ is nicer with $Magic$ Point # %endfilter # %image "b.eps" 250x200 # # temporary filename (without .eps suffix) tmp=$1 echo '\nopagenumbers' > $tmp.tex cat >> $tmp.tex echo '\end' >> $tmp.tex tex $tmp.tex > /dev/null 2> /dev/null dvips -q -E $tmp.dvi -o $tmp.eps /bin/rm -f $tmp.tex $tmp.log $tmp.dvi kit/contrib/mgp-el004075500237450000000000000000001114712475300137205ustar nishidawheelkit/contrib/mgp-el/COPYING010064400237450000000000000431100671207676700150430ustar nishidawheel GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. kit/contrib/mgp-el/README010064400237450000000000000015450671207677000146700ustar nishidawheel### mgp.el Ver.0.90 -- convert Magic Point file to LaTeX2e 0. CONTENTS o README -- This file. o mgp.el -- Emacs Lisp program to convert mgp file to LaTeX2e. o mgp.sty -- Stype file to be used with the generated LaTeX2e file. o sample.mgp -- Same as distributed with Magic Point. o sample.tex -- LaTeX2e file generated by mgp.el from sample.mgp 1. INSTALLATION 1.1 At first you need Emacs Ver.20.X or Mule Ver.2.3. 1.2 Byte compile mgp.el by Emacs or mule, and copy mgp.el and mgp.elc to a directory that is in `load-path' of your Emacs. The directory /usr/local/share/emacs/site-lisp/ is a good candidate. 1.3 Copy mgp.sty to a directory that your LaTeX system can find. 2. USAGE 2.1 Read your XXX.mpg file into Emacs buffer, and do: M-x mgp-entex-buffer RET Then the file XXX.tex is generated. 2.2 Process the generated XXX.tex by your LaTeX system. kit/contrib/mgp-el/mgp.el010064400237450000000000000521300671207677000151110ustar nishidawheel;;; mgp.el --- Magic Point tool ;;; Copyright (C) 1999 Electrotechnical Lab., JAPAN ;; Author: K.Handa ;; Created: 1999/04/28 ;; Keywords: mgp, Magic Point ;; This file is not part of GNU Emacs, but the same permissions apply. ;; ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Code: (eval-and-compile (or mule-version (error "This program requires Mule feature")) ;; For compatibility between Mule 2.3 and Emacs 20. (defun mgp-buffer-file-coding-system () (if (boundp 'buffer-file-coding-system) (symbol-value 'buffer-file-coding-system) (symbol-value 'file-coding-system))) (or (fboundp 'set-buffer-file-coding-system) (defalias 'set-buffer-file-coding-system 'set-file-coding-system)) (or (fboundp 'coding-system-base) (defun coding-system-base (coding) (cond ((memq coding '(*ctext* *iso-8859-1*)) 'latin-1) ((eq coding '*iso-8859-2*) 'latin-2) ((eq coding '*iso-8859-3*) 'latin-3) ((eq coding '*iso-8859-4*) 'latin-4) ((eq coding '*iso-8859-5*) 'latin-5)))) (or (fboundp 'coding-system-equal) (defalias 'coding-system-equal 'eq)) (or (fboundp 'line-beginning-position) (defun line-beginning-position () (save-excursion (beginning-of-line) (point)))) (or (fboundp 'line-end-position) (defun line-end-position () (save-excursion (end-of-line) (point)))) ) (defvar mgp-version "0.90") (defvar mgp-paper-size "a4") (defvar mgp-image-scale-factor 0.95) (defvar mgp-landscape t) (defvar mgp-lib-directory "/usr/X11R6/lib/X11/mgp") (defvar mgp-disable-color t) (defconst mgp-paper-size-list '("a5" "a4" "b5" "letter" "legal" "executive")) (defconst mgp-predefined-color-list '("black" "white" "red" "green" "blue" "yellow" "cyan" "magenta" "gray")) (defvar mgp-color-list nil) (defvar mgp-entex-inbuf nil) (defvar mgp-entex-outbuf nil) (defvar mgp-entex-source nil) (defun mgp-entex-file (file) (interactive "fMGP source file: ") (setq mgp-entex-source file) (mgp-entex-setup-color-data) (mgp-entex-setup-buffer) (mgp-entex-process-buffer) (switch-to-buffer mgp-entex-outbuf) (goto-char (point-min)) (save-buffer)) (defun mgp-entex-buffer () (interactive) (setq mgp-entex-source (current-buffer)) (mgp-entex-setup-color-data) (mgp-entex-setup-buffer) (mgp-entex-process-buffer) (switch-to-buffer mgp-entex-outbuf) (goto-char (point-min)) (save-buffer)) (defvar mgp-max-color-value nil) (defun mgp-entex-setup-color-data () (if (eq window-system 'x) (setq mgp-max-color-value (car (x-color-values "white"))))) (defmacro mgp-with-output-buffer (&rest body) `(let ((buf (current-buffer))) (or (eq buf mgp-entex-outbuf) (set-buffer mgp-entex-outbuf)) (unwind-protect (progn ,@body) (or (eq buf mgp-entex-outbuf) (set-buffer buf))))) (put 'mgp-with-output-buffer 'lisp-indent-function 0) (defun mgp-entex-setup-buffer () (let (filename dir coding) (save-excursion (setq mgp-entex-inbuf (get-buffer-create "*mgp*")) (set-buffer mgp-entex-inbuf) (erase-buffer) (insert "%%\n") (if (bufferp mgp-entex-source) (progn (save-excursion (set-buffer mgp-entex-source) (setq filename (concat (file-name-sans-extension (or buffer-file-name (buffer-name))) ".tex") dir default-directory coding (mgp-buffer-file-coding-system))) (set-buffer-file-coding-system coding) (setq default-directory dir) (insert-buffer mgp-entex-source)) (setq filename (concat (file-name-sans-extension mgp-entex-source) ".tex") dir (file-name-directory (expand-file-name mgp-entex-source))) (insert-file-contents (expand-file-name mgp-entex-source)) (setq coding (mgp-buffer-file-coding-system)) (setq default-directory dir)) (goto-char (point-min)) (while (and (search-forward "\n%include" nil t) (looking-at " +\\([^ ]+\\)")) (let ((incfile (mgp-entex-get-string-arg)) (pos (line-beginning-position)) len) (forward-line 1) (delete-region pos (point)) (if (or (file-readable-p incfile) (progn (setq incfile (expand-file-name incfile mgp-lib-directory)) (file-readable-p incfile))) (progn (message "Inserting file %s..." incfile) (insert-file-contents incfile))) (goto-char (point-min)))) (goto-char (point-min)) (while (search-forward "\\\n" nil t) (delete-char -2)) (goto-char (point-min)) (setq mgp-entex-outbuf (get-buffer-create (file-name-nondirectory filename))) (set-buffer mgp-entex-outbuf) (erase-buffer) (setq default-directory dir buffer-file-name filename) (set-buffer-file-coding-system coding)))) (defvar mgp-entex-continue nil) (defvar mgp-entex-linehead nil) (defvar mgp-entex-prefix "") (defun mgp-entex-process-buffer () (message "Converting MGP to LaTeX...") (mgp-entex-init-global-setting) (save-excursion (set-buffer mgp-entex-inbuf) (while (not (or (eobp) (looking-at "^%page"))) (mgp-entex-process-preamble) (forward-line 1)) (mgp-entex-start-body) (forward-line 1) (let ((page 0) line) (while (not (eobp)) (mgp-entex-init-local-setting) (setq page (1+ page)) (message "Page %d" page) (setq line 1) (mgp-entex-start-page) (setq mgp-entex-linehead t mgp-entex-prefix "") (while (not (or (eobp) (looking-at "^%page"))) (setq line (mgp-entex-process-page line)) (forward-line 1)) (mgp-entex-finish-page line) (forward-line 1)) (mgp-entex-finish-body)))) (defconst mgp-setting-num 128) (defvar mgp-global-setting nil) (defvar mgp-local-setting nil) (defun mgp-entex-init-global-setting () (let ((i 2) (len (* mgp-setting-num 2))) (setq mgp-global-setting (make-vector len nil)) (aset mgp-global-setting 1 (list 'font nil)) (while (< i len) (aset mgp-global-setting i (list 'font nil)) (setq i (1+ i))))) (defun mgp-entex-init-local-setting () (let ((len (length mgp-global-setting)) (i 0)) (if (< (length mgp-local-setting) len) (setq mgp-local-setting (make-vector len nil))) (while (< i len) (aset mgp-local-setting i (copy-sequence (aref mgp-global-setting i))) (setq i (1+ i))))) (defun mgp-entex-parse-cmd (globalp defaultp index) (save-restriction (narrow-to-region (point) (line-end-position)) (while (re-search-forward "[a-z]+" nil t) (let ((func (intern (concat "mgp-entex-cmd-" (downcase (match-string 0)))))) (if (fboundp func) (funcall func globalp defaultp index))) (skip-chars-forward ",") (or (eobp) (forward-char 1))))) (defun mgp-entex-process-preamble () (if (looking-at "^%\\(default\\|tab\\) *") (progn (forward-char 1) (or (eolp) (mgp-entex-parse-cmd 'global nil nil))))) (defun mgp-entex-start-body () (mgp-with-output-buffer (insert "%%% This file was generated by mgp.el ") (insert (format "(Ver.%s).\n" mgp-version)) (insert "%%% Document source: ") (if (bufferp mgp-entex-source) (insert (format "buffer \"%s\"\n" (buffer-name mgp-entex-source))) (insert (format "file \"%s\"\n" mgp-entex-source))) (insert (format "\\documentclass[%spaper%s]{article}\n\\input{mgp.sty}\n" (if (member mgp-paper-size mgp-paper-size-list) mgp-paper-size "a4") (if mgp-landscape ",landscape" ""))) (or mgp-disable-color (progn (insert "\\usepackage{color}\n\\definecolor{gray}{gray}{0.001}") (setq mgp-color-list (cons "gray" mgp-predefined-color-list)))) (let ((coding (mgp-buffer-file-coding-system))) (if coding (let ((base (coding-system-base (mgp-buffer-file-coding-system)))) (cond ((coding-system-equal base 'latin-1) (insert "\\usepackage[latin1]{inputenc}\n")) ((coding-system-equal base 'latin-2) (insert "\\usepackage[latin2]{inputenc}\n")) ((coding-system-equal base 'latin-3) (insert "\\usepackage[latin3]{inputenc}\n")) ((coding-system-equal base 'latin-5) (insert "\\usepackage[latin5]{inputenc}\n")))))) (insert "\\begin{document}\n"))) (defun mgp-entex-finish-body () (mgp-with-output-buffer (insert "\n\\end{document}\n"))) (defun mgp-entex-set-setting (globalp defaultp index prop val) (let ((table (if globalp mgp-global-setting mgp-local-setting))) (or defaultp (setq index (+ mgp-setting-num index))) (plist-put (aref table index) prop val))) (defun mgp-entex-get-setting (globalp defaultp index prop this-line-only) (let ((table (if globalp mgp-global-setting mgp-local-setting)) (limit 0) val) (or defaultp (setq index (+ mgp-setting-num index) limit mgp-setting-num)) (if this-line-only (setq limit index)) (while (and (>= index limit) (not val)) (setq val (plist-get (aref table index) prop)) (setq index (1- index))) val)) (defun mgp-entex-get-string-arg () (skip-chars-forward " \t") (if (= (following-char) ?\") (read (current-buffer)) (if (looking-at "[^, \n]+") (progn (goto-char (match-end 0)) (match-string 0))))) (defun mgp-entex-get-number-arg () (if (looking-at " *[0-9.]+") (let ((num (string-to-int (match-string 0)))) (goto-char (match-end 0)) num))) (defun mgp-entex-cmd-default (globalp &rest ignore) (let ((index (mgp-entex-get-number-arg))) (goto-char (match-end 0)) (mgp-entex-parse-cmd globalp 'default index))) (put 'mgp-entex-cmd-default 'mgp-entex-special t) (defun mgp-entex-cmd-tab (globalp &rest ignore) (let ((index (mgp-entex-get-number-arg))) (goto-char (match-end 0)) (mgp-entex-parse-cmd globalp nil index))) (put 'mgp-entex-cmd-tab 'mgp-entex-special t) (defvar mgp-mark-position nil) (defvar mgp-current-line nil) (defun mgp-entex-cmd-mark (globalp defaultp index) (setq mgp-mark-position (cons mgp-current-line (mgp-with-output-buffer (line-beginning-position))))) (defun mgp-entex-cmd-again (globalp defaultp index) (mgp-entex-set-setting globalp defaultp index 'again t)) (defun mgp-entex-cmd-fore (globalp defaultp index) (let ((arg (mgp-entex-get-string-arg))) (if arg (mgp-entex-set-setting globalp defaultp index 'fore arg)))) (defun mgp-entex-cmd-back (globalp defaultp index) (let ((arg (mgp-entex-get-string-arg))) (if arg (mgp-entex-set-setting globalp defaultp index 'back arg)))) (defun mgp-entex-cmd-size (globalp defaultp index) (let ((arg (mgp-entex-get-number-arg))) (if arg (mgp-entex-set-setting globalp defaultp index 'size arg)))) (defun mgp-entex-cmd-center (globalp defaultp index) (mgp-entex-set-setting globalp defaultp index 'align 'center)) (defun mgp-entex-cmd-left (globalp defaultp index) (mgp-entex-set-setting globalp defaultp index 'align 'left)) (defun mgp-entex-cmd-leftfill (globalp defaultp index) (mgp-entex-set-setting globalp defaultp index 'align 'left)) (defun mgp-entex-cmd-right (globalp defaultp index) (mgp-entex-set-setting globalp defaultp index 'align 'right)) (defun mgp-entex-cmd-vgap (globalp defaultp index) (let ((arg (mgp-entex-get-number-arg))) (if arg (mgp-entex-set-setting globalp defaultp index 'vgap arg)))) (defun mgp-entex-cmd-font (globalp defaultp index) (let ((arg (mgp-entex-get-string-arg))) (if arg (mgp-entex-set-setting globalp defaultp index 'font arg)))) (defun mgp-entex-cmd-xfont (globalp defaultp index) (let ((arg (mgp-entex-get-string-arg))) (if arg (mgp-entex-set-setting globalp defaultp index 'font arg)))) (defun mgp-entex-cmd-cont (globalp defaultp index) (mgp-entex-set-setting globalp defaultp index 'cont t)) (defun mgp-entex-cmd-nodefault (globalp defaultp index) (if globalp (error "%nodefault can't be used in preamble")) (let ((len (length mgp-local-setting)) (i 2)) (aset mgp-local-setting 1 (list 'font nil)) (while (< i len) (aset mgp-local-setting i (list 'font nil)) (setq i (1+ i))))) (defun mgp-entex-cmd-bar (globalp defaultp index) (let ((color (mgp-entex-get-string-arg)) (width (or (mgp-entex-get-number-arg) 10)) (start (or (mgp-entex-get-number-arg) 0)) (length (or (mgp-entex-get-number-arg) 100))) (mgp-entex-set-setting globalp defaultp index 'bar (list color width start length)))) (defun mgp-entex-cmd-image (globalp defaultp index) (let ((arg1 (mgp-entex-get-string-arg))) (if arg1 (let ((arg2 (mgp-entex-get-string-arg)) (arg3 (mgp-entex-get-string-arg)) (arg4 (mgp-entex-get-string-arg)) (arg5 (mgp-entex-get-string-arg))) ;;; SYNTAX for %image is documented as below: ;;; %image "imagefile" ;;; %image "imagefile" [] ;;; but it seems the second form should actually be: ;;; %image "imagefile" [ [] ] (if arg4 (setq arg2 (and arg2 (string-to-int arg2)) arg3 (and arg3 (string-to-int arg3)) arg4 (and arg4 (string-to-int arg4)) arg5 (and arg5 (string-to-int arg5))) (if arg3 (setq arg2 (string-to-int arg2)) (setq arg3 arg2 arg2 nil))) (mgp-entex-set-setting globalp defaultp index 'image (list arg1 arg2 arg3 arg4 arg5)))))) (defun mgp-entex-cmd-prefix (globalp defaultp index) (let ((arg (mgp-entex-get-string-arg))) (if arg (mgp-entex-set-setting globalp defaultp index 'prefix arg)))) (defun mgp-entex-cmd-icon (globalp defaultp index) (let* ((type (mgp-entex-get-string-arg)) ;; Currently color and size are just ignored. (color (mgp-entex-get-string-arg)) (size (mgp-entex-get-number-arg)) (str (cond ((string= type "arc") "$\\bullet$") ((string= type "box") "$\\Box$") ((string= type "dia") "$\\Diamond$") ((string= type "delta1") "$\\bigtriangleup$") ((string= type "delta2") "$\\bigtriangledown$") ((string= type "delta3") "$\\triangleright$") ((string= type "delta4") "$\\triangleleft$") (t "$\\diamond$")))) (mgp-entex-set-setting globalp defaultp index 'icon str))) (defconst mgp-entex-special-characters '((?# . "\\#") (?$ . "\\$") (?% . "\\%") (?& . "\\&") (?_ . "\\_") (?@ . "{\\makeatletter@\\makeatother}") (?< . "$<$") (?> . "$>$") (?~ . "\\~{ }"))) (defconst mgp-entex-space-width 4) (defun mgp-entex-handle-string (str prefix &optional size force-indent) (mgp-with-output-buffer (let ((len (length str)) (indent 0) i j) (if prefix (progn (if (string-match "^ +" prefix) (setq indent (match-end 0) prefix (substring prefix indent))))) (if (and (not force-indent) (= indent 0) (= (length prefix) 0) (= len 0)) (if (eq mgp-entex-linehead t) (setq mgp-entex-linehead 'empty)) (if (or prefix force-indent) (insert "{")) (if size (mgp-entex-handle-size size)) (if (or (> indent 0) (> (length prefix) 0)) (insert (format "\\mgpi{%d}{%s}" indent prefix))) (if (string-match "^ +" str) (if (< (match-end 0) len) (progn (setq i (match-end 0) j i) (insert (format "\\mgps{%d}" i))) (setq i len j i)) (setq i 0 j 0)) (while (< i len) (let ((slot (assq (aref str i) mgp-entex-special-characters))) (if slot (progn (if (< j i) (insert (substring str j i))) (insert (cdr slot)) (setq j (1+ i))))) (setq i (1+ i))) (if (< j len) (insert (substring str j))) (setq mgp-entex-linehead nil))))) (defun mgp-entex-process-page (line) (setq mgp-current-line line) (if (memq (following-char) '(?% ?#)) (progn (forward-char 1) (if (or (eolp) (= (preceding-char) ?#) (= (following-char) ?%)) nil (mgp-entex-parse-cmd nil 'default line))) (let* ((str (buffer-substring (point) (line-end-position))) (plist (aref mgp-local-setting line)) (continued (plist-get plist 'cont))) (if continued (plist-put plist 'cont nil) (mgp-with-output-buffer (cond ((eq mgp-entex-linehead 'empty) (insert "\\nl\n") (setq mgp-entex-linehead t)) ((not mgp-entex-linehead) (insert "\\nl}\n") (setq mgp-entex-linehead t))) (setq line (1+ line)))) (let (func) (while plist (setq func (intern (concat "mgp-entex-handle-" (symbol-name (car plist))))) (if (fboundp func) (funcall func (nth 1 plist))) (setq plist (nthcdr 2 plist)))) (let ((indent 0) (len (length str))) (or continued (while (and (< indent len) (= (aref str indent) ?\t)) (setq indent (1+ indent)))) (if (> indent 0) (mgp-entex-handle-indent indent str) (mgp-entex-handle-string str (and (not continued) mgp-entex-prefix)))))) line) (defun mgp-entex-start-page () (mgp-with-output-buffer (insert "\\parbox{\\hsize}{\n") )) (defun mgp-entex-finish-page (line) (mgp-with-output-buffer (let ((plist (aref mgp-local-setting line)) func) (while plist (setq func (intern (concat "mgp-entex-handle-" (symbol-name (car plist))))) (if (fboundp func) (funcall func (nth 1 plist))) (setq plist (nthcdr 2 plist)))) (cond ((eq mgp-entex-linehead 'empty) (insert "\\nl\n") (setq mgp-entex-linehead t)) ((not mgp-entex-linehead) (insert "\\nl}\n") (setq mgp-entex-linehead t))) (insert "}\n\\newpage\n") (setq mgp-entex-linehead t))) (defun mgp-entex-handle-again (&rest arg) (mgp-with-output-buffer (if mgp-mark-position (progn ;;(setq line (car mgp-mark-position)) (goto-char (cdr mgp-mark-position)) (delete-region (point) (point-max)))))) (defun mgp-entex-handle-font (arg) (if arg (mgp-with-output-buffer (insert "\\normalfont") (cond ((string-match "bold-r" arg) (insert "\\bfseries")) ((string-match "bold-[oi]" arg) (insert "\\bfseries\\itshape")) ((string-match "medium-[oi]" arg) (insert "\\itshape"))) (insert " ")))) (defun mgp-entex-define-color (arg) (or (member arg mgp-color-list) (and (eq window-system 'x) (let ((color-values (x-color-values arg))) (insert (format "\\definecolor{%s}{rgb}{" arg)) (while color-values (insert (format "%.3f" (/ (float (car color-values)) mgp-max-color-value))) (setq color-values (cdr color-values)) (if color-values (insert ","))) (insert "}") t)))) (defun mgp-entex-handle-back (arg) (or mgp-disable-color (mgp-with-output-buffer (if (string= arg "black") (setq arg "gray")) (if (mgp-entex-define-color arg) (insert (format "\\pagecolor{%s}" arg)))))) (defun mgp-entex-handle-fore (arg) (or mgp-disable-color (mgp-with-output-buffer (if (mgp-entex-define-color arg) (insert (format "\\color{%s}" arg)))))) (defun mgp-entex-handle-size (arg) (mgp-with-output-buffer (cond ((>= arg 10) (insert "\\Huge ")) ((>= arg 7) (insert "\\huge ")) ((>= arg 6) (insert "\\LARGE ")) ((>= arg 5) (insert "\\Large ")) ((>= arg 4) (insert "\\large ")) ((>= arg 3) (insert "\\normalsize ")) (t (insert "\\tiny "))))) (defun mgp-entex-handle-icon (arg) (mgp-with-output-buffer (insert arg))) (defun mgp-entex-handle-indent (indent str) (mgp-with-output-buffer (let ((prefix (or (mgp-entex-get-setting nil nil indent 'prefix t) " ")) (size (mgp-entex-get-setting nil nil indent 'size t)) (icon (mgp-entex-get-setting nil nil indent 'icon t))) (if icon (setq prefix (concat prefix icon))) (mgp-entex-handle-string (substring str indent) prefix size t)))) (defun mgp-entex-handle-prefix (arg) (setq mgp-entex-prefix arg)) (defun mgp-entex-handle-align (arg) (mgp-with-output-buffer (insert (cond ((eq arg 'center) "\\centering ") ((eq arg 'right) "\\raggedleft ") (t "\\raggedright "))))) (defun mgp-entex-handle-vgap (arg) ;; Currently we don't support it. ) (defun mgp-entex-handle-bar (arg) (mgp-with-output-buffer (cond ((eq mgp-entex-linehead 'empty) (insert "\\nl\n") (setq mgp-entex-linehead t)) ((not mgp-entex-linehead) (insert "\\nl}\n") (setq mgp-entex-linehead t))) (insert (format "\\mgpb{%d}{%d}{%d}\n" (floor (nth 1 arg)) (floor (nth 2 arg)) (floor (nth 3 arg)))))) (defun mgp-entex-handle-image (arg) (let ((file (car arg)) ;;(numcolor (nth 1 arg)) ; not supported (xzoom (nth 2 arg)) (yzoom (nth 3 arg)) (zoomflag (nth 4 arg)) (screensize)) (setq file (concat (file-name-sans-extension file) ".ps")) (or (file-readable-p file) (setq file (concat (file-name-sans-extension file) ".eps"))) (if (file-readable-p file) (mgp-with-output-buffer (if zoomflag (if (and (= yzoom 0) (= xzoom 0)) (insert (format "\\includegraphics{%s}" file)) (insert (format "\\scalebox{%f}[%f]{\\includegraphics{%s}}" (* (/ (float xzoom) 100) mgp-image-scale-factor) (* (/ (float yzoom) 100) mgp-image-scale-factor) file))) (insert (format "\\resizebox{\\hsize}{!}{\\includegraphics{%s}}" file))))))) (provide 'mgp) ;; mgp.el ends here kit/contrib/mgp-el/mgp.sty010064400237450000000000000071010671207677000153260ustar nishidawheel%%% mgp.sty --- style file for a LaTeX file created by mgp.el %%% Copyright (C) 1999 Electrotechnical Lab., JAPAN %% Author: K.Handa %% Created: 1999/04/28 %% This file is not part of GNU Emacs, but the same permissions apply. %% %% GNU Emacs is free software; you can redistribute it and/or modify %% it under the terms of the GNU General Public License as published by %% the Free Software Foundation; either version 2, or (at your option) %% any later version. %% %% GNU Emacs is distributed in the hope that it will be useful, %% but WITHOUT ANY WARRANTY; without even the implied warranty of %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %% GNU General Public License for more details. %% %% You should have received a copy of the GNU General Public License %% along with GNU Emacs; see the file COPYING. If not, write to the %% Free Software Foundation, Inc., 59 Temple Place - Suite 330, %% Boston, MA 02111-1307, USA. %% Disable special handling of `@'. \makeatletter %% Copied from slides.cls and modified slightly. \def\rmdefault{lcmss} % no roman \def\sfdefault{lcmss} \def\ttdefault{lcmtt} \def\itdefault{sl} \def\sldefault{sl} \def\bfdefault{bx} \def\ifourteenpt{13.82} \def\iseventeenpt{16.59} \def\itwentypt{19.907} \def\itwentyfourpt{23.89} \def\itwentyninept{28.66} \def\ithirtyfourpt{34.4} \def\ifortyonept{41.28} \def\@setfontsize@parms#1{% \lineskip #1\relax% \parskip #1\relax% \baselineskip\baselinestretch\baselineskip% \normalbaselineskip\baselineskip} \def\normalsize{% \@setfontsize\normalsize\itwentypt{22\p@}% \@setfontsize@parms{\z@}} \def\small{\@setfontsize\small\iseventeenpt{19\p@ plus3\p@}% \@setfontsize@parms{2\p@}} \let\footnotesize=\small \let\scriptsize=\small \def\tiny{\@setfontsize\tiny\ifourteenpt{16\p@ plus2\p@}% \@setfontsize@parms{2pt}} \def\large{\@setfontsize\large\itwentyfourpt{26\p@ plus8\p@}% \@setfontsize@parms{2\p@}} \def\Large{\@setfontsize\Large\itwentyninept{31\p@ plus10\p@}% \@setfontsize@parms{2\p@}} \def\LARGE{\@setfontsize\LARGE\ithirtyfourpt{36\p@ plus10\p@}% \@setfontsize@parms{2\p@}} \def\huge{\@setfontsize\huge\ifortyonept{43\p@ plus10\p@}% \@setfontsize@parms{2\p@}} \let\Huge\huge %% Put 1cm margin at top and bottom. \setlength\topmargin{-1in} \advance\topmargin by1cm \textheight\paperheight\advance\textheight by-2cm %% Put 1cm margin at left and right \setlength\oddsidemargin{-1in} \advance\oddsidemargin by1cm \textwidth\paperwidth\advance\textwidth by-2cm %% No surplus spaces. \setlength\headheight{0pt} \setlength\headsep {0pt} \setlength\topskip {0pt} \setlength\footskip {0pt} \setlength\parindent {0pt} \pagestretch20mm \pagestyle{empty} %% Special command for line breaking. \def\nl{\hskip0pt minus10mm\nopagebreak[4]\\} \newdimen\mgpdimenx \newdimen\mgpdimeny \newbox\mgpbox %% Hanging indent \def\mgpi#1#2{\setbox\mgpbox=\hbox{#2\hskip.5mm}% \mgpdimenx#1em\divide\mgpdimenx by2\advance\mgpdimenx by\wd\mgpbox% \parindent\mgpdimenx\hangindent\mgpdimenx\indent\llap{\box\mgpbox}\ignorespaces} %% Horizontal skip \def\mgps#1{\mgpdimenx#1em\divide\mgpdimenx by2\hskip\mgpdimenx} %% Draw horizontal bar. \def\mgpb#1#2#3{% \mgpdimeny\textheight\divide\mgpdimeny by1000#1\multiply\mgpdimeny by#1% \mgpdimenx\textwidth\divide\mgpdimenx by100\multiply\mgpdimenx by#2% \makebox[\mgpdimenx]{}% \mgpdimenx\textwidth\divide\mgpdimenx by100\multiply\mgpdimenx by#3% \rule{\mgpdimenx}{\mgpdimeny}\\\vskip-10pt minus10pt} %% Enable special handling of `@'. \makeatother %% Some other packages \usepackage{latexsym} \usepackage{graphics} kit/contrib/mgp-el/sample.tex010064400237450000000000000124230671207677000160100ustar nishidawheel%%% This file was generated by mgp.el (Ver.0.90). %%% Document source: file "sample.mgp" \documentclass[a4paper,landscape]{article} \input{mgp.sty} \begin{document} \parbox{\hsize}{ \normalfont \huge \nl \nl \nl \normalfont \centering {MagicPoint\nl} \normalfont \nl \nl \large {Keio University\nl} {Yoshifumi Nishida\nl} \normalsize {nishida{\makeatletter@\makeatother}sfc.wide.ad.jp\nl} \nl \large {Type SPC key!!\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}How to Use \nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \Large {\Large \mgpi{2}{$\Box$}forward page-$>$ press mouse1 button \nl} {\Large \mgpi{2}{$\Box$}backward page-$>$ press mouse3 button \nl} {\Large \mgpi{2}{$\Box$}quit -$>$ press q key \nl} {\mgpi{1}{}\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Command Line Option \nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \Large {\mgpi{4}{-h:}display usage.\nl} {\mgpi{4}{-g:}geometry. Set the size of window, and placement.\nl} {\mgpi{4}{-o:}Do not override window manager.\nl} {\mgpi{4}{-b:}bgcolor. Set background color to bgcolor. (default: black)\nl} {\nl} \nl {\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Place text whereever you like!\nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \LARGE \centering {\mgpi{1}{}center\nl} {\mgpi{1}{}\nl} {\mgpi{1}{}\nl} \raggedright {\mgpi{1}{}left\nl} {\mgpi{1}{}\nl} \raggedleft {\mgpi{1}{}right\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Use any font size as you like!\nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \Large {\mgpi{1}{}\nl} \centering \Huge {\mgpi{1}{}Hello World\nl} \huge {\mgpi{1}{}Hello World\nl} \Large {\mgpi{1}{}Hello World\nl} \large {\mgpi{1}{}Hello World\nl} \normalsize {\mgpi{1}{}Hello World\nl} \tiny {\mgpi{1}{}Hello World\nl} \tiny {\mgpi{1}{}Hello World\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Font is selectable\nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \Large {\mgpi{1}{}\nl} \large \centering {\mgpi{1}{}\nl} \normalfont {\mgpi{1}{}This is times-medium-r\nl} {\mgpi{1}{}\nl} \normalfont\itshape {\mgpi{1}{}This is times-medium-i\nl} {\mgpi{1}{}\nl} \normalfont\bfseries {\mgpi{1}{}This is times-bold-r\nl} {\mgpi{1}{}\nl} \normalfont\bfseries\itshape {\mgpi{1}{}This is times-bold-i\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Control can be mixed\nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \Large {\mgpi{1}{}\nl} \normalfont \large {\mgpi{1}{}This is a\normalfont \LARGE Test\normalfont \Large message\nl} \normalfont \Large {\mgpi{1}{}\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Automatic folding of long line!\nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \Large {\Large \mgpi{2}{$\Box$}Hello, this is MagicPoint. I can properly handle the folding opeation of very long line, of course english word-wise. The source code of this line is made up by a single line.\nl} {\large \mgpi{6}{$\bullet$}This is the next line. Even if the indentation changes, I can handle this! Yey!\nl} {\Large \mgpi{2}{$\Box$}You can also connect the line using backslash. Yes, UNIX tradition.\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Place inline images!\nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\normalfont \Large \centering \nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Special effects!\nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \Large {\mgpi{1}{}\nl} \LARGE \centering {\mgpi{1}{}test message\nl} {\mgpi{1}{}\nl} {\mgpi{1}{}test message\nl} {\mgpi{1}{}\nl} {\mgpi{1}{}test message\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Pause\nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \Large {\Large \mgpi{2}{$\Box$}tap space bar (twice) to proceed.\nl} {\mgpi{1}{}\nl} \centering {\mgpi{1}{}Happy hacking!\nl} {\mgpi{1}{}Happy hacking!\nl} {\mgpi{1}{}Happy hacking!\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Grab command output into foils\nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \Large {\Large \mgpi{2}{$\Box$}ls -l /kernel /bsd\nl} {\mgpi{1}{}\nl} \normalsize {\mgpi{5}{}\nl} {\Large \mgpi{2}{$\Box$}echo "this is test" | rev\nl} {\mgpi{5}{}\nl} {\mgpi{5}{}this is test\nl} {\mgpi{5}{}\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Subprocess (multimedia!)\nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \Large {\mgpi{1}{}\nl} {\Large \mgpi{2}{$\Box$}Invoke xanim/mpegplay for multimedia presentation! :-)\nl} {\mgpi{1}{}\nl} {\Large \mgpi{2}{$\Box$}No duplicated subprocess for one declaration.\nl} {\Large \mgpi{2}{$\Box$}Geometry can be presentation-screen relative.\nl} {\Large \mgpi{2}{$\Box$}xeyes will vanish if you switch the page.\nl} {\mgpi{1}{}\nl} } \newpage \parbox{\hsize}{ \normalfont \raggedright \tiny \nl \huge {\mgpi{1}{}Have a nice day!\nl} \tiny \mgpb{10}{0}{100} {\mgpi{1}{}\nl} \normalfont \Large {\Large \mgpi{2}{$\Box$}Visit\nl} {\large \mgpi{6}{$\bullet$}\normalfont http://www.mew.org/mgp/\nl} \normalfont {\Large \mgpi{2}{$\Box$}for upcoming information.\nl} } \newpage \end{document} kit/contrib/xmindpath004075500237450000000000000000001114712475300145335ustar nishidawheelkit/contrib/xmindpath/.cvsignore010064400237450000000000000000570657056106200166130ustar nishidawheelconfig.log config.cache config.status Makefile kit/contrib/xmindpath/Makefile.in010064400237450000000000000013400704521373600166540ustar nishidawheel# # $Id: Makefile.in,v 1.3 2000/01/31 05:04:30 itojun Exp $ # srcdir= @srcdir@ OBJS= main.o @LIBOBJS@ CFLAGS= @DEFS@ @X_CFLAGS@ LDFLAGS=@LDFLAGS@ LIBS= @LIBS@ CC= @CC@ TARGET= xmindpath INSTALL=@INSTALL@ prefix= @prefix@ exec_prefix= @exec_prefix@ bindir= @bindir@ mandir= @mandir@ all: $(TARGET) $(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $(TARGET) $(OBJS) $(LIBS) main.o: $(srcdir)/main.c uucplock.o: $(srcdir)/uucplock.c install:: $(INSTALL) -s -o uucp -g bin -m 4755 $(TARGET) $(bindir) $(INSTALL) -o bin -g bin -m 444 $(TARGET).1 $(mandir)/man1 includes:: clean:: /bin/rm -f *.o $(TARGET) distclean:: clean /bin/rm -f Makefile config.cache config.log config.status .depend depend: mkdep ${CFLAGS:M-[ID]*} $(srcdir)/*.c kit/contrib/xmindpath/config.guess010075500237450000000000000476220656771343100171510ustar nishidawheel#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc. # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Written by Per Bothner . # The master version of this file is at the FSF in /home/gd/gnu/lib. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit system type (host/target name). # # Only a few systems have been added to this list; please add others # (but try to keep the structure clean). # # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 8/24/94.) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15 # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in alpha:OSF1:*:*) # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'` exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-cbm-sysv4 exit 0;; amiga:NetBSD:*:*) echo m68k-cbm-netbsd${UNAME_RELEASE} exit 0 ;; amiga:OpenBSD:*:*) echo m68k-cbm-openbsd${UNAME_RELEASE} exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; Pyramid*:OSx*:*:*|MIS*:OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; atari*:NetBSD:*:*) echo m68k-atari-netbsd${UNAME_RELEASE} exit 0 ;; atari*:OpenBSD:*:*) echo m68k-atari-openbsd${UNAME_RELEASE} exit 0 ;; sun3*:NetBSD:*:*) echo m68k-sun-netbsd${UNAME_RELEASE} exit 0 ;; sun3*:OpenBSD:*:*) echo m68k-sun-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:NetBSD:*:*) echo m68k-apple-netbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-apple-openbsd${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) sed 's/^ //' << EOF >dummy.c int main (argc, argv) int argc; char **argv; { #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF ${CC-cc} dummy.c -o dummy \ && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && rm dummy.c dummy && exit 0 rm -f dummy.c dummy echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \ -o ${TARGET_BINARY_INTERFACE}x = x ] ; then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i?86:AIX:*:*) echo i386-ibm-aix exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then sed 's/^ //' << EOF >dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 rm -f dummy.c dummy echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:4) if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=4.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[3478]??:HP-UX:*:*) case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;; 9000/8?? ) HP_ARCH=hppa1.0 ;; esac HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) sed 's/^ //' << EOF >dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 rm -f dummy.c dummy echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i?86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*X-MP:*:*:*) echo xmp-cray-unicos exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} exit 0 ;; CRAY-2:*:*:*) echo cray2-cray-unicos exit 0 ;; F300:UNIX_System_V:*:*) FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; F301:UNIX_System_V:*:*) echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` exit 0 ;; hp3[0-9][05]:NetBSD:*:*) echo m68k-hp-netbsd${UNAME_RELEASE} exit 0 ;; hp3[0-9][05]:OpenBSD:*:*) echo m68k-hp-openbsd${UNAME_RELEASE} exit 0 ;; i?86:BSD/386:*:* | *:BSD/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; *:NetBSD:*:*) echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` exit 0 ;; i*:CYGWIN*:*) echo i386-pc-cygwin32 exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin32 exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; *:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. ld_help_string=`ld --help 2>&1` if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then echo "${UNAME_MACHINE}-pc-linux-gnu" ; exit 0 elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then echo "${UNAME_MACHINE}-unknown-linux-gnu" ; exit 0 elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then echo "powerpc-unknown-linux-gnu" ; exit 0 elif test "${UNAME_MACHINE}" = "alpha" ; then echo alpha-unknown-linux-gnu ; exit 0 elif test "${UNAME_MACHINE}" = "sparc" ; then echo sparc-unknown-linux-gnu ; exit 0 else # Either a pre-BFD a.out linker (linux-gnuoldld) or one that does not give us # useful --help. Gcc wants to distinguish between linux-gnuoldld and linux-gnuaout. test ! -d /usr/lib/ldscripts/. \ && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 # Determine whether the default compiler is a.out or elf cat >dummy.c </dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0 rm -f dummy.c dummy fi ;; # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions # are messed up and put the nodename in both sysname and nodename. i?86:DYNIX/ptx:4*:*) echo i386-sequent-sysv4 exit 0 ;; i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} fi exit 0 ;; i?86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; i?86:LynxOS:2.*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 cat >dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) printf ("vax-dec-bsd\n"); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0 rm -f dummy.c dummy # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi #echo '(Unable to guess system type)' 1>&2 exit 1 kit/contrib/xmindpath/config.sub010075500237450000000000000454440656771343200166150ustar nishidawheel#! /bin/sh # Configuration validation subroutine script, version 1.1. # Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. if [ x$1 = x ] then echo Configuration name missing. 1>&2 echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 echo "or $0 ALIAS" 1>&2 echo where ALIAS is a recognized configuration type. 1>&2 exit 1 fi # First pass through any local machine types. case $1 in *local*) echo $1 exit 0 ;; *) ;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in linux-gnu*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple) os= basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. tahoe | i860 | m68k | m68000 | m88k | ns32k | arm \ | arme[lb] | pyramid \ | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \ | alpha | we32k | ns16k | clipper | i370 | sh \ | powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \ | pdp11 | mips64el | mips64orion | mips64orionel \ | sparc | sparclet | sparclite | sparc64) basic_machine=$basic_machine-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i[3456]86) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \ | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \ | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \ | hppa-* | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \ | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \ | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \ | mips64el-* | mips64orion-* | mips64orionel-* | f301-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-cbm ;; amigados) basic_machine=m68k-cbm os=-amigados ;; amigaunix | amix) basic_machine=m68k-cbm os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | ymp) basic_machine=ymp-cray os=-unicos ;; cray2) basic_machine=cray2-cray os=-unicos ;; [ctj]90-cray) basic_machine=c90-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; i370-ibm* | ibm*) basic_machine=i370-ibm os=-mvs ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i[3456]86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i[3456]86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i[3456]86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i[3456]86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; miniframe) basic_machine=m68000-convergent ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; np1) basic_machine=np1-gould ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5) basic_machine=i586-intel ;; pentiumpro | p6) basic_machine=i686-intel ;; pentium-* | p5-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; k5) # We don't have specific support for AMD's K5 yet, so just call it a Pentium basic_machine=i586-amd ;; nexen) # We don't have specific support for Nexgen yet, so just call it a Pentium basic_machine=i586-nexgen ;; pn) basic_machine=pn-gould ;; power) basic_machine=rs6000-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; symmetry) basic_machine=i386-sequent os=-dynix ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; xmp) basic_machine=xmp-cray os=-unicos ;; xps | xps100) basic_machine=xps100-honeywell ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. mips) basic_machine=mips-mips ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sparc) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -unixware* | svr4*) os=-sysv4 ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -linux-gnu* | -uxpv*) # Remember, each alternative MUST END IN *, to match a version number. ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -ctix* | -uts*) os=-sysv ;; -ns2 ) os=-nextstep2 ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -xenix) os=-xenix ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-semi) os=-aout ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-ibm) os=-aix ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigados ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f301-fujitsu) os=-uxpv ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -hpux*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks*) vendor=wrs ;; -aux*) vendor=apple ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os kit/contrib/xmindpath/configure010075500237450000000000002314430704521373700165300ustar nishidawheel#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help --with-x use the X Window System" # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.13" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set these to C if already set. These must not be set unconditionally # because not all systems understand e.g. LANG=C (notably SCO). # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=main.c # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross ac_exeext= ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:531: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:561: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_prog_rejected=no ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" break fi done IFS="$ac_save_ifs" if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# -gt 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift set dummy "$ac_dir/$ac_word" "$@" shift ac_cv_prog_CC="$@" fi fi fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then case "`uname -s`" in *win32* | *WIN32*) # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:612: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="cl" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi ;; esac fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:644: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF #line 655 "configure" #include "confdefs.h" main(){return(0);} EOF if { (eval echo configure:660: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cc_cross=no else ac_cv_prog_cc_cross=yes fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cc_works=no fi rm -fr conftest* ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:686: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo "configure:691: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes else GCC= fi ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo "configure:719: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_cc_g=yes else ac_cv_prog_cc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break fi done if test -z "$ac_aux_dir"; then { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } fi ac_config_guess=$ac_aux_dir/config.guess ac_config_sub=$ac_aux_dir/config.sub ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 echo "configure:781: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : else ac_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi done ;; esac done IFS="$ac_save_IFS" fi if test "${ac_cv_path_install+set}" = set; then INSTALL="$ac_cv_path_install" else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL="$ac_install_sh" fi fi echo "$ac_t""$INSTALL" 1>&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo "configure:835: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:856: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:873: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:890: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP=/lib/cpp fi rm -f conftest* fi rm -f conftest* fi rm -f conftest* ac_cv_prog_CPP="$CPP" fi CPP="$ac_cv_prog_CPP" else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 # If we find X, set shell vars x_includes and x_libraries to the # paths, otherwise set no_x=yes. # Uses ac_ vars as temps to allow command line to override cache and checks. # --without-x overrides everything else, but does not touch the cache. echo $ac_n "checking for X""... $ac_c" 1>&6 echo "configure:919: checking for X" >&5 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then withval="$with_x" : fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then # Both variables are already set. have_x=yes else if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=NO ac_x_libraries=NO rm -fr conftestdir if mkdir conftestdir; then cd conftestdir # Make sure to not put "make" in the Imakefile rules, since we grep it out. cat > Imakefile <<'EOF' acfindx: @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' EOF if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl; do if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && test -f $ac_im_libdir/libX11.$ac_extension; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case "$ac_im_incroot" in /usr/include) ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; esac case "$ac_im_usrlibdir" in /usr/lib | /lib) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; esac fi cd .. rm -fr conftestdir fi if test "$ac_x_includes" = NO; then # Guess where to find include files, by looking for this one X11 .h file. test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h # First, try using that file with no special directory specified. cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:986: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* # We can compile using X headers with no special include directory. ac_x_includes= else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* # Look for the header file in a standard set of common directories. # Check X11 before X11Rn because it is often a symlink to the current release. for ac_dir in \ /usr/X11/include \ /usr/X11R6/include \ /usr/X11R5/include \ /usr/X11R4/include \ \ /usr/include/X11 \ /usr/include/X11R6 \ /usr/include/X11R5 \ /usr/include/X11R4 \ \ /usr/local/X11/include \ /usr/local/X11R6/include \ /usr/local/X11R5/include \ /usr/local/X11R4/include \ \ /usr/local/include/X11 \ /usr/local/include/X11R6 \ /usr/local/include/X11R5 \ /usr/local/include/X11R4 \ \ /usr/X386/include \ /usr/x386/include \ /usr/XFree86/include/X11 \ \ /usr/include \ /usr/local/include \ /usr/unsupported/include \ /usr/athena/include \ /usr/local/x11r5/include \ /usr/lpp/Xamples/include \ \ /usr/openwin/include \ /usr/openwin/share/include \ ; \ do if test -r "$ac_dir/$x_direct_test_include"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest* fi # $ac_x_includes = NO if test "$ac_x_libraries" = NO; then # Check for the libraries. test -z "$x_direct_test_library" && x_direct_test_library=Xt test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* LIBS="$ac_save_LIBS" # We can link X programs with no special library path. ac_x_libraries= else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* LIBS="$ac_save_LIBS" # First see if replacing the include by lib works. # Check X11 before X11Rn because it is often a symlink to the current release. for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ /usr/X11/lib \ /usr/X11R6/lib \ /usr/X11R5/lib \ /usr/X11R4/lib \ \ /usr/lib/X11 \ /usr/lib/X11R6 \ /usr/lib/X11R5 \ /usr/lib/X11R4 \ \ /usr/local/X11/lib \ /usr/local/X11R6/lib \ /usr/local/X11R5/lib \ /usr/local/X11R4/lib \ \ /usr/local/lib/X11 \ /usr/local/lib/X11R6 \ /usr/local/lib/X11R5 \ /usr/local/lib/X11R4 \ \ /usr/X386/lib \ /usr/x386/lib \ /usr/XFree86/lib/X11 \ \ /usr/lib \ /usr/local/lib \ /usr/unsupported/lib \ /usr/athena/lib \ /usr/local/x11r5/lib \ /usr/lpp/Xamples/lib \ /lib/usr/lib/X11 \ \ /usr/openwin/lib \ /usr/openwin/share/lib \ ; \ do for ac_extension in a so sl; do if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f conftest* fi # $ac_x_libraries = NO if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then # Didn't find X anywhere. Cache the known absence of X. ac_cv_have_x="have_x=no" else # Record where we found X for the cache. ac_cv_have_x="have_x=yes \ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" fi fi fi eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then echo "$ac_t""$have_x" 1>&6 no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes \ ac_x_includes=$x_includes ac_x_libraries=$x_libraries" echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. cat >> confdefs.h <<\EOF #define X_DISPLAY_MISSING 1 EOF X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . case "`(uname -sr) 2>/dev/null`" in "SunOS 5"*) echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 echo "configure:1168: checking whether -R must be followed by a space" >&5 ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_R_nospace=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_R_nospace=no fi rm -f conftest* if test $ac_R_nospace = yes; then echo "$ac_t""no" 1>&6 X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_R_space=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_R_space=no fi rm -f conftest* if test $ac_R_space = yes; then echo "$ac_t""yes" 1>&6 X_LIBS="$X_LIBS -R $x_libraries" else echo "$ac_t""neither works" 1>&6 fi fi LIBS="$ac_xsave_LIBS" esac fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X # libraries were built with DECnet support. And karl@cs.umb.edu says # the Alpha needs dnet_stub (dnet does not exist). echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 echo "configure:1233: checking for dnet_ntoa in -ldnet" >&5 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldnet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" else echo "$ac_t""no" 1>&6 fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 echo "configure:1274: checking for dnet_ntoa in -ldnet_stub" >&5 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" else echo "$ac_t""no" 1>&6 fi fi # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # chad@anasazi.com says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to dickey@clark.net. echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 echo "configure:1322: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) choke me #else gethostbyname(); #endif ; return 0; } EOF if { (eval echo configure:1350: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_gethostbyname=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 fi if test $ac_cv_func_gethostbyname = no; then echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 echo "configure:1371: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" else echo "$ac_t""no" 1>&6 fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says simon@lia.di.epfl.ch: it contains # gethostby* variants that don't use the nameserver (or something). # -lsocket must be given before -lnsl if both are needed. # We assume that if connect needs -lnsl, so does gethostbyname. echo $ac_n "checking for connect""... $ac_c" 1>&6 echo "configure:1420: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char connect(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_connect) || defined (__stub___connect) choke me #else connect(); #endif ; return 0; } EOF if { (eval echo configure:1448: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_connect=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_connect=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 fi if test $ac_cv_func_connect = no; then echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 echo "configure:1469: checking for connect in -lsocket" >&5 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" else echo "$ac_t""no" 1>&6 fi fi # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. echo $ac_n "checking for remove""... $ac_c" 1>&6 echo "configure:1512: checking for remove" >&5 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char remove(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_remove) || defined (__stub___remove) choke me #else remove(); #endif ; return 0; } EOF if { (eval echo configure:1540: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_remove=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_remove=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'remove`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 fi if test $ac_cv_func_remove = no; then echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 echo "configure:1561: checking for remove in -lposix" >&5 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lposix $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" else echo "$ac_t""no" 1>&6 fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. echo $ac_n "checking for shmat""... $ac_c" 1>&6 echo "configure:1604: checking for shmat" >&5 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shmat(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shmat) || defined (__stub___shmat) choke me #else shmat(); #endif ; return 0; } EOF if { (eval echo configure:1632: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_shmat=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_shmat=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'shmat`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 fi if test $ac_cv_func_shmat = no; then echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 echo "configure:1653: checking for shmat in -lipc" >&5 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lipc $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" else echo "$ac_t""no" 1>&6 fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS="$LDFLAGS" test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 echo "configure:1705: checking for IceConnectionNumber in -lICE" >&5 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" else echo "$ac_t""no" 1>&6 fi LDFLAGS="$ac_save_LDFLAGS" fi CFLAGS="$CFLAGS $X_CFLAGS" LIBS="$LIBS $X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS" echo $ac_n "checking for XextAddDisplay in -lXext""... $ac_c" 1>&6 echo "configure:1751: checking for XextAddDisplay in -lXext" >&5 ac_lib_var=`echo Xext'_'XextAddDisplay | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lXext $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo Xext | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi echo $ac_n "checking for XTestFakeKeyEvent in -lXtst""... $ac_c" 1>&6 echo "configure:1798: checking for XTestFakeKeyEvent in -lXtst" >&5 ac_lib_var=`echo Xtst'_'XTestFakeKeyEvent | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lXtst $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo Xtst | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi echo $ac_n "checking for uu_lock in -lutil""... $ac_c" 1>&6 echo "configure:1846: checking for uu_lock in -lutil" >&5 ac_lib_var=`echo util'_'uu_lock | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lutil $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo util | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi for ac_func in uu_lock do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:1896: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:1924: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 LIBOBJS="$LIBOBJS uucplock.o" fi done for ac_hdr in fcntl.h paths.h sys/file.h sys/time.h unistd.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:1954: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1964: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 echo "configure:1992: checking whether time.h and sys/time.h may both be included" >&5 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include int main() { struct tm *tp; ; return 0; } EOF if { (eval echo configure:2006: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_time=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_time=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_header_time" 1>&6 if test $ac_cv_header_time = yes; then cat >> confdefs.h <<\EOF #define TIME_WITH_SYS_TIME 1 EOF fi echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 echo "configure:2027: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:2040: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF if { (eval echo configure:2107: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_header_stdc=no fi rm -fr conftest* fi fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi echo $ac_n "checking for off_t""... $ac_c" 1>&6 echo "configure:2131: checking for off_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_off_t=yes else rm -rf conftest* ac_cv_type_off_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_off_t" 1>&6 if test $ac_cv_type_off_t = no; then cat >> confdefs.h <<\EOF #define off_t long EOF fi echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6 echo "configure:2164: checking for uid_t in sys/types.h" >&5 if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "uid_t" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_uid_t=yes else rm -rf conftest* ac_cv_type_uid_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_uid_t" 1>&6 if test $ac_cv_type_uid_t = no; then cat >> confdefs.h <<\EOF #define uid_t int EOF cat >> confdefs.h <<\EOF #define gid_t int EOF fi echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 echo "configure:2199: checking return type of signal handlers" >&5 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #ifdef signal #undef signal #endif #ifdef __cplusplus extern "C" void (*signal (int, void (*)(int)))(int); #else void (*signal ()) (); #endif int main() { int i; ; return 0; } EOF if { (eval echo configure:2221: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_type_signal=int fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_signal" 1>&6 cat >> confdefs.h <&6 echo "configure:2242: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:2270: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi done trap '' 1 2 15 cat > confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). sed -n \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. cat > conftest.defs <<\EOF s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g s%\[%\\&%g s%\]%\\&%g s%\$%$$%g EOF DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` rm -f conftest.defs # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.13" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@CC@%$CC%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g s%@INSTALL_DATA@%$INSTALL_DATA%g s%@CPP@%$CPP%g s%@X_CFLAGS@%$X_CFLAGS%g s%@X_PRE_LIBS@%$X_PRE_LIBS%g s%@X_LIBS@%$X_LIBS%g s%@X_EXTRA_LIBS@%$X_EXTRA_LIBS%g s%@LIBOBJS@%$LIBOBJS%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac case "$ac_given_INSTALL" in [/$]*) INSTALL="$ac_given_INSTALL" ;; *) INSTALL="$ac_dots$ac_given_INSTALL" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g s%@INSTALL@%$INSTALL%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 kit/contrib/xmindpath/configure.in010064400237450000000000000013660704521374100171240ustar nishidawheeldnl Process this file with autoconf to produce a configure script. AC_INIT(main.c) dnl Checks for programs. AC_PROG_CC AC_PROG_INSTALL dnl Checks for libraries. AC_PATH_XTRA CFLAGS="$CFLAGS $X_CFLAGS" LIBS="$LIBS $X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS" AC_CHECK_LIB(Xext, XextAddDisplay) AC_CHECK_LIB(Xtst, XTestFakeKeyEvent) dnl freebsd AC_CHECK_LIB(util, uu_lock) AC_SUBST(LIBOBJS) AC_CHECK_FUNCS(uu_lock, [], [LIBOBJS="$LIBOBJS uucplock.o"]) dnl Checks for header files. AC_CHECK_HEADERS(fcntl.h paths.h sys/file.h sys/time.h unistd.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_HEADER_TIME AC_TYPE_OFF_T AC_TYPE_UID_T dnl Checks for library functions. AC_TYPE_SIGNAL AC_CHECK_FUNCS(select setreuid) AC_OUTPUT(Makefile) kit/contrib/xmindpath/install-sh010075500237450000000000000127210656771343300166270ustar nishidawheel#! /bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 kit/contrib/xmindpath/main.c010064400237450000000000000157450660454263100157140ustar nishidawheel/* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: main.c,v 1.5 1998/09/30 23:58:17 itojun Exp $ */ /* * Most of X11 code was derived from twiddler driver. */ #include #include #include #include #include #include #include #include #include #include #ifdef X_DISPLAY_MISSING # error this program cannot be compiled without X11. #endif #ifndef REMOTE_DEVICE # define REMOTE_DEVICE "/dev/tty02" /*biased to VAIO505 :-P*/ #endif static char *remote = REMOTE_DEVICE; static int debug = 0; #define dprintf(x) { if (debug) fprintf x; } static int verbose = 0; #define verbmsg(x) { if (verbose) fprintf x; } Display *display = NULL; static uid_t uid, euid; static gid_t gid, egid; static int uidswapped = 0; static void usage __P((void)); static void mainloop __P((int)); static void buttonpress __P((int, int)); static int uucplock __P((char *)); static int uucpunlock __P((char *)); static RETSIGTYPE sigtrap __P((int)); static void daemonuid __P((void)); static void useruid __P((void)); #define EFFECT 0x15 #define LEFT 0x16 #define RIGHT 0x17 #define RELEASE 0x55 int main(argc, argv) int argc; char **argv; { int fd; struct termios old, raw; int ch; extern int optind; extern char *optarg; uid = getuid(); euid = geteuid(); gid = getgid(); egid = getegid(); useruid(); while ((ch = getopt(argc, argv, "df:v")) != EOF) { switch (ch) { case 'd': debug++; break; case 'f': remote = optarg; break; case 'v': verbose++; break; default: usage(); /*NOTREACHED*/ } } argc -= optind; argv += optind; fprintf(stderr, "initializing...\r"); verbmsg((stderr, "initializing X11... ")); display = XOpenDisplay(getenv("DISPLAY")); if (!display) errx(1, "opening X11 display"); verbmsg((stderr, "done.\n")); verbmsg((stderr, "initializing serial port %s... ", remote)); daemonuid(); if (!strchr(remote, '/')) { char *p; p = (char *)malloc(strlen("/dev/") + strlen(remote) + 1); if (!p) err(1, "malloc"); sprintf(p, "/dev/%s", remote); remote = p; } if (uucplock(remote) < 0) { errx(1, "cannot lock %s", remote); /*NOTREACHED*/ } signal(SIGINT, sigtrap); signal(SIGHUP, sigtrap); fd = open(remote, O_NONBLOCK); if (fd < 0) { uucpunlock(remote); err(1, "%s", remote); /*NOTREACHED*/ } tcgetattr(fd, &old); raw = old; cfmakeraw(&raw); cfsetspeed(&raw, B1200); raw.c_cflag &= ~(CSIZE|PARENB|CSTOPB|MDMBUF); raw.c_cflag |= CS8|CREAD|CLOCAL; tcsetattr(fd, TCSANOW, &raw); sleep(1); close(fd); sleep(1); fd = open(remote, O_RDONLY); if (fd < 0) { uucpunlock(remote); err(1, "%s", remote); /*NOTREACHED*/ } useruid(); verbmsg((stderr, "done.\n")); fprintf(stderr, "xmindpath ready.\n"); fprintf(stderr, "\007"); mainloop(fd); uucpunlock(remote); exit(0); } static void usage() { fprintf(stderr, "usage: xmindpath [-dv] [-f dev]\n"); exit(0); } static void mainloop(fd) int fd; { struct timeval tv; struct fd_set rfd; u_char buf[BUFSIZ]; int nfd; int len; int heartbeat = 0; int i; int keystate; keystate = 0; while (1) { tv.tv_sec = 0; tv.tv_usec = 500*1000; FD_ZERO(&rfd); FD_SET(fd, &rfd); nfd = select(fd + 1, &rfd, 0, 0, &tv); if (nfd < 0) { uucpunlock(remote); err(1, "select"); /*NOTREACHED*/ } switch (nfd) { case 0: /*timeout*/ dprintf((stderr, "%c\r", "\\|/-"[heartbeat++ % 4])); break; case 1: len = read(fd, buf, sizeof(buf)); for (i = 0; i < len; i++) { /* filter out bogus remote commander code */ switch (buf[i]) { case LEFT: case RIGHT: case EFFECT: case RELEASE: break; default: dprintf((stderr, "bogus char: %02x\n", buf[i])); continue; } switch (buf[i]) { case LEFT: dprintf((stderr, "left\n")); buttonpress(Button3, 1); break; case RIGHT: dprintf((stderr, "right\n")); buttonpress(Button1, 1); break; case EFFECT: dprintf((stderr, "effect\n")); buttonpress(Button2, 1); break; case RELEASE: dprintf((stderr, "release\n")); buttonpress(Button1, 0); buttonpress(Button2, 0); buttonpress(Button3, 0); break; default: dprintf((stderr, "%02x\n", buf[i])); continue; } } break; default: dprintf((stderr, "select=%d\n", nfd)); break; } } } /* fake mouse button press */ static void buttonpress(button, state) int button; int state; { int offset; static int buttonstate[5]; /* X11 defines 5 buttons */ offset = button - Button1; if (offset < 0 || sizeof(buttonstate)/sizeof(buttonstate[0]) <= offset) return; /* edge trigger */ if ((buttonstate[offset] && state) || (!buttonstate[offset] && !state)) return; XTestFakeButtonEvent(display, button, state ? True : False, 0); buttonstate[offset] = state; XFlush(display); } static int uucplock(name) char *name; { return uu_lock(strrchr(name, '/') + 1); } static int uucpunlock(name) char *name; { return uu_unlock(strrchr(name, '/') + 1); } static RETSIGTYPE sigtrap(no) int no; { uucpunlock(remote); exit(1); } static void daemonuid() { if (uidswapped == 0) return; #ifdef HAVE_SETREUID setreuid(uid, euid); setregid(gid, egid); #else setuid(uid); seteuid(euid); setgid(gid); setegid(egid); #endif uidswapped = 0; } static void useruid() { if (uidswapped == 1) return; #ifdef HAVE_SETREUID setregid(egid, gid); setreuid(euid, uid); #else setgid(egid); setegid(gid); setuid(euid); seteuid(uid); #endif uidswapped = 1; } kit/contrib/xmindpath/pathnames.h010064400237450000000000000043320656771761100167550ustar nishidawheel/* * Copyright (c) 1989 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)pathnames.h 5.2 (Berkeley) 6/1/90 */ #ifdef __bsdi__ #include #endif #define _PATH_ACULOG "/var/log/aculog" #if defined(__NetBSD__) || defined(__FreeBSD__) #define _PATH_LOCKDIRNAME "/var/spool/lock/LCK..%s" #else #define _PATH_LOCKDIRNAME "/var/spool/uucp/LCK..%s" #endif #ifdef notdef #define _PATH_LOCKDIRNAME "/var/spool/uucp/LCK/LCK..%s" #endif #define _PATH_PHONES "/etc/phones" #define _PATH_REMOTE "/etc/remote" kit/contrib/xmindpath/uucplock.c010064400237450000000000000065020702136012700165740ustar nishidawheel/* * Copyright (c) 1988 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)uucplock.c 5.5 (Berkeley) 6/1/90"; #endif /* not lint */ #include #include #include #include "pathnames.h" /* * uucp style locking routines * return: 0 - success * -1 - failure */ uu_lock(ttyname) char *ttyname; { extern int errno; int fd, pid; char tbuf[sizeof(_PATH_LOCKDIRNAME) + MAXNAMLEN]; off_t lseek(); (void)snprintf(tbuf, sizeof(tbuf), _PATH_LOCKDIRNAME, ttyname); fd = open(tbuf, O_RDWR|O_CREAT|O_EXCL, 0664); if (fd < 0) { /* * file is already locked * check to see if the process holding the lock still exists */ fd = open(tbuf, O_RDWR, 0); if (fd < 0) { perror("lock open"); return(-1); } if (read(fd, &pid, sizeof(pid)) != sizeof(pid)) { (void)close(fd); perror("lock read"); return(-1); } if (kill(pid, 0) == 0 || errno != ESRCH) { (void)close(fd); /* process is still running */ return(-1); } /* * The process that locked the file isn't running, so * we'll lock it ourselves */ if (lseek(fd, 0L, L_SET) < 0) { (void)close(fd); perror("lock lseek"); return(-1); } /* fall out and finish the locking process */ } pid = getpid(); if (write(fd, (char *)&pid, sizeof(pid)) != sizeof(pid)) { (void)close(fd); (void)unlink(tbuf); perror("lock write"); return(-1); } (void)close(fd); return(0); } uu_unlock(ttyname) char *ttyname; { char tbuf[sizeof(_PATH_LOCKDIRNAME) + MAXNAMLEN]; (void)snprintf(tbuf, sizeof(tbuf), _PATH_LOCKDIRNAME, ttyname); return(unlink(tbuf)); } kit/contrib/xmindpath/xmindpath.1010064400237450000000000000065520660454235200166760ustar nishidawheel.\" Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. Neither the name of the project nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" $Id: xmindpath.1,v 1.6 1998/09/30 23:55:22 itojun Exp $ .\" .Dd August 22, 1998 .Dt XMINDPATH 1 .Os MAGICPOINT .\" .Sh NAME .Nm xmindpath .Nd MindPath PocketPoint user-level driver for X11 .\" .Sh SYNOPSIS .Nm .Op Fl dv .Op Fl f Ar dev .\" .Sh DESCRIPTION .Nm reads signal sent from MindPath PocketPoint device via serial port, and translate that into X11 event. .Pp PocketPoint is a laser pointer, with three remote control keys. Three keys are right arrow, left arrow and "f/x" key. Keypress will be transmitted as 1200bps IrDA signal, which can be parsed by your computer. .Nm parses the IrDA input signal, and maps the keypress as follows: .Bl -tag -width indent .It right arrow Mouse button 1 (leftmost mouse button). This key will be interpreted by .Xr mgp 1 as "proceed page" request. .It left arrow Mouse button 3 (rightmost mouse button). This key will be interpreted by .Xr mgp 1 as "go back one page" request. .It "f/x" key Currently mouse button 2 (middle mouse button) is mapped to this key. However, this will be changed in the near future. .El .Pp To perform remote-controlled presentation, invoke .Nm simultaneously with .Xr mgp 1 .Po maybe from other terminal window .Pc . .Pp If you specify .Ar dev after .Fl f , the specified device will be used as serial port. With .Fl v , .Nm will generate more messages. .Fl d option is provided just for debugging sessions. .\" .Sh RETURN VALUES The program exits with 0 on success, non-zero on failures. .\" .Sh SEE ALSO .Xr mgp 1 . .Pp MindPath PocketPoint: .Li http://www.mindpath.com/ppoint.htm .\" .Sh HISTORY The .Nm command was implemented by Jun-ichiro Itoh .Li . .Pp This program derives most of its X11 related code from twiddler driver. .Sh BUGS Keycode for "f/x" key should be configurable. BSDI .Xr gettyd 8 support would be desirable. kit/contrib/xwintoppm004075500237450000000000000000001114712475300146045ustar nishidawheelkit/contrib/xwintoppm/.cvsignore010064400237450000000000000000751062427023100166520ustar nishidawheelMakefile Makefile.bak xwintoppm xwintoppm.0 xwintoppm.1.html kit/contrib/xwintoppm/Imakefile010064400237450000000000000011010647077531400164720ustar nishidawheelXCOMM $XConsortium: Imakefile /main/9 1996/01/14 16:53:10 kaleb $ #if defined(ImakeConfigRelease) && ImakeConfigRelease >= 6 /* obeys original xwd */ DEPLIBS = $(DEPXMULIB) $(DEPXLIB) LOCAL_LIBRARIES = $(XMULIB) $(XLIB) #else /* Xt is needed, it seems */ DEPLIBS = $(DEPXMULIB) $(XTOOLLIBDEP) $(DEPXLIB) LOCAL_LIBRARIES = $(XMULIB) $(XTOOLLIB) $(XLIB) #endif SRCS = xwintoppm.c dsimple.c list.c multiVis.c OBJS = xwintoppm.o dsimple.o list.o multiVis.o ComplexProgramTarget(xwintoppm) distclean:: clean -/bin/rm -f Makefile xwintoppm.0 kit/contrib/xwintoppm/README010064400237450000000000000001470647077531500155530ustar nishidawheelThe code is tiny modification over xwd(1), which was in X11R6 xc/programs/xwd. Jun-ichiro itojun Itoh kit/contrib/xwintoppm/dsimple.c010064400237450000000000000330610647077531500164750ustar nishidawheel/* $XConsortium: dsimple.c /main/17 1995/12/07 10:23:27 kaleb $ */ /* $XFree86: xc/programs/xwd/dsimple.c,v 3.0 1996/06/10 09:20:34 dawes Exp $ */ /* Copyright (c) 1993 X Consortium Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. */ #include #include #include #include #include /* * Other_stuff.h: Definitions of routines in other_stuff. * * Written by Mark Lillibridge. Last updated 7/1/87 */ #ifdef X_NOT_STDC_ENV char *malloc(), realloc(); #else #include #endif extern Bool silent; unsigned long Resolve_Color(); Pixmap Bitmap_To_Pixmap(); Window Select_Window(); void out(); void blip(); Window Window_With_Name(); void Fatal_Error(); /* * Just_display: A group of routines designed to make the writting of simple * X11 applications which open a display but do not open * any windows much faster and easier. Unless a routine says * otherwise, it may be assumed to require program_name, dpy, * and screen already defined on entry. * * Written by Mark Lillibridge. Last updated 7/1/87 */ /* This stuff is defined in the calling program by just_display.h */ extern char *program_name; extern Display *dpy; extern int screen; /* * Malloc: like malloc but handles out of memory using Fatal_Error. */ char *Malloc(size) unsigned size; { char *data; if (!(data = malloc(size))) Fatal_Error("Out of memory!"); return(data); } /* * Realloc: like Malloc except for realloc, handles NULL using Malloc. */ char *Realloc(ptr, size) char *ptr; int size; { char *new_ptr; if (!ptr) return(Malloc(size)); if (!(new_ptr = realloc(ptr, size))) Fatal_Error("Out of memory!"); return(new_ptr); } /* * Get_Display_Name (argc, argv) Look for -display, -d, or host:dpy (obselete) * If found, remove it from command line. Don't go past a lone -. */ char *Get_Display_Name(pargc, argv) int *pargc; /* MODIFIED */ char **argv; /* MODIFIED */ { int argc = *pargc; char **pargv = argv+1; char *displayname = NULL; int i; for (i = 1; i < argc; i++) { char *arg = argv[i]; if (!strcmp (arg, "-display") || !strcmp (arg, "-d")) { if (++i >= argc) usage (); displayname = argv[i]; *pargc -= 2; continue; } if (!strcmp(arg,"-")) { while (i Selects window with id . may * be either in decimal or hex. * -name Selects the window with name . * * Call as Select_Window_Args(&argc, argv) in main before * parsing any of your program's command line arguments. * Select_Window_Args will remove its arguments so that * your program does not have to worry about them. * The window returned is the window selected or 0 if * none of the above arguments was present. If 0 is * returned, Select_Window should probably be called after * all command line arguments, and other setup is done. * For examples of usage, see xwininfo, xwd, or xprop. */ Window Select_Window_Args(rargc, argv) int *rargc; char **argv; #define ARGC (*rargc) { int nargc=1; int argc; char **nargv; Window w=0; nargv = argv+1; argc = ARGC; #define OPTION argv[0] #define NXTOPTP ++argv, --argc>0 #define NXTOPT if (++argv, --argc==0) usage() #define COPYOPT nargv++[0]=OPTION, nargc++ while (NXTOPTP) { if (!strcmp(OPTION, "-")) { COPYOPT; while (NXTOPTP) COPYOPT; break; } if (!strcmp(OPTION, "-root")) { w=RootWindow(dpy, screen); continue; } if (!strcmp(OPTION, "-name")) { NXTOPT; w = Window_With_Name(dpy, RootWindow(dpy, screen), OPTION); if (!w) Fatal_Error("No window with name %s exists!",OPTION); continue; } if (!strcmp(OPTION, "-id")) { NXTOPT; w=0; sscanf(OPTION, "0x%lx", &w); if (!w) sscanf(OPTION, "%ld", &w); if (!w) Fatal_Error("Invalid window id format: %s.", OPTION); continue; } COPYOPT; } ARGC = nargc; return(w); } /* * Other_stuff: A group of routines which do common X11 tasks. * * Written by Mark Lillibridge. Last updated 7/1/87 */ extern Display *dpy; extern int screen; /* * Resolve_Color: This routine takes a color name and returns the pixel # * that when used in the window w will be of color name. * (WARNING: The colormap of w MAY be modified! ) * If colors are run out of, only the first n colors will be * as correct as the hardware can make them where n depends * on the display. This routine does not require wind to * be defined. */ unsigned long Resolve_Color(w, name) Window w; char *name; { XColor c; Colormap colormap; XWindowAttributes wind_info; /* * The following is a hack to insure machines without a rgb table * handle at least white & black right. */ if (!strcmp(name, "white")) name="#ffffffffffff"; if (!strcmp(name, "black")) name="#000000000000"; XGetWindowAttributes(dpy, w, &wind_info); colormap = wind_info.colormap; if (!XParseColor(dpy, colormap, name, &c)) Fatal_Error("Bad color format '%s'.", name); if (!XAllocColor(dpy, colormap, &c)) Fatal_Error("XAllocColor failed!"); return(c.pixel); } /* * Bitmap_To_Pixmap: Convert a bitmap to a 2 colored pixmap. The colors come * from the foreground and background colors of the gc. * Width and height are required solely for efficiency. * If needed, they can be obtained via. XGetGeometry. */ Pixmap Bitmap_To_Pixmap(dpy, d, gc, bitmap, width, height) Display *dpy; Drawable d; GC gc; Pixmap bitmap; int width, height; { Pixmap pix; int x; unsigned int i, depth; Drawable root; if (!XGetGeometry(dpy, d, &root, &x, &x, &i, &i, &i, &depth)) return(0); pix = XCreatePixmap(dpy, d, width, height, (int)depth); XCopyPlane(dpy, bitmap, pix, gc, 0, 0, width, height, 0, 0, 1); return(pix); } /* * blip: a debugging routine. Prints Blip! on stderr with flushing. */ void blip() { outl("blip!"); } /* * Routine to let user select a window using the mouse */ Window Select_Window(dpy) Display *dpy; { int status; Cursor cursor; XEvent event; Window target_win = None, root = RootWindow(dpy,screen); int buttons = 0; /* Make the target cursor */ cursor = XCreateFontCursor(dpy, XC_crosshair); /* Grab the pointer using target cursor, letting it room all over */ status = XGrabPointer(dpy, root, False, ButtonPressMask|ButtonReleaseMask, GrabModeSync, GrabModeAsync, root, cursor, CurrentTime); if (status != GrabSuccess) Fatal_Error("Can't grab the mouse."); /* Let the user select a window... */ while ((target_win == None) || (buttons != 0)) { /* allow one more event */ XAllowEvents(dpy, SyncPointer, CurrentTime); XWindowEvent(dpy, root, ButtonPressMask|ButtonReleaseMask, &event); switch (event.type) { case ButtonPress: if (target_win == None) { target_win = event.xbutton.subwindow; /* window selected */ if (target_win == None) target_win = root; } buttons++; break; case ButtonRelease: if (buttons > 0) /* there may have been some down before we started */ buttons--; break; } } XUngrabPointer(dpy, CurrentTime); /* Done with pointer */ return(target_win); } /* * Window_With_Name: routine to locate a window with a given name on a display. * If no window with the given name is found, 0 is returned. * If more than one window has the given name, the first * one found will be returned. Only top and its subwindows * are looked at. Normally, top should be the RootWindow. */ Window Window_With_Name(dpy, top, name) Display *dpy; Window top; char *name; { Window *children, dummy; unsigned int nchildren; int i; Window w=0; char *window_name; if (XFetchName(dpy, top, &window_name) && !strcmp(window_name, name)) return(top); if (!XQueryTree(dpy, top, &dummy, &dummy, &children, &nchildren)) return(0); for (i=0; i|-name ]" /* * Other_stuff.h: Definitions of routines in other_stuff. * * Written by Mark Lillibridge. Last updated 7/1/87 * * Send bugs, etc. to chariot@athena.mit.edu. */ unsigned long Resolve_Color(); Pixmap Bitmap_To_Pixmap(); Window Select_Window(); void out(); void blip(); Window Window_With_Name(); kit/contrib/xwintoppm/list.c010064400237450000000000000207350647077531700160210ustar nishidawheel/* $XConsortium: list.c /main/4 1996/10/14 15:03:56 swick $ */ /* $XFree86: xc/programs/xwd/list.c,v 3.1 1996/12/23 07:14:46 dawes Exp $ */ /** ------------------------------------------------------------------------ This file contains routines for manipulating generic lists. Lists are implemented with a "harness". In other words, each node in the list consists of two pointers, one to the data item and one to the next node in the list. The head of the list is the same struct as each node, but the "item" ptr is used to point to the current member of the list (used by the first_in_list and next_in_list functions). Copyright (c) 1994 Hewlett-Packard Co. Copyright (c) 1996 X Consortium Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. ----------------------------------------------------------------------- **/ #include #ifndef X_NOT_STDC_ENV #include #else char *malloc(); #endif #include "list.h" /** ------------------------------------------------------------------------ Sets the pointers of the specified list to NULL. --------------------------------------------------------------------- **/ #if NeedFunctionPrototypes void zero_list(list_ptr lp) #else void zero_list(lp) list_ptr lp; #endif { lp->next = NULL; lp->ptr.item = NULL; } /** ------------------------------------------------------------------------ Adds item to the list pointed to by lp. Finds the end of the list, then mallocs a new list node onto the end of the list. The item pointer in the new node is set to "item" passed in, and the next pointer in the new node is set to NULL. Returns 1 if successful, 0 if the malloc failed. -------------------------------------------------------------------- **/ #if NeedFunctionPrototypes int add_to_list(list_ptr lp, void *item) #else int add_to_list(lp, item) list_ptr lp; void *item; #endif { while (lp->next) { lp = lp->next; } if ((lp->next = (list_ptr) malloc( sizeof( list_item))) == NULL) { return 0; } lp->next->ptr.item = item; lp->next->next = NULL; return 1; } /** ------------------------------------------------------------------------ Creates a new list and sets its pointers to NULL. Returns a pointer to the new list. -------------------------------------------------------------------- **/ list_ptr new_list () { list_ptr lp; if (lp = (list_ptr) malloc( sizeof( list_item))) { lp->next = NULL; lp->ptr.item = NULL; } return lp; } /** ------------------------------------------------------------------------ Creates a new list head, pointing to the same list as the one passed in. If start_at_curr is TRUE, the new list's first item is the "current" item (as set by calls to first/next_in_list()). If start_at_curr is FALSE, the first item in the new list is the same as the first item in the old list. In either case, the curr pointer in the new list is the same as in the old list. Returns a pointer to the new list head. -------------------------------------------------------------------- **/ #if NeedFunctionPrototypes list_ptr dup_list_head(list_ptr lp, int start_at_curr) #else list_ptr dup_list_head(lp, start_at_curr) list_ptr lp; int start_at_curr; #endif { list_ptr new_list; if ((new_list = (list_ptr) malloc( sizeof( list_item))) == NULL) { return (list_ptr)NULL; } new_list->next = start_at_curr ? lp->ptr.curr : lp->next; new_list->ptr.curr = lp->ptr.curr; return new_list; } /** ------------------------------------------------------------------------ Returns the number of items in the list. -------------------------------------------------------------------- **/ #if NeedFunctionPrototypes unsigned int list_length(list_ptr lp) #else unsigned int list_length(lp) list_ptr lp; #endif { unsigned int count = 0; while (lp->next) { count++; lp = lp->next; } return count; } /** ------------------------------------------------------------------------ Scans thru list, looking for a node whose ptr.item is equal to the "item" passed in. "Equal" here means the same address - no attempt is made to match equivalent values stored in different locations. If a match is found, that node is deleted from the list. Storage for the node is freed, but not for the item itself. Returns a pointer to the item, so the caller can free it if it so desires. If a match is not found, returns NULL. -------------------------------------------------------------------- **/ #if NeedFunctionPrototypes void *delete_from_list(list_ptr lp, void *item) #else void *delete_from_list(lp, item) list_ptr lp; void *item; #endif { list_ptr new_next; while (lp->next) { if (lp->next->ptr.item == item) { new_next = lp->next->next; free (lp->next); lp->next = new_next; return item; } lp = lp->next; } return NULL; } /** ------------------------------------------------------------------------ Deletes each node in the list *except the head*. This allows the deletion of lists where the head is not malloced or created with new_list(). If free_items is true, each item pointed to from the node is freed, in addition to the node itself. -------------------------------------------------------------------- **/ #if NeedFunctionPrototypes void delete_list(list_ptr lp, int free_items) #else void delete_list(lp, free_items) list_ptr lp; int free_items; #endif { list_ptr del_node; void *item; while (lp->next) { del_node = lp->next; item = del_node->ptr.item; lp->next = del_node->next; free (del_node); if (free_items) { free( item); } } } #if NeedFunctionPrototypes void delete_list_destroying(list_ptr lp, void destructor(void *item)) #else void delete_list_destroying(lp, destructor) list_ptr lp; void (*destructor)(); #endif { list_ptr del_node; void *item; while (lp->next) { del_node = lp->next; item = del_node->ptr.item; lp->next = del_node->next; free( del_node); if (destructor) { destructor( item); } } } /** ------------------------------------------------------------------------ Returns a ptr to the first *item* (not list node) in the list. Sets the list head node's curr ptr to the first node in the list. Returns NULL if the list is empty. -------------------------------------------------------------------- **/ #if NeedFunctionPrototypes void * first_in_list(list_ptr lp) #else void * first_in_list(lp) list_ptr lp; #endif { if (! lp) { return NULL; } lp->ptr.curr = lp->next; return lp->ptr.curr ? lp->ptr.curr->ptr.item : NULL; } /** ------------------------------------------------------------------------ Returns a ptr to the next *item* (not list node) in the list. Sets the list head node's curr ptr to the next node in the list. first_in_list must have been called prior. Returns NULL if no next item. -------------------------------------------------------------------- **/ #if NeedFunctionPrototypes void * next_in_list(list_ptr lp) #else void * next_in_list(lp) list_ptr lp; #endif { if (! lp) { return NULL; } if (lp->ptr.curr) { lp->ptr.curr = lp->ptr.curr->next; } return lp->ptr.curr ? lp->ptr.curr->ptr.item : NULL; } #if NeedFunctionPrototypes int list_is_empty(list_ptr lp) #else int list_is_empty(lp) list_ptr lp; #endif { return (lp == NULL || lp->next == NULL); } kit/contrib/xwintoppm/list.h010064400237450000000000000064350647077532000160210ustar nishidawheel/* $XConsortium: list.h /main/4 1996/10/14 15:04:04 swick $ */ /** ------------------------------------------------------------------------ This file contains routines for manipulating generic lists. Lists are implemented with a "harness". In other words, each node in the list consists of two pointers, one to the data item and one to the next node in the list. The head of the list is the same struct as each node, but the "item" ptr is used to point to the current member of the list (used by the first_in_list and next_in_list functions). Copyright (c) 1994 Hewlett-Packard Co. Copyright (c) 1996 X Consortium Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. -------------------------------------------------------------------- **/ #ifndef LIST_DEF #define LIST_DEF #define LESS -1 #define EQUAL 0 #define GREATER 1 #define DUP_WHOLE_LIST 0 #define START_AT_CURR 1 typedef struct _list_item { struct _list_item *next; union { void *item; /* in normal list node, pts to data */ struct _list_item *curr; /* in list head, pts to curr for 1st, next */ } ptr; } list, list_item, *list_ptr; typedef void (*DESTRUCT_FUNC_PTR)( #if NeedFunctionPrototypes void * #endif ); void zero_list( #if NeedFunctionPrototypes list_ptr #endif ); int add_to_list ( #if NeedFunctionPrototypes list_ptr , void * #endif ); list_ptr new_list ( #if NeedFunctionPrototypes void #endif ); list_ptr dup_list_head ( #if NeedFunctionPrototypes list_ptr , int #endif ); unsigned int list_length( #if NeedFunctionPrototypes list_ptr #endif ); void *delete_from_list ( #if NeedFunctionPrototypes list_ptr , void * #endif ); void delete_list( #if NeedFunctionPrototypes list_ptr , int #endif ); void delete_list_destroying ( #if NeedFunctionPrototypes list_ptr , DESTRUCT_FUNC_PTR #endif ); void *first_in_list ( #if NeedFunctionPrototypes list_ptr #endif ); void *next_in_list ( #if NeedFunctionPrototypes list_ptr #endif ); int list_is_empty ( #if NeedFunctionPrototypes list_ptr #endif ); #endif kit/contrib/xwintoppm/multiVis.c010064400237450000000000001203430647077532100166510ustar nishidawheel/* $XConsortium: multiVis.c /main/4 1996/10/14 15:04:08 swick $ */ /** ------------------------------------------------------------------------ This file contains functions to create a list of regions which tile a specified window. Each region contains all visible portions of the window which are drawn with the same visual. If the window consists of subwindows of two different visual types, there will be two regions in the list. The list can be traversed to correctly pull an image of the window using XGetImage or the Image Library. Copyright (c) 1994 Hewlett-Packard Co. Copyright (c) 1996 X Consortium Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. ------------------------------------------------------------------------ **/ #include #include #include #include #include #include "list.h" #include "wsutils.h" #include "multiVis.h" static char *vis_class_str[] = { "StaticGray" , "GrayScale" , "StaticColor", "PseudoColor","TrueColor","DirectColor" } ; /* These structures are copied from X11/region.h. For some reason * they're invisible from the outside. */ typedef struct { short x1, x2, y1, y2; } myBox, myBOX, myBoxRec, *myBoxPtr; typedef struct my_XRegion { long size; long numRects; myBOX *rects; myBOX extents; } myREGION; /* Items in long list of windows that have some part in the grabbed area */ typedef struct { Window win; Visual *vis; Colormap cmap; int x_rootrel, y_rootrel; /* root relative location of window */ int x_vis, y_vis; /* rt rel x,y of vis part, not parent clipped */ int width, height; /* width and height of visible part */ int border_width; /* border width of the window */ Window parent; /* id of parent (for debugging) */ } image_win_type; /* Items in short list of regions that tile the grabbed area. May have multiple windows in the region. */ typedef struct { Window win; /* lowest window of this visual */ Visual *vis; Colormap cmap; int x_rootrel, y_rootrel; /* root relative location of bottom window */ int x_vis, y_vis; /* rt rel x,y of vis part, not parent clipped */ int width, height; /* w & h of visible rect of bottom window */ int border; /* border width of the window */ Region visible_region; } image_region_type; /** ------------------------------------------------------------------------ Returns TRUE if the two structs pointed to have the same "vis" & "cmap" fields and s2 lies completely within s1. s1 and s2 can point to structs of image_win_type or image_region_type. ------------------------------------------------------------------------ **/ #define SAME_REGIONS( s1, s2) \ ((s1)->vis == (s2)->vis && (s1)->cmap == (s2)->cmap && \ (s1)->x_vis <= (s2)->x_vis && \ (s1)->y_vis <= (s2)->y_vis && \ (s1)->x_vis + (s1)->width >= (s2)->x_vis + (s2)->width && \ (s1)->y_vis + (s1)->height >= (s2)->y_vis + (s2)->height) #ifndef MIN #define MIN( a, b) ((a) < (b) ? a : b) #define MAX( a, b) ((a) > (b) ? a : b) #endif #define RED_SHIFT 16 #define GREEN_SHIFT 8 #define BLUE_SHIFT 0 /* extern list_ptr new_list(); extern list_ptr dup_list_head(); extern void * first_in_list(); extern void * next_in_list(); extern int add_to_list(); extern void zero_list(); extern void delete_list(); extern void delete_list_destroying(); extern unsigned int list_length(); */ /* Prototype Declarations for Static Functions */ static int QueryColorMap( #if NeedFunctionPrototypes Display *, Colormap , Visual *, XColor **, int *, int *, int * #endif ); static void TransferImage( #if NeedFunctionPrototypes Display *, XImage *,int, int , image_region_type*, XImage *,int ,int #endif ); static XImage * ReadRegionsInList( #if NeedFunctionPrototypes Display *, Visual *, int ,int ,int , int , XRectangle, list_ptr #endif ); static list_ptr make_region_list( #if NeedFunctionPrototypes Display*, Window, XRectangle*, int*, int, XVisualInfo**, int * #endif ); static void destroy_region_list( #if NeedFunctionPrototypes list_ptr #endif ) ; static void subtr_rect_from_image_region( #if NeedFunctionPrototypes image_region_type *, int , int , int , int #endif ); static void add_rect_to_image_region( #if NeedFunctionPrototypes image_region_type *, int , int , int , int #endif ); static int src_in_region_list( #if NeedFunctionPrototypes image_win_type *, list_ptr #endif ); static void add_window_to_list( #if NeedFunctionPrototypes list_ptr, Window, int, int , int , int , int , int, int, Visual*, Colormap, Window #endif ); static int src_in_image( #if NeedFunctionPrototypes image_win_type *, int , XVisualInfo** #endif ); static int src_in_overlay( #if NeedFunctionPrototypes image_region_type *, int, OverlayInfo *, int*, int* #endif ); /* End of Prototype Declarations */ void initFakeVisual(Vis) Visual *Vis ; { Vis->ext_data=NULL; Vis->class = DirectColor ; Vis->red_mask = 0x00FF0000; Vis->green_mask = 0x0000FF00 ; Vis->blue_mask = 0x000000FF ; Vis->map_entries = 256 ; Vis->bits_per_rgb = 8 ; } static int QueryColorMap(disp,src_cmap,src_vis,src_colors,rShift,gShift,bShift) Display *disp ; Visual *src_vis ; Colormap src_cmap ; XColor **src_colors ; int *rShift, *gShift, *bShift; { int ncolors,i ; unsigned long redMask, greenMask, blueMask, pixel; int redShift, greenShift, blueShift; XColor *colors ; ncolors = src_vis->map_entries ; *src_colors = colors = (XColor *)malloc(ncolors * sizeof(XColor) ) ; if(src_vis->class != TrueColor && src_vis->class != DirectColor) { for(i=0 ; i < ncolors ; i++) { colors[i].pixel = i ; colors[i].pad = 0; colors[i].flags = DoRed|DoGreen|DoBlue; } } else /** src is decomposed rgb ***/ { /* Get the X colormap */ redMask = src_vis->red_mask; greenMask = src_vis->green_mask; blueMask = src_vis->blue_mask; redShift = 0; while (!(redMask&0x1)) { redShift++; redMask = redMask>>1; } greenShift = 0; while (!(greenMask&0x1)) { greenShift++; greenMask = greenMask>>1; } blueShift = 0; while (!(blueMask&0x1)) { blueShift++; blueMask = blueMask>>1; } *rShift = redShift ; *gShift = greenShift ; *bShift = blueShift ; for (i=0; inext && (*vis_regions)->next->next ) || ( *vis_image_regions && (*vis_image_regions)->next && (*vis_image_regions)->next->next ) ) return 1 ; else return 0 ; } static void TransferImage(disp,reg_image,srcw,srch,reg, target_image,dst_x,dst_y) Display *disp; XImage *reg_image,*target_image ; image_region_type *reg; int srcw,srch,dst_x , dst_y ; { int *indexMap,ncolors ; int i,j,old_pixel,new_pixel,red_ind,green_ind,blue_ind ; XColor *colors; int rShift,gShift,bShift; int targetBytesPerLine ; ncolors = QueryColorMap(disp,reg->cmap,reg->vis,&colors, &rShift,&gShift,&bShift) ; targetBytesPerLine = target_image->bytes_per_line; switch (reg->vis->class) { case TrueColor : for(i=0 ; i < srch ; i++) { for(j=0 ; j < srcw ; j++) { old_pixel = XGetPixel(reg_image,j,i) ; if( reg->vis->map_entries == 16) { red_ind = (old_pixel & reg->vis->red_mask) >> rShift ; green_ind = (old_pixel & reg->vis->green_mask) >> gShift ; blue_ind = (old_pixel & reg->vis->blue_mask) >> bShift ; new_pixel = ( ((colors[red_ind].red >> 8) << RED_SHIFT) |((colors[green_ind].green >> 8) << GREEN_SHIFT) |((colors[blue_ind].blue >> 8) << BLUE_SHIFT) ); } else new_pixel = old_pixel; XPutPixel(target_image,dst_x+j, dst_y+i,new_pixel); } } break; case DirectColor : for(i=0 ; i < srch ; i++) { for(j=0 ; j < srcw ; j++) { old_pixel = XGetPixel(reg_image,j,i) ; red_ind = (old_pixel & reg->vis->red_mask) >> rShift ; green_ind = (old_pixel & reg->vis->green_mask) >> gShift ; blue_ind = (old_pixel & reg->vis->blue_mask) >> bShift ; new_pixel = ( ((colors[red_ind].red >> 8) << RED_SHIFT) |((colors[green_ind].green >> 8) << GREEN_SHIFT) |((colors[blue_ind].blue >> 8) << BLUE_SHIFT) ); XPutPixel(target_image,dst_x+j, dst_y+i,new_pixel); } } break; default : for(i=0 ; i < srch ; i++) { for(j=0 ; j < srcw ; j++) { old_pixel = XGetPixel(reg_image,j,i) ; new_pixel = ( ((colors[old_pixel].red >> 8) << RED_SHIFT) |((colors[old_pixel].green >> 8) << GREEN_SHIFT) |((colors[old_pixel].blue >> 8) << BLUE_SHIFT) ); XPutPixel(target_image,dst_x+j, dst_y+i,new_pixel); } } break; } } static XImage * ReadRegionsInList(disp,fakeVis,depth,format,width,height,bbox,regions) Display *disp ; Visual *fakeVis ; int depth , width , height ; int format ; XRectangle bbox; /* bounding box of grabbed area */ list_ptr regions;/* list of regions to read from */ { image_region_type *reg; int dst_x, dst_y; /* where in pixmap to write (UL) */ int diff; int hasNonDefault; int allImage = 0; int transparentColor, transparentType; XImage *reg_image,*ximage ; int srcRect_x,srcRect_y,srcRect_width,srcRect_height ; int rem ; int bytes_per_line; int bitmap_unit; bitmap_unit = sizeof (long); if (format == ZPixmap) bytes_per_line = width*depth/8; else bytes_per_line = width/8; /* Find out how many more bytes are required for padding so that ** bytes per scan line will be multiples of bitmap_unit bits */ if (format == ZPixmap) { rem = (bytes_per_line*8)%bitmap_unit; if (rem) bytes_per_line += (rem/8 + 1); } ximage = XCreateImage(disp,fakeVis,depth,format,0,NULL,width,height, 8,0) ; bytes_per_line = ximage->bytes_per_line; if (format == ZPixmap) ximage->data = malloc(height*bytes_per_line); else ximage->data = malloc(height*bytes_per_line*depth); ximage->bits_per_pixel = depth; /** Valid only if format is ZPixmap ***/ for (reg = (image_region_type *) first_in_list( regions); reg; reg = (image_region_type *) next_in_list( regions)) { int rect; struct my_XRegion *vis_reg; vis_reg = (struct my_XRegion *)(reg->visible_region); for (rect = 0; rect < vis_reg->numRects; rect++) { /** ------------------------------------------------------------------------ Intersect bbox with visible part of region giving src rect & output location. Width is the min right side minus the max left side. Similar for height. Offset src rect so x,y are relative to origin of win, not the root-relative visible rect of win. ------------------------------------------------------------------------ **/ srcRect_width = MIN( vis_reg->rects[rect].x2, bbox.width + bbox.x) - MAX( vis_reg->rects[rect].x1, bbox.x); srcRect_height = MIN( vis_reg->rects[rect].y2, bbox.height + bbox.y) - MAX( vis_reg->rects[rect].y1, bbox.y); diff = bbox.x - vis_reg->rects[rect].x1; srcRect_x = MAX( 0, diff) + (vis_reg->rects[rect].x1 - reg->x_rootrel - reg->border); dst_x = MAX( 0, -diff) ; diff = bbox.y - vis_reg->rects[rect].y1; srcRect_y = MAX( 0, diff) + (vis_reg->rects[rect].y1 - reg->y_rootrel - reg->border); dst_y = MAX( 0, -diff) ; reg_image = XGetImage(disp,reg->win,srcRect_x,srcRect_y, srcRect_width,srcRect_height,AllPlanes,format) ; TransferImage(disp,reg_image,srcRect_width, srcRect_height,reg,ximage,dst_x,dst_y) ; } } return ximage ; } /** ------------------------------------------------------------------------ ------------------------------------------------------------------------ **/ XImage *ReadAreaToImage(disp, srcRootWinid, x, y, width, height, numVisuals,pVisuals,numOverlayVisuals,pOverlayVisuals,numImageVisuals, pImageVisuals,vis_regions,vis_image_regions,format,allImage) Display *disp; Window srcRootWinid; /* root win on which grab was done */ int x; /* root rel UL corner of bounding box of grab */ int y; unsigned int width; /* size of bounding box of grab */ unsigned int height; /** int transparentOverlays; ***/ int numVisuals; XVisualInfo *pVisuals; int numOverlayVisuals; OverlayInfo *pOverlayVisuals; int numImageVisuals; XVisualInfo **pImageVisuals; list_ptr vis_regions; /* list of regions to read from */ list_ptr vis_image_regions ;/* list of regions to read from */ int format; int allImage ; { image_region_type *reg; XRectangle bbox; /* bounding box of grabbed area */ int depth ; XImage *ximage, *ximage_ipm ; Visual fakeVis ; int x1, y1; XImage *image; unsigned char *pmData , *ipmData ; int transparentColor, transparentType; int srcRect_x,srcRect_y,srcRect_width,srcRect_height ; int diff ; int dst_x, dst_y; /* where in pixmap to write (UL) */ int pixel; bbox.x = x; /* init X rect for bounding box */ bbox.y = y; bbox.width = width; bbox.height = height; initFakeVisual(&fakeVis) ; depth = 24 ; ximage = ReadRegionsInList(disp,&fakeVis,depth,format,width,height, bbox,vis_regions) ; pmData = (unsigned char *)ximage -> data ; /* if transparency possible do it again, but this time for image planes only */ if (vis_image_regions && (vis_image_regions->next) && !allImage) { ximage_ipm = ReadRegionsInList(disp,&fakeVis,depth,format,width,height, bbox,vis_image_regions) ; ipmData = (unsigned char *)ximage_ipm -> data ; } /* Now tranverse the overlay visual windows and test for transparency index. */ /* If you find one, subsitute the value from the matching image plane pixmap. */ for (reg = (image_region_type *) first_in_list( vis_regions); reg; reg = (image_region_type *) next_in_list( vis_regions)) { if (src_in_overlay( reg, numOverlayVisuals, pOverlayVisuals, &transparentColor, &transparentType)) { int test = 0 ; srcRect_width = MIN( reg->width + reg->x_vis, bbox.width + bbox.x) - MAX( reg->x_vis, bbox.x); srcRect_height = MIN( reg->height + reg->y_vis, bbox.height + bbox.y) - MAX( reg->y_vis, bbox.y); diff = bbox.x - reg->x_vis; srcRect_x = MAX( 0, diff) + (reg->x_vis - reg->x_rootrel - reg->border); dst_x = MAX( 0, -diff) ; diff = bbox.y - reg->y_vis; srcRect_y = MAX( 0, diff) + (reg->y_vis - reg->y_rootrel - reg->border); dst_y = MAX( 0, -diff) ; /* let's test some pixels for transparency */ image = XGetImage(disp, reg->win, srcRect_x, srcRect_y, srcRect_width, srcRect_height, 0xffffffff, ZPixmap); /* let's assume byte per pixel for overlay image for now */ if ((image->depth == 8) && (transparentType == TransparentPixel)) { unsigned char *pixel_ptr; unsigned char *start_of_line = (unsigned char *) image->data; for (y1 = 0; y1 < srcRect_height; y1++) { pixel_ptr = start_of_line; for (x1 = 0; x1 < srcRect_width; x1++) { if (*pixel_ptr++ == transparentColor) { /* *pmData++ = *ipmData++; *pmData++ = *ipmData++; *pmData++ = *ipmData++; */ pixel = XGetPixel(ximage_ipm,dst_x+x1,dst_y+y1) ; XPutPixel(ximage,dst_x+x1, dst_y+y1,pixel); if(!test){ test = 1 ; } } /* else { pmData +=3; ipmData +=3; } */ } start_of_line += image->bytes_per_line; } } else { if (transparentType == TransparentPixel) { for (y1 = 0; y1 < srcRect_height; y1++) { for (x1 = 0; x1 < srcRect_width; x1++) { int pixel_value = XGetPixel(image, x1, y1); if (pixel_value == transparentColor) { /* *pmData++ = *ipmData++; *pmData++ = *ipmData++; *pmData++ = *ipmData++; */ pixel = XGetPixel(ximage_ipm,dst_x+x1,dst_y+y1) ; XPutPixel(ximage,dst_x+x1, dst_y+y1,pixel); if(!test){ test = 1 ; } } /* else { pmData +=3; ipmData +=3; } */ } } } else { for (y1 = 0; y1 < srcRect_height; y1++) { for (x1 = 0; x1 < srcRect_width; x1++) { int pixel_value = XGetPixel(image, x1, y1); if (pixel_value & transparentColor) { /* *pmData++ = *ipmData++; *pmData++ = *ipmData++; *pmData++ = *ipmData++; */ pixel = XGetPixel(ximage_ipm,dst_x+x1,dst_y+y1) ; XPutPixel(ximage,dst_x+x1, dst_y+y1,pixel); if(!test){ test = 1 ; } } /* else { pmData +=3; ipmData +=3; } */ } } } } XDestroyImage (image); } /* end of src_in_overlay */ } /** end transparency **/ destroy_region_list( vis_regions); if (vis_image_regions) destroy_region_list( vis_image_regions ); FreeXVisualInfo(pVisuals, pOverlayVisuals, pImageVisuals); XSync(disp, 0); return ximage; } /** ------------------------------------------------------------------------ Creates a list of the subwindows of a given window which have a different visual than their parents. The function is recursive. This list is used in make_region_list(), which coalesces the windows with the same visual into a region. image_wins must point to an existing list struct that's already been zeroed (zero_list()). ------------------------------------------------------------------------ **/ static void make_src_list( disp, image_wins, bbox, curr, x_rootrel, y_rootrel, curr_attrs, pclip) Display *disp; list_ptr image_wins; XRectangle *bbox; /* bnding box of area we want */ Window curr; int x_rootrel; /* pos of curr WRT root */ int y_rootrel; XWindowAttributes *curr_attrs; XRectangle *pclip; /* visible part of curr, not */ /* obscurred by ancestors */ { XWindowAttributes child_attrs; Window root, parent, *child; /* variables for XQueryTree() */ Window *save_child_list; /* variables for XQueryTree() */ unsigned int nchild; /* variables for XQueryTree() */ XRectangle child_clip; /* vis part of child */ int curr_clipX, curr_clipY, curr_clipRt, curr_clipBt; /* check that win is mapped & not outside bounding box */ if (curr_attrs->map_state == IsViewable && curr_attrs->class == InputOutput && !( pclip->x >= (int) (bbox->x + bbox->width) || pclip->y >= (int) (bbox->y + bbox->height) || (int) (pclip->x + pclip->width) <= bbox->x || (int) (pclip->y + pclip->height) <= bbox->y)) { XQueryTree( disp, curr, &root, &parent, &child, &nchild ); save_child_list = child; /* so we can free list when we're done */ add_window_to_list( image_wins, curr, x_rootrel, y_rootrel, pclip->x, pclip->y, pclip->width, pclip->height, curr_attrs->border_width,curr_attrs->visual, curr_attrs->colormap, parent); /** ------------------------------------------------------------------------ set RR coords of right (Rt), left (X), bottom (Bt) and top (Y) of rect we clip all children by. This is our own clip rect (pclip) inflicted on us by our parent plus our own borders. Within the child loop, we figure the clip rect for each child by adding in it's rectangle (not taking into account the child's borders). ------------------------------------------------------------------------ **/ curr_clipX = MAX( pclip->x, x_rootrel + (int) curr_attrs->border_width); curr_clipY = MAX( pclip->y, y_rootrel + (int) curr_attrs->border_width); curr_clipRt = MIN( pclip->x + (int) pclip->width, x_rootrel + (int) curr_attrs->width + 2 * (int) curr_attrs->border_width); curr_clipBt = MIN( pclip->y + (int) pclip->height, y_rootrel + (int) curr_attrs->height + 2 * (int) curr_attrs->border_width); while (nchild--) { int new_width, new_height; int child_xrr, child_yrr; /* root relative x & y of child */ XGetWindowAttributes( disp, *child, &child_attrs); /* intersect parent & child clip rects */ child_xrr = x_rootrel + child_attrs.x + curr_attrs->border_width; child_clip.x = MAX( curr_clipX, child_xrr); new_width = MIN( curr_clipRt, child_xrr + (int) child_attrs.width + 2 * child_attrs.border_width) - child_clip.x; if (new_width >= 0) { child_clip.width = new_width; child_yrr = y_rootrel + child_attrs.y + curr_attrs->border_width; child_clip.y = MAX( curr_clipY, child_yrr); new_height = MIN( curr_clipBt, child_yrr + (int) child_attrs.height + 2 * child_attrs.border_width) - child_clip.y; if (new_height >= 0) { child_clip.height = new_height; make_src_list( disp, image_wins, bbox, *child, child_xrr, child_yrr, &child_attrs, &child_clip); } } child++; } XFree( save_child_list); } } /** ------------------------------------------------------------------------ This function creates a list of regions which tile a specified window. Each region contains all visible portions of the window which are drawn with the same visual. For example, if the window consists of subwindows of two different visual types, there will be two regions in the list. Returns a pointer to the list. ------------------------------------------------------------------------ **/ static list_ptr make_region_list( disp, win, bbox, hasNonDefault, numImageVisuals, pImageVisuals, allImage) Display *disp; Window win; XRectangle *bbox; int *hasNonDefault; int numImageVisuals; XVisualInfo **pImageVisuals; int *allImage; { XWindowAttributes win_attrs; list image_wins; list_ptr image_regions; list_ptr srcs_left; image_region_type *new_reg; image_win_type *base_src, *src; Region bbox_region = XCreateRegion(); XRectangle clip; int image_only; int count=0 ; *hasNonDefault = False; XUnionRectWithRegion( bbox, bbox_region, bbox_region); XGetWindowAttributes( disp, win, &win_attrs); zero_list( &image_wins); clip.x = 0; clip.y = 0; clip.width = win_attrs.width; clip.height = win_attrs.height; make_src_list( disp, &image_wins, bbox, win, 0 /* x_rootrel */, 0 /* y_rootrel */, &win_attrs, &clip); image_regions = new_list(); image_only = (*allImage) ? True:False; for (base_src = (image_win_type *) first_in_list( &image_wins); base_src; base_src = (image_win_type *) next_in_list( &image_wins)) { /* test for image visual */ if (!image_only || src_in_image(base_src, numImageVisuals, pImageVisuals)) { /* find a window whose visual hasn't been put in list yet */ if (!src_in_region_list( base_src, image_regions)) { if (! (new_reg = (image_region_type *) malloc( sizeof( image_region_type)))) { return (list_ptr) NULL; } count++; new_reg->visible_region = XCreateRegion(); new_reg->win = base_src->win; new_reg->vis = base_src->vis; new_reg->cmap = base_src->cmap; new_reg->x_rootrel = base_src->x_rootrel; new_reg->y_rootrel = base_src->y_rootrel; new_reg->x_vis = base_src->x_vis; new_reg->y_vis = base_src->y_vis; new_reg->width = base_src->width; new_reg->height = base_src->height; new_reg->border = base_src->border_width; srcs_left = (list_ptr) dup_list_head( &image_wins, START_AT_CURR); for (src = (image_win_type *) first_in_list( srcs_left); src; src = (image_win_type *) next_in_list( srcs_left)) { if (SAME_REGIONS( base_src, src)) { add_rect_to_image_region( new_reg, src->x_vis, src->y_vis, src->width, src->height); } else { if (!image_only || src_in_image(src, numImageVisuals, pImageVisuals)) { subtr_rect_from_image_region( new_reg, src->x_vis, src->y_vis, src->width, src->height); } } } XIntersectRegion( bbox_region, new_reg->visible_region, new_reg->visible_region); if (! XEmptyRegion( new_reg->visible_region)) { add_to_list( image_regions, new_reg); if (new_reg->vis != DefaultVisualOfScreen( win_attrs.screen) || new_reg->cmap != DefaultColormapOfScreen( win_attrs.screen)) { *hasNonDefault = True; } } else { XDestroyRegion( new_reg->visible_region); free( (void *) new_reg); } } } else *allImage = 0; } delete_list( &image_wins, True); XDestroyRegion( bbox_region); return image_regions; } /** ------------------------------------------------------------------------ Destructor called from destroy_region_list(). ------------------------------------------------------------------------ **/ void destroy_image_region( image_region) image_region_type *image_region; { XDestroyRegion( image_region->visible_region); free( (void *) image_region); } /** ------------------------------------------------------------------------ Destroys the region list, destroying all the regions contained in it. ------------------------------------------------------------------------ **/ static void destroy_region_list( rlist) list_ptr rlist; { delete_list_destroying( rlist, (DESTRUCT_FUNC_PTR)destroy_image_region); } /** ------------------------------------------------------------------------ Subtracts the specified rectangle from the region in image_region. First converts the rectangle to a region of its own, since X only provides a way to subtract one region from another, not a rectangle from a region. ------------------------------------------------------------------------ **/ static void subtr_rect_from_image_region( image_region, x, y, width, height) image_region_type *image_region; int x; int y; int width; int height; { XRectangle rect; Region rect_region; rect_region = XCreateRegion(); rect.x = x; rect.y = y; rect.width = width; rect.height = height; XUnionRectWithRegion( &rect, rect_region, rect_region); XSubtractRegion( image_region->visible_region, rect_region, image_region->visible_region); XDestroyRegion( rect_region); } /** ------------------------------------------------------------------------ Adds the specified rectangle to the region in image_region. ------------------------------------------------------------------------ **/ static void add_rect_to_image_region( image_region, x, y, width, height) image_region_type *image_region; int x; int y; int width; int height; { XRectangle rect; rect.x = x; rect.y = y; rect.width = width; rect.height = height; XUnionRectWithRegion( &rect, image_region->visible_region, image_region->visible_region); } /** ------------------------------------------------------------------------ Returns TRUE if the given src's visual is already represented in the image_regions list, FALSE otherwise. ------------------------------------------------------------------------ **/ static int src_in_region_list( src, image_regions) image_win_type *src; list_ptr image_regions; { image_region_type *ir; for (ir = (image_region_type *) first_in_list( image_regions); ir; ir = (image_region_type *) next_in_list( image_regions)) { if (SAME_REGIONS( ir, src)) { return 1; } } return 0; } /** ------------------------------------------------------------------------ Makes a new entry in image_wins with the given fields filled in. ------------------------------------------------------------------------ **/ static void add_window_to_list( image_wins, w, xrr, yrr, x_vis, y_vis, width, height, border_width,vis, cmap, parent) list_ptr image_wins; Window w; int xrr; int yrr; int x_vis; int y_vis; int width; int height; Visual *vis; Colormap cmap; Window parent; { image_win_type *new_src; if ((new_src = (image_win_type *) malloc( sizeof( image_win_type))) == NULL) return; new_src->win = w; new_src->x_rootrel = xrr; new_src->y_rootrel = yrr; new_src->x_vis = x_vis; new_src->y_vis = y_vis; new_src->width = width; new_src->height = height; new_src->border_width = border_width; new_src->vis = vis; new_src->cmap = cmap; new_src->parent = parent; add_to_list( image_wins, new_src); } /** ------------------------------------------------------------------------ Returns TRUE if the given src's visual is in the image planes, FALSE otherwise. ------------------------------------------------------------------------ **/ static int src_in_image( src, numImageVisuals, pImageVisuals) image_win_type *src; int numImageVisuals; XVisualInfo **pImageVisuals; { int i; for (i = 0 ; i < numImageVisuals ; i++) { if (pImageVisuals[i]->visual == src->vis) return 1; } return 0; } /** ------------------------------------------------------------------------ Returns TRUE if the given src's visual is in the overlay planes and transparency is possible, FALSE otherwise. ------------------------------------------------------------------------ **/ static int src_in_overlay( src, numOverlayVisuals, pOverlayVisuals, transparentColor, transparentType) image_region_type *src; int numOverlayVisuals; OverlayInfo *pOverlayVisuals; int *transparentColor; int *transparentType; { int i; for (i = 0 ; i < numOverlayVisuals ; i++) { if (((pOverlayVisuals[i].pOverlayVisualInfo)->visual == src->vis) && (pOverlayVisuals[i].transparentType != None)) { *transparentColor = pOverlayVisuals[i].value; *transparentType = pOverlayVisuals[i].transparentType; return 1; } else { } } return 0; } /********************** from wsutils.c ******************************/ /****************************************************************************** * * This file contains a set of example utility procedures; procedures that can * help a "window-smart" Starbase or PHIGS program determine information about * a device, and create image and overlay plane windows. To use these * utilities, #include "wsutils.h" and compile this file and link the results * with your program. * ******************************************************************************/ #define STATIC_GRAY 0x01 #define GRAY_SCALE 0x02 #define PSEUDO_COLOR 0x04 #define TRUE_COLOR 0x10 #define DIRECT_COLOR 0x11 static int weCreateServerOverlayVisualsProperty = False; /****************************************************************************** * * GetXVisualInfo() * * This routine takes an X11 Display, screen number, and returns whether the * screen supports transparent overlays and three arrays: * * 1) All of the XVisualInfo struct's for the screen. * 2) All of the OverlayInfo struct's for the screen. * 3) An array of pointers to the screen's image plane XVisualInfo * structs. * * The code below obtains the array of all the screen's visuals, and obtains * the array of all the screen's overlay visual information. It then processes * the array of the screen's visuals, determining whether the visual is an * overlay or image visual. * * If the routine sucessfully obtained the visual information, it returns zero. * If the routine didn't obtain the visual information, it returns non-zero. * ******************************************************************************/ int GetXVisualInfo(display, screen, transparentOverlays, numVisuals, pVisuals, numOverlayVisuals, pOverlayVisuals, numImageVisuals, pImageVisuals) Display *display; /* Which X server (aka "display"). */ int screen; /* Which screen of the "display". */ int *transparentOverlays; /* Non-zero if there's at least one * overlay visual and if at least one * of those supports a transparent * pixel. */ int *numVisuals; /* Number of XVisualInfo struct's * pointed to to by pVisuals. */ XVisualInfo **pVisuals; /* All of the device's visuals. */ int *numOverlayVisuals; /* Number of OverlayInfo's pointed * to by pOverlayVisuals. If this * number is zero, the device does * not have overlay planes. */ OverlayInfo **pOverlayVisuals; /* The device's overlay plane visual * information. */ int *numImageVisuals; /* Number of XVisualInfo's pointed * to by pImageVisuals. */ XVisualInfo ***pImageVisuals; /* The device's image visuals. */ { XVisualInfo getVisInfo; /* Paramters of XGetVisualInfo */ int mask; XVisualInfo *pVis, **pIVis; /* Faster, local copies */ OverlayInfo *pOVis; OverlayVisualPropertyRec *pOOldVis; int nVisuals, nOVisuals, nIVisuals; Atom overlayVisualsAtom; /* Parameters for XGetWindowProperty */ Atom actualType; unsigned long numLongs, bytesAfter; int actualFormat; int nImageVisualsAlloced; /* Values to process the XVisualInfo */ int imageVisual; /* array */ /* First, get the list of visuals for this screen. */ getVisInfo.screen = screen; mask = VisualScreenMask; *pVisuals = XGetVisualInfo(display, mask, &getVisInfo, numVisuals); if ((nVisuals = *numVisuals) <= 0) { /* Return that the information wasn't sucessfully obtained: */ return(1); } pVis = *pVisuals; /* Now, get the overlay visual information for this screen. To obtain * this information, get the SERVER_OVERLAY_VISUALS property. */ overlayVisualsAtom = XInternAtom(display, "SERVER_OVERLAY_VISUALS", True); if (overlayVisualsAtom != None) { /* Since the Atom exists, we can request the property's contents. The * do-while loop makes sure we get the entire list from the X server. */ bytesAfter = 0; numLongs = sizeof(OverlayVisualPropertyRec) / 4; do { numLongs += bytesAfter * 4; XGetWindowProperty(display, RootWindow(display, screen), overlayVisualsAtom, 0, numLongs, False, overlayVisualsAtom, &actualType, &actualFormat, &numLongs, &bytesAfter, (unsigned char**) pOverlayVisuals); } while (bytesAfter > 0); /* Calculate the number of overlay visuals in the list. */ *numOverlayVisuals = numLongs / (sizeof(OverlayVisualPropertyRec) / 4); } else { /* This screen doesn't have overlay planes. */ *numOverlayVisuals = 0; *pOverlayVisuals = NULL; *transparentOverlays = 0; } /* Process the pVisuals array. */ *numImageVisuals = 0; nImageVisualsAlloced = 1; pIVis = *pImageVisuals = (XVisualInfo **) malloc(sizeof(XVisualInfo *)); while (--nVisuals >= 0) { nOVisuals = *numOverlayVisuals; pOVis = *pOverlayVisuals; imageVisual = True; while (--nOVisuals >= 0) { pOOldVis = (OverlayVisualPropertyRec *) pOVis; if (pVis->visualid == pOOldVis->visualID) { imageVisual = False; pOVis->pOverlayVisualInfo = pVis; if (pOVis->transparentType == TransparentPixel) *transparentOverlays = 1; } pOVis++; } if (imageVisual) { if ((*numImageVisuals += 1) > nImageVisualsAlloced) { nImageVisualsAlloced++; *pImageVisuals = (XVisualInfo **) realloc(*pImageVisuals, (nImageVisualsAlloced * sizeof(XVisualInfo *))); pIVis = *pImageVisuals + (*numImageVisuals - 1); } *pIVis++ = pVis; } pVis++; } /* Return that the information was sucessfully obtained: */ return(0); } /* GetXVisualInfo() */ /****************************************************************************** * * FreeXVisualInfo() * * This routine frees the data that was allocated by GetXVisualInfo(). * ******************************************************************************/ void FreeXVisualInfo(pVisuals, pOverlayVisuals, pImageVisuals) XVisualInfo *pVisuals; OverlayInfo *pOverlayVisuals; XVisualInfo **pImageVisuals; { XFree(pVisuals); if (weCreateServerOverlayVisualsProperty) free(pOverlayVisuals); else XFree(pOverlayVisuals); free(pImageVisuals); } /* FreeXVisualInfo() */ kit/contrib/xwintoppm/multiVis.h010064400237450000000000000047160647077532200166640ustar nishidawheel/* $XConsortium: multiVis.h /main/4 1996/10/14 15:04:12 swick $ */ /** ------------------------------------------------------------------------ This file contains routines for manipulating generic lists. Lists are implemented with a "harness". In other words, each node in the list consists of two pointers, one to the data item and one to the next node in the list. The head of the list is the same struct as each node, but the "item" ptr is used to point to the current member of the list (used by the first_in_list and next_in_list functions). Copyright (c) 1994 Hewlett-Packard Co. Copyright (c) 1996 X Consortium Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. ------------------------------------------------------------------------ **/ extern int GetMultiVisualRegions( #if NeedFunctionPrototypes Display *, Window, int, int, unsigned int, unsigned int, int *, int *, XVisualInfo **, int *, OverlayInfo **, int *, XVisualInfo ***, list_ptr *, list_ptr *, int * #endif ); extern XImage *ReadAreaToImage( #if NeedFunctionPrototypes Display *, Window, int, int, unsigned int, unsigned int, int, XVisualInfo *, int, OverlayInfo *, int, XVisualInfo **, list_ptr, list_ptr, int, int #endif ); extern void initFakeVisual( #if NeedFunctionPrototypes Visual * #endif ); kit/contrib/xwintoppm/wsutils.h010064400237450000000000000340510647077532300165560ustar nishidawheel/* $XConsortium: wsutils.h /main/3 1996/10/14 15:04:17 swick $ */ /** ------------------------------------------------------------------------ This file contains routines for manipulating generic lists. Lists are implemented with a "harness". In other words, each node in the list consists of two pointers, one to the data item and one to the next node in the list. The head of the list is the same struct as each node, but the "item" ptr is used to point to the current member of the list (used by the first_in_list and next_in_list functions). Copyright (c) 1994 Hewlett-Packard Co. Copyright (c) 1996 X Consortium Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. ------------------------------------------------------------------------ **/ /****************************************************************************** * * This file contains various typedef's, macros and procedure declarations for * a set of example utility procedures contained in the file "wsutils.c". * ******************************************************************************/ /* This is the actual structure returned by the X server describing the * SERVER_OVERLAY_VISUAL property. */ typedef struct { VisualID visualID; /* The VisualID of the overlay visual */ int transparentType; /* Can be None, TransparentPixel or * TransparentMask */ int value; /* Pixel value */ int layer; /* Overlay planes will always be in * layer 1 */ } OverlayVisualPropertyRec; /* This is structure also describes the SERVER_OVERLAY_VISUAL property, but * should be more useful than the one actually returned by the X server * because it actually points to the visual's XVisualInfo struct rather than * refering to the visual's ID. */ typedef struct { XVisualInfo *pOverlayVisualInfo; /* Pointer to the XVisualInfo struct */ int transparentType; /* Can be None, TransparentPixel or * TransparentMask */ int value; /* Pixel value */ int layer; /* Overlay planes will always be in * layer 1 */ } OverlayInfo; /* These macros are the values of the "transparentType" above: */ #ifndef None #define None 0 #endif #ifndef TransparentPixel #define TransparentPixel 1 #endif /* These macros define how flexible a program is when it requests a window's * creation with either the CreateImagePlanesWindow() or * CreateOverlayPlanesWindow(): */ #ifndef NOT_FLEXIBLE #define NOT_FLEXIBLE 0 #define FLEXIBLE 1 #endif /* These macros define the values of the "sbCmapHint" parameter of the * CreateImagePlanesWindow(): */ #ifndef SB_CMAP_TYPE_NORMAL #define SB_CMAP_TYPE_NORMAL 1 #endif #ifndef SB_CMAP_TYPE_MONOTONIC #define SB_CMAP_TYPE_MONOTONIC 2 #endif #ifndef SB_CMAP_TYPE_FULL #define SB_CMAP_TYPE_FULL 4 #endif /****************************************************************************** * * GetXVisualInfo() * * This routine takes an X11 Display, screen number, and returns whether the * screen supports transparent overlays and three arrays: * * 1) All of the XVisualInfo struct's for the screen. * 2) All of the OverlayInfo struct's for the screen. * 3) An array of pointers to the screen's image plane XVisualInfo * structs. * * The code below obtains the array of all the screen's visuals, and obtains * the array of all the screen's overlay visual information. It then processes * the array of the screen's visuals, determining whether the visual is an * overlay or image visual. * * If the routine sucessfully obtained the visual information, it returns zero. * If the routine didn't obtain the visual information, it returns non-zero. * ******************************************************************************/ extern int GetXVisualInfo( #if NeedFunctionPrototypes Display *display, /* Which X server (aka "display"). */ int screen, /* Which screen of the "display". */ int *transparentOverlays, /* Non-zero if there's at least one * overlay visual and if at least one * of those supports a transparent * pixel. */ int *numVisuals, /* Number of XVisualInfo struct's * pointed to to by pVisuals. */ XVisualInfo **pVisuals, /* All of the device's visuals. */ int *numOverlayVisuals, /* Number of OverlayInfo's pointed * to by pOverlayVisuals. If this * number is zero, the device does * not have overlay planes. */ OverlayInfo **pOverlayVisuals, /* The device's overlay plane visual * information. */ int *numImageVisuals, /* Number of XVisualInfo's pointed * to by pImageVisuals. */ XVisualInfo ***pImageVisuals /* The device's image visuals. */ #endif ); /****************************************************************************** * * FreeXVisualInfo() * * This routine frees the data that was allocated by GetXVisualInfo(). * ******************************************************************************/ extern void FreeXVisualInfo( #if NeedFunctionPrototypes XVisualInfo *pVisuals, OverlayInfo *pOverlayVisuals, XVisualInfo **pImageVisuals #endif ); /****************************************************************************** * * FindImagePlanesVisual() * * This routine attempts to find a visual to use to create an image planes * window based upon the information passed in. * * The "Hint" values give guides to the routine as to what the program wants. * The "depthFlexibility" value tells the routine how much the program wants * the actual "depthHint" specified. If the program can't live with the * screen's image planes visuals, the routine returns non-zero, and the * "depthObtained" and "pImageVisualToUse" return parameters are NOT valid. * Otherwise, the "depthObtained" and "pImageVisualToUse" return parameters * are valid and the routine returns zero. * * NOTE: This is just an example of what can be done. It may or may not be * useful for any specific application. * ******************************************************************************/ extern int FindImagePlanesVisual( #if NeedFunctionPrototypes Display *display, /* Which X server (aka "display"). */ int screen, /* Which screen of the "display". */ int numImageVisuals, /* Number of XVisualInfo's pointed * to by pImageVisuals. */ XVisualInfo **pImageVisuals, /* The device's image visuals. */ int sbCmapHint, /* What Starbase cmap modes will be * used with the visual. NOTE: This * is a mask of the possible values. */ int depthHint, /* Desired depth. */ int depthFlexibility, /* How much the actual value in * "depthHint" is desired. */ Visual **pImageVisualToUse, /* The screen's image visual to use. */ int *depthObtained /* Actual depth of the visual. */ #endif ); /****************************************************************************** * * FindOverlayPlanesVisual() * * This routine attempts to find a visual to use to create an overlay planes * window based upon the information passed in. * * While the CreateImagePlanesWindow() routine took a sbCmapHint, this * routine doesn't. Starbase's CMAP_FULL shouldn't be used in overlay planes * windows. This is partially because this functionality is better suited in * the image planes where there are generally more planes, and partially * because the overlay planes generally have PseudoColor visuals with one * color being transparent (the transparent normally being the "white" color * for CMAP_FULL). * * The "depthHint" values give guides to the routine as to what depth the * program wants the window to be. The "depthFlexibility" value tells the * routine how much the program wants the actual "depthHint" specified. If * the program can't live with the screen's overlay planes visuals, the * routine returns non-zero, and the "depthObtained" and "pOverlayVisualToUse" * return parameters are NOT valid. Otherwise, the "depthObtained" and * "pOverlayVisualToUse" return parameters are valid and the routine returns * zero. * * NOTE: This is just an example of what can be done. It may or may not be * useful for any specific application. * ******************************************************************************/ extern int FindOverlayPlanesVisual( #if NeedFunctionPrototypes Display *display, /* Which X server (aka "display"). */ int screen, /* Which screen of the "display". */ int numOverlayVisuals, /* Number of OverlayInfo's pointed * to by pOverlayVisuals. */ OverlayInfo *pOverlayVisuals, /* The device's overlay plane visual * information. */ int depthHint, /* Desired depth. */ int depthFlexibility, /* How much the actual value in * "depthHint" is desired. */ int transparentBackground, /* Non-zero if the visual must have * a transparent color. */ Visual **pOverlayVisualToUse, /* The screen's overlay visual to * use. */ int *depthObtained, /* Actual depth of the visual. */ int *transparentColor /* The transparent color the program * can use with the visual. */ #endif ); /****************************************************************************** * * CreateImagePlanesWindow() * * This routine creates an image planes window, potentially creates a colormap * for the window to use, and sets the window's standard properties, based * upon the information passed in to the routine. While "created," the window * has not been mapped. * * If the routine suceeds, it returns zero and the return parameters * "imageWindow", "imageColormap" and "mustFreeImageColormap" are valid. * Otherwise, the routine returns non-zero and the return parameters are * NOT valid. * * NOTE: This is just an example of what can be done. It may or may not be * useful for any specific application. * ******************************************************************************/ extern int CreateImagePlanesWindow( #if NeedFunctionPrototypes Display *display, /* Which X server (aka "display"). */ int screen, /* Which screen of the "display". */ Window parentWindow, /* Window ID of the parent window for * the created window. */ int windowX, /* Desired X coord. of the window. */ int windowY, /* Desired Y coord of the window. */ int windowWidth, /* Desired width of the window. */ int windowHeight, /* Desired height of the window. */ int windowDepth, /* Desired depth of the window. */ Visual *pImageVisualToUse, /* The window's image planes visual. */ int argc, /* Program's argc parameter. */ char *argv[], /* Program's argv parameter. */ char *windowName, /* Name to put on window's border. */ char *iconName, /* Name to put on window's icon. */ Window *imageWindow, /* Window ID of the created window. */ Colormap *imageColormap, /* The window's colormap. */ int *mustFreeImageColormap /* Non-zero if the program must call * XFreeColormap() for imageColormap. */ #endif ); /****************************************************************************** * * CreateOverlayPlanesWindow() * * This routine creates an overlay planes window, potentially creates a colormap * for the window to use, and sets the window's standard properties, based * upon the information passed in to the routine. While "created," the window * has not been mapped. * * If the routine suceeds, it returns zero and the return parameters * "overlayWindow", "overlayColormap" and "mustFreeOverlayColormap" are valid. * Otherwise, the routine returns non-zero and the return parameters are * NOT valid. * * NOTE: This is just an example of what can be done. It may or may not be * useful for any specific application. * ******************************************************************************/ int CreateOverlayPlanesWindow( #if NeedFunctionPrototypes Display *display, /* Which X server (aka "display"). */ int screen, /* Which screen of the "display". */ Window parentWindow, /* Window ID of the parent window for * the created window. */ int windowX, /* Desired X coord. of the window. */ int windowY, /* Desired Y coord of the window. */ int windowWidth, /* Desired width of the window. */ int windowHeight, /* Desired height of the window. */ int windowDepth, /* Desired depth of the window. */ Visual *pOverlayVisualToUse, /* The window's overlay planes visual.*/ int argc, /* Program's argc parameter. */ char *argv[], /* Program's argv parameter. */ char *windowName, /* Name to put on window's border. */ char *iconName, /* Name to put on window's icon. */ int transparentBackground, /* Non-zero if the window's background * should be a transparent color. */ int *transparentColor, /* The transparent color to use as the * window's background. */ Window *overlayWindow, /* Window ID of the created window. */ Colormap *overlayColormap, /* The window's colormap. */ int *mustFreeOverlayColormap/* Non-zero if the program must call * XFreeColormap() for * overlayColormap. */ #endif ); kit/contrib/xwintoppm/xwintoppm.c010064400237450000000000000467350657071655000171160ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* $XConsortium: xwd.c /main/64 1996/01/14 16:53:13 kaleb $ */ /* $XFree86: xc/programs/xwd/xwd.c,v 3.2 1996/07/08 10:37:37 dawes Exp $ */ /* Copyright (c) 1987 X Consortium Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. */ /* * xwd.c MIT Project Athena, X Window system window raster image dumper. * * This program will dump a raster image of the contents of a window into a * file for output on graphics printers or for other uses. * * Author: Tony Della Fera, DEC * 17-Jun-85 * * Modification history: * * 11/14/86 Bill Wyatt, Smithsonian Astrophysical Observatory * - Removed Z format option, changing it to an XY option. Monochrome * windows will always dump in XY format. Color windows will dump * in Z format by default, but can be dumped in XY format with the * -xy option. * * 11/18/86 Bill Wyatt * - VERSION 6 is same as version 5 for monchrome. For colors, the * appropriate number of Color structs are dumped after the header, * which has the number of colors (=0 for monochrome) in place of the * V5 padding at the end. Up to 16-bit displays are supported. I * don't yet know how 24- to 32-bit displays will be handled under * the Version 11 protocol. * * 6/15/87 David Krikorian, MIT Project Athena * - VERSION 7 runs under the X Version 11 servers, while the previous * versions of xwd were are for X Version 10. This version is based * on xwd version 6, and should eventually have the same color * abilities. (Xwd V7 has yet to be tested on a color machine, so * all color-related code is commented out until color support * becomes practical.) */ /*% *% This is the format for commenting out color-related code until *% color can be supported. %*/ #include #include #include #ifdef X_NOT_STDC_ENV extern int errno; char *calloc(); #else #include #endif #include #include #include typedef unsigned long Pixel; #include "X11/XWDFile.h" #define FEEP_VOLUME 0 /* Include routines to do parsing */ #include "dsimple.h" #include "list.h" #include "wsutils.h" #include "multiVis.h" #ifdef XKB #include #endif /* Setable Options */ int format = ZPixmap; Bool nobdrs = False; Bool on_root = False; Bool standard_out = True; Bool debug = False; Bool silent = False; Bool use_installed = False; long add_pixel_value = 0; extern int (*_XErrorFunction)(); extern int _XDefaultError(); static long parse_long (s) char *s; { char *fmt = "%lu"; long retval = 0L; int thesign = 1; if (s && s[0]) { if (s[0] == '-') s++, thesign = -1; if (s[0] == '0') s++, fmt = "%lo"; if (s[0] == 'x' || s[0] == 'X') s++, fmt = "%lx"; (void) sscanf (s, fmt, &retval); } return (thesign * retval); } main(argc, argv) int argc; char **argv; { register i; Window target_win; FILE *out_file = stdout; Bool frame_only = False; INIT_NAME; Setup_Display_And_Screen(&argc, argv); /* Get window select on command line, if any */ target_win = Select_Window_Args(&argc, argv); for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-nobdrs")) { nobdrs = True; continue; } if (!strcmp(argv[i], "-debug")) { debug = True; continue; } if (!strcmp(argv[i], "-help")) usage(); if (!strcmp(argv[i], "-out")) { if (++i >= argc) usage(); if (!(out_file = fopen(argv[i], "wb"))) Error("Can't open output file as specified."); standard_out = False; continue; } if (!strcmp(argv[i], "-xy")) { format = XYPixmap; continue; } if (!strcmp(argv[i], "-screen")) { on_root = True; continue; } if (!strcmp(argv[i], "-icmap")) { use_installed = True; continue; } if (!strcmp(argv[i], "-add")) { if (++i >= argc) usage(); add_pixel_value = parse_long (argv[i]); continue; } if (!strcmp(argv[i], "-frame")) { frame_only = True; continue; } if (!strcmp(argv[i], "-silent")) { silent = True; continue; } usage(); } #ifdef WIN32 if (standard_out) _setmode(fileno(out_file), _O_BINARY); #endif /* * Let the user select the target window. */ if (!target_win) { #if 0 target_win = Select_Window(dpy); if (target_win != None && !frame_only) { Window root; int dummyi; unsigned int dummy; if (XGetGeometry (dpy, target_win, &root, &dummyi, &dummyi, &dummy, &dummy, &dummy, &dummy) && target_win != root) target_win = XmuClientWindow (dpy, target_win); } #else fprintf(stderr, "window must be specified\n"); exit(1); #endif } /* * Dump it! */ Window_Dump(target_win, out_file); XCloseDisplay(dpy); if (fclose(out_file)) { perror("xwintoppm"); exit(1); } exit(0); } static int Get24bitDirectColors(colors) XColor **colors ; { int i , ncolors = 256 ; XColor *tcol ; *colors = tcol = (XColor *)malloc(sizeof(XColor) * ncolors) ; for(i=0 ; i < ncolors ; i++) { tcol[i].pixel = i << 16 | i << 8 | i ; tcol[i].red = tcol[i].green = tcol[i].blue = i << 8 | i ; } return ncolors ; } /* * Window_Dump: dump a window to a file which must already be open for * writting. */ Window_Dump(window, out) Window window; FILE *out; { unsigned long swaptest = 1; XColor *colors; unsigned buffer_size; int win_name_size; int header_size; int ncolors, i; char *win_name; Bool got_win_name; XWindowAttributes win_info; XImage *image; int absx, absy, x, y; unsigned width, height; int dwidth, dheight; int bw; Window dummywin; XWDFileHeader header; XWDColor xwdcolor; int transparentOverlays , multiVis; int numVisuals; XVisualInfo *pVisuals; int numOverlayVisuals; OverlayInfo *pOverlayVisuals; int numImageVisuals; XVisualInfo **pImageVisuals; list_ptr vis_regions; /* list of regions to read from */ list_ptr vis_image_regions ; Colormap cmap ; Visual vis_h,*vis ; int allImage = 0 ; /* * Inform the user not to alter the screen. */ if (!silent) { #ifdef XKB XkbStdBell(dpy,None,50,XkbBI_Wait); #else XBell(dpy,FEEP_VOLUME); #endif XFlush(dpy); } /* * Get the parameters of the window being dumped. */ if (debug) outl("xwintoppm: Getting target window information.\n"); if(!XGetWindowAttributes(dpy, window, &win_info)) Fatal_Error("Can't get target window attributes."); /* handle any frame window */ if (!XTranslateCoordinates (dpy, window, RootWindow (dpy, screen), 0, 0, &absx, &absy, &dummywin)) { fprintf (stderr, "%s: unable to translate window coordinates (%d,%d)\n", program_name, absx, absy); exit (1); } win_info.x = absx; win_info.y = absy; width = win_info.width; height = win_info.height; bw = 0; if (!nobdrs) { absx -= win_info.border_width; absy -= win_info.border_width; bw = win_info.border_width; width += (2 * bw); height += (2 * bw); } dwidth = DisplayWidth (dpy, screen); dheight = DisplayHeight (dpy, screen); /* clip to window */ if (absx < 0) width += absx, absx = 0; if (absy < 0) height += absy, absy = 0; if (absx + width > dwidth) width = dwidth - absx; if (absy + height > dheight) height = dheight - absy; XFetchName(dpy, window, &win_name); if (!win_name || !win_name[0]) { win_name = "xwdump"; got_win_name = False; } else { got_win_name = True; } /* sizeof(char) is included for the null string terminator. */ win_name_size = strlen(win_name) + sizeof(char); /* * Snarf the pixmap with XGetImage. */ x = absx - win_info.x; y = absy - win_info.y; multiVis = GetMultiVisualRegions(dpy,RootWindow(dpy, screen), absx, absy, width, height,&transparentOverlays,&numVisuals, &pVisuals, &numOverlayVisuals,&pOverlayVisuals,&numImageVisuals, &pImageVisuals,&vis_regions,&vis_image_regions,&allImage) ; if (on_root || multiVis) { if(!multiVis) image = XGetImage (dpy, RootWindow(dpy, screen), absx, absy, width, height, AllPlanes, format); else image = ReadAreaToImage(dpy, RootWindow(dpy, screen), absx, absy, width, height, numVisuals,pVisuals,numOverlayVisuals,pOverlayVisuals, numImageVisuals, pImageVisuals,vis_regions, vis_image_regions,format,allImage); } else image = XGetImage (dpy, window, x, y, width, height, AllPlanes, format); if (!image) { fprintf (stderr, "%s: unable to get image at %dx%d+%d+%d\n", program_name, width, height, x, y); exit (1); } if (add_pixel_value != 0) XAddPixel (image, add_pixel_value); /* * Determine the pixmap size. */ buffer_size = Image_Size(image); if (debug) outl("xwintoppm: Getting Colors.\n"); if( !multiVis) { ncolors = Get_XColors(&win_info, &colors); vis = win_info.visual ; } else { ncolors = Get24bitDirectColors(&colors) ; initFakeVisual(&vis_h) ; vis = &vis_h ; } /* * Inform the user that the image has been retrieved. */ if (!silent) { #ifdef XKB XkbStdBell(dpy,window,FEEP_VOLUME,XkbBI_Proceed); XkbStdBell(dpy,window,FEEP_VOLUME,XkbBI_RepeatingLastBell); #else XBell(dpy, FEEP_VOLUME); XBell(dpy, FEEP_VOLUME); #endif XFlush(dpy); } /* * Calculate header size. */ if (debug) outl("xwintoppm: Calculating header size.\n"); header_size = SIZEOF(XWDheader) + win_name_size; #if 0 /* * Write out header information. */ if (debug) outl("xwintoppm: Constructing and dumping file header.\n"); header.header_size = (CARD32) header_size; header.file_version = (CARD32) XWD_FILE_VERSION; header.pixmap_format = (CARD32) format; header.pixmap_depth = (CARD32) image->depth; header.pixmap_width = (CARD32) image->width; header.pixmap_height = (CARD32) image->height; header.xoffset = (CARD32) image->xoffset; header.byte_order = (CARD32) image->byte_order; header.bitmap_unit = (CARD32) image->bitmap_unit; header.bitmap_bit_order = (CARD32) image->bitmap_bit_order; header.bitmap_pad = (CARD32) image->bitmap_pad; header.bits_per_pixel = (CARD32) image->bits_per_pixel; header.bytes_per_line = (CARD32) image->bytes_per_line; /**** header.visual_class = (CARD32) win_info.visual->class; header.red_mask = (CARD32) win_info.visual->red_mask; header.green_mask = (CARD32) win_info.visual->green_mask; header.blue_mask = (CARD32) win_info.visual->blue_mask; header.bits_per_rgb = (CARD32) win_info.visual->bits_per_rgb; header.colormap_entries = (CARD32) win_info.visual->map_entries; *****/ header.visual_class = (CARD32) vis->class; header.red_mask = (CARD32) vis->red_mask; header.green_mask = (CARD32) vis->green_mask; header.blue_mask = (CARD32) vis->blue_mask; header.bits_per_rgb = (CARD32) vis->bits_per_rgb; header.colormap_entries = (CARD32) vis->map_entries; header.ncolors = ncolors; header.window_width = (CARD32) win_info.width; header.window_height = (CARD32) win_info.height; header.window_x = absx; header.window_y = absy; header.window_bdrwidth = (CARD32) win_info.border_width; if (*(char *) &swaptest) { _swaplong((char *) &header, sizeof(header)); for (i = 0; i < ncolors; i++) { _swaplong((char *) &colors[i].pixel, sizeof(long)); _swapshort((char *) &colors[i].red, 3 * sizeof(short)); } } if (fwrite((char *)&header, SIZEOF(XWDheader), 1, out) != 1 || fwrite(win_name, win_name_size, 1, out) != 1) { perror("xwintoppm"); exit(1); } #else fprintf(out, "P6\n%d %d %d\n", win_info.width, win_info.height, 255); #endif #if 0 /* * Write out the color maps, if any */ if (debug) outl("xwintoppm: Dumping %d colors.\n", ncolors); for (i = 0; i < ncolors; i++) { xwdcolor.pixel = colors[i].pixel; xwdcolor.red = colors[i].red; xwdcolor.green = colors[i].green; xwdcolor.blue = colors[i].blue; xwdcolor.flags = colors[i].flags; if (fwrite((char *) &xwdcolor, SIZEOF(XWDColor), 1, out) != 1) { perror("xwd"); exit(1); } } #endif /* * Write out the buffer. */ if (debug) outl("xwintoppm: Dumping pixmap. bufsize=%d\n",buffer_size); #if 0 /* * This copying of the bit stream (data) to a file is to be replaced * by an Xlib call which hasn't been written yet. It is not clear * what other functions of xwd will be taken over by this (as yet) * non-existant X function. */ if (fwrite(image->data, (int) buffer_size, 1, out) != 1) { perror("xwd"); exit(1); } #else { int x, y; int i; unsigned long pixel; unsigned char buf[3]; unsigned long mask[3]; unsigned int shift0[3], shift8[3]; mask[0] = image->red_mask; mask[1] = image->green_mask; mask[2] = image->blue_mask; if (!mask[0] || !mask[1] || !mask[2]) { fprintf(stderr, "unsupported screen depth; bailing out\n"); exit(1); } for (i = 0; i < 3; i++) { shift0[i] = 0; while (!(mask[i] & (1 << shift0[i]))) shift0[i]++; shift8[i] = shift0[i]; while (mask[i] & (1 << shift8[i])) shift8[i]++; shift8[i] = 8 - (shift8[i] - shift0[i]); } for (y = 0; y < win_info.height; y++) { for (x = 0; x < win_info.width; x++) { pixel = (*image->f.get_pixel)(image, x, y); #if 0 if (ncolors && pixel < ncolors) { buf[0] = colors[pixel].red; buf[1] = colors[pixel].green; buf[2] = colors[pixel].blue; } else #endif { buf[0] = (pixel & mask[0]) >> shift0[0] << shift8[0]; buf[1] = (pixel & mask[1]) >> shift0[1] << shift8[1]; buf[2] = (pixel & mask[2]) >> shift0[2] << shift8[2]; } fwrite(buf, 3, 1, out); } } } #endif /* * free the color buffer. */ if(debug && ncolors > 0) outl("xwd: Freeing colors.\n"); if(ncolors > 0) free(colors); /* * Free window name string. */ if (debug) outl("xwd: Freeing window name string.\n"); if (got_win_name) XFree(win_name); /* * Free image */ XDestroyImage(image); } /* * Report the syntax for calling xwd. */ usage() { fprintf (stderr, "usage: %s [-display host:dpy] [-debug] [-help] %s [-nobdrs] [-out ]", program_name, SELECT_USAGE); fprintf (stderr, " [-xy] [-add value] [-frame]\n"); exit(1); } /* * Error - Fatal xwd error. */ Error(string) char *string; /* Error description string. */ { outl("\nxwd: Error => %s\n", string); if (errno != 0) { perror("xwd"); outl("\n"); } exit(1); } /* * Determine the pixmap size. */ int Image_Size(image) XImage *image; { if (image->format != ZPixmap) return(image->bytes_per_line * image->height * image->depth); return(image->bytes_per_line * image->height); } #define lowbit(x) ((x) & (~(x) + 1)) static int ReadColors(vis,cmap,colors) Visual *vis ; Colormap cmap ; XColor **colors ; { int i,ncolors ; ncolors = vis->map_entries; if (!(*colors = (XColor *) malloc (sizeof(XColor) * ncolors))) Fatal_Error("Out of memory!"); if (vis->class == DirectColor || vis->class == TrueColor) { Pixel red, green, blue, red1, green1, blue1; red = green = blue = 0; red1 = lowbit(vis->red_mask); green1 = lowbit(vis->green_mask); blue1 = lowbit(vis->blue_mask); for (i=0; i vis->red_mask) red = 0; green += green1; if (green > vis->green_mask) green = 0; blue += blue1; if (blue > vis->blue_mask) blue = 0; } } else { for (i=0; icolormap; if (use_installed) /* assume the visual will be OK ... */ cmap = XListInstalledColormaps(dpy, win_info->root, &i)[0]; if (!cmap) return(0); ncolors = ReadColors(win_info->visual,cmap,colors) ; return ncolors ; } _swapshort (bp, n) register char *bp; register unsigned n; { register char c; register char *ep = bp + n; while (bp < ep) { c = *bp; *bp = *(bp + 1); bp++; *bp++ = c; } } _swaplong (bp, n) register char *bp; register unsigned n; { register char c; register char *ep = bp + n; register char *sp; while (bp < ep) { sp = bp + 3; c = *sp; *sp = *bp; *bp++ = c; sp = bp + 1; c = *sp; *sp = *bp; *bp++ = c; bp += 2; } } kit/contrib/xwintoppm/xwintoppm.man010064400237450000000000000114660647077532500174440ustar nishidawheel.\" $XConsortium: xwd.man /main/21 1996/12/09 17:11:08 kaleb $ .\" Copyright (c) 1988, 1994 X Consortium .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the .\" "Software"), to deal in the Software without restriction, including .\" without limitation the rights to use, copy, modify, merge, publish, .\" distribute, sublicense, and/or sell copies of the Software, and to .\" permit persons to whom the Software is furnished to do so, subject to .\" the following conditions: .\" .\" The above copyright notice and this permission notice shall be included .\" in all copies or substantial portions of the Software. .\" .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR .\" OTHER DEALINGS IN THE SOFTWARE. .\" .\" Except as contained in this notice, the name of the X Consortium shall .\" not be used in advertising or otherwise to promote the sale, use or .\" other dealings in this Software without prior written authorization .\" from the X Consortium. .TH XWD 1 "Release 6.3" "X Version 11" .SH NAME xwintoppm - dump an image of an X window .SH SYNOPSIS .B "xwintoppm" [-debug] [-help] [-nobdrs] [-out \fIfile\fP] [-xy] [-frame] [-add \fIvalue\fP] [-root | -id \fIid\fP | -name \fIname\fP ] [-icmap] [-screen] [-display \fIdisplay\fP] .SH DESCRIPTION .PP .I Xwintoppm is an X Window System window dumping utility. .I Xwintoppm allows X users to store window images in .I ppm(5) format. This file can then be read by various other X utilities for redisplay, printing, editing, formatting, archiving, image processing, etc. .\"The target window is selected by clicking the pointer in the desired window. .\"The keyboard bell is rung once at the beginning of the dump and twice when .\"the dump is completed. .SH OPTIONS .PP .TP 8 .B "-display \fIdisplay\fP" This argument allows you to specify the server to connect to; see \fIX(1)\fP. .PP .TP 8 .B "-help" Print out the `Usage:' command syntax summary. .PP .TP 8 .B "-nobdrs" This argument specifies that the window dump should not include the pixels that compose the X window border. This is useful in situations where you may wish to include the window contents in a document as an illustration. .PP .TP 8 .B "-out \fIfile\fP" This argument allows the user to explicitly specify the output file on the command line. The default is to output to standard out. .PP .TP 8 .B "-xy" This option applies to color displays only. It selects `XY' format dumping instead of the default `Z' format. .PP .TP 8 .B "-add \fIvalue\fP" This option specifies an signed value to be added to every pixel. .PP .TP 8 .B "-frame" This option indicates that the window manager frame should be included when manually selecting a window. .PP .TP 8 .B "-root" This option indicates that the root window should be selected for the window dump, without requiring the user to select a window with the pointer. .PP .TP 8 .B "-id \fIid\fP" This option indicates that the window with the specified resource id should be selected for the window dump, without requiring the user to select a window with the pointer. .PP .TP 8 .B "-name \fIname\fP" This option indicates that the window with the specified WM_NAME property should be selected for the window dump, without requiring the user to select a window with the pointer. .PP .TP 8 .B "-icmap" Normally the colormap of the chosen window is used to obtain RGB values. This option forces the first installed colormap of the screen to be used instead. .PP .TP 8 .B "-screen" This option indicates that the GetImage request used to obtain the image should be done on the root window, rather than directly on the specified window. In this way, you can obtain pieces of other windows that overlap the specified window, and more importantly, you can capture menus or other popups that are independent windows but appear over the specified window. .PP .TP 8 .B "-silent" Operate silently, i.e. don't ring any bells before and after dumping the window. .SH ENVIRONMENT .PP .TP 8 .B DISPLAY To get default host and display number. .\".SH FILES .\".PP .\".TP 8 .\".B XWDFile.h .\"X Window Dump File format definition file. .SH SEE ALSO xwd(1), xwud(1), xpr(1), X(1), ppm(5). .SH ORIGINAL AUTHORS Tony Della Fera, Digital Equipment Corp., MIT Project Athena .br William F. Wyatt, Smithsonian Astrophysical Observatory .PP .I Xwintoppm is an tiny modification to .I Xwd program which is distributed with X11 kit. .SH MODIFICATIONS Jun-ichiro itojun Itoh, WIDE Project kit/image004075500237450000000000000000001114712475300121615ustar nishidawheelkit/image/.cvsignore010064400237450000000000000000230642525601500142300ustar nishidawheelImakefile Makefile kit/image/Imakefile.in010064400237450000000000000031361074613274700144640ustar nishidawheelTARGET0= mgpimage TARGET= lib$(TARGET0).a #if @USE_IMLIB@ SRCS= imagetypes.c send.c zio.c zoom.c new.c compress.c reduce.c\ value.c misc.c rotate.c rle.c rlelib.c smooth.c halftone.c clip.c\ dither.c path.c bright.c window.c imlib_loader.c OBJS= imagetypes.o send.o zio.o zoom.o new.o compress.o reduce.o\ value.o misc.o rotate.o rle.o rlelib.o smooth.o halftone.o clip.o\ dither.o path.o bright.o window.o imlib_loader.o #else SRCS= imagetypes.c gif.c send.c zio.c zoom.c new.c compress.c reduce.c\ value.c misc.c rotate.c rle.c rlelib.c smooth.c halftone.c clip.c\ dither.c xbitmap.c xpixmap.c pbm.c pcx.c xwd.c mac.c jpeg.c g3.c\ path.c sunraster.c mcidas.c fbm.c faces.c cmuwmraster.c bright.c\ img.c mc_tables.c window.c png.c OBJS= imagetypes.o gif.o send.o zio.o zoom.o new.o compress.o reduce.o\ value.o misc.o rotate.o rle.o rlelib.o smooth.o halftone.o clip.o\ dither.o xbitmap.o xpixmap.o pbm.o pcx.o xwd.o mac.o jpeg.o g3.o\ path.o sunraster.o mcidas.o fbm.o faces.o cmuwmraster.o bright.o\ img.o mc_tables.o window.o png.o #endif DEFS= @DEFS@ OPTFLAGS=@OPTFLAGS@ ${CPPFLAGS} AllTarget($(TARGET)) DependTarget() SpecialObjectRule(window.o,window.c,$(DEFS) $(OPTFLAGS)) SpecialObjectRule(gif.o,gif.c,$(DEFS) $(OPTFLAGS)) SpecialObjectRule(imagetypes.o,imagetypes.c,$(DEFS)) SpecialObjectRule(png.o,png.c,$(DEFS) $(OPTFLAGS)) SpecialObjectRule(send.o,send.c,$(DEFS) $(OPTFLAGS)) SpecialObjectRule(imlib_loader.o,imlib_loader.c,$(DEFS) $(OPTFLAGS)) #ifndef NullParameter #define NullParameter #endif NormalLibraryTarget($(TARGET0), $(OBJS)) distclean:: clean -/bin/rm -f Imakefile Makefile /*EOF*/ kit/image/bright.c010064400237450000000000000146010664163773500136760ustar nishidawheel/* bright.c * * miscellaneous colormap altering functions * * jim frost 10.10.89 * * Copyright 1989, 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "image.h" extern void make_gamma(double gamma, int gammamap[]); /* alter an image's brightness by a given percentage */ void brighten(image, percent, verbose) Image *image; unsigned int percent; unsigned int verbose; { int a; unsigned int newrgb; float fperc; unsigned int size; byte *destptr; goodImage(image, "brighten"); if (BITMAPP(image)) /* we're AT&T */ return; if (verbose) { fprintf(stderr, " Brightening colormap by %d%%...", percent); fflush(stderr); } fperc= (float)percent / 100.0; switch (image->type) { case IRGB: for (a= 0; a < image->rgb.used; a++) { newrgb= *(image->rgb.red + a) * fperc; if (newrgb > 65535) newrgb= 65535; *(image->rgb.red + a)= newrgb; newrgb= *(image->rgb.green + a) * fperc; if (newrgb > 65535) newrgb= 65535; *(image->rgb.green + a)= newrgb; newrgb= *(image->rgb.blue + a) * fperc; if (newrgb > 65535) newrgb= 65535; *(image->rgb.blue + a)= newrgb; } break; case ITRUE: size= image->width * image->height * 3; destptr= image->data; for (a= 0; a < size; a++) { newrgb= *destptr * fperc; if (newrgb > 255) newrgb= 255; *(destptr++)= newrgb; } break; } if (verbose) fprintf(stderr, "done\n"); } void gammacorrect(image, disp_gam, verbose) Image *image; float disp_gam; unsigned int verbose; { int a; int gammamap[256]; unsigned int size; byte *destptr; goodImage(image, "gammacorrect"); if (BITMAPP(image)) /* we're AT&T */ return; if (verbose) { fprintf(stderr, " Adjusting colormap for display gamma of %4.2f...", disp_gam); fflush(stderr); } make_gamma(disp_gam,gammamap); switch (image->type) { case IRGB: for (a= 0; a < image->rgb.used; a++) { *(image->rgb.red + a)= gammamap[(*(image->rgb.red + a))>>8]<<8; *(image->rgb.green + a)= gammamap[(*(image->rgb.green + a))>>8]<<8; *(image->rgb.blue + a)= gammamap[(*(image->rgb.blue + a))>>8]<<8; } break; case ITRUE: size= image->width * image->height * 3; destptr= image->data; for (a= 0; a < size; a++) { *destptr= gammamap[*destptr]; destptr++; } break; } if (verbose) fprintf(stderr, "done\n"); } /* this initializes a lookup table for doing normalization */ static void setupNormalizationArray(min, max, array, verbose) unsigned int min, max; byte *array; unsigned int verbose; { int a; unsigned int new; float factor; if (verbose) { fprintf(stderr, "scaling %d:%d to 0:255...", min, max); fflush(stderr); } factor= 256.0 / (max - min); for (a= min; a <= max; a++) { new= (float)(a - min) * factor; array[a]= (new > 255 ? 255 : new); } } /* normalize an image. */ Image *normalize(image, verbose) Image *image; unsigned int verbose; { unsigned int a, x, y; unsigned int min, max; Pixel pixval; Image *newimage=NULL; byte *srcptr, *destptr; byte array[256]; goodImage(image, "normalize"); if (BITMAPP(image)) return(image); if (verbose) { fprintf(stderr, " Normalizing..."); fflush(stderr); } switch (image->type) { case IRGB: min= 256; max = 0; for (a= 0; a < image->rgb.used; a++) { byte red, green, blue; red= image->rgb.red[a] >> 8; green= image->rgb.green[a] >> 8; blue= image->rgb.blue[a] >> 8; if (red < min) min= red; if (red > max) max= red; if (green < min) min= green; if (green > max) max= green; if (blue < min) min= blue; if (blue > max) max= blue; } setupNormalizationArray(min, max, array, verbose); newimage= newTrueImage(image->width, image->height); if (image->title) { newimage->title = (char *)lmalloc(strlen(image->title) + 14); sprintf(newimage->title, "%s (normalized)", image->title); } srcptr= image->data; destptr= newimage->data; for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { pixval= memToVal(srcptr, image->pixlen); *destptr= array[image->rgb.red[pixval] >> 8]; (*destptr)++; *destptr= array[image->rgb.green[pixval] >> 8]; (*destptr)++; *destptr= array[image->rgb.blue[pixval] >> 8]; (*destptr)++; srcptr += image->pixlen; } break; case ITRUE: srcptr= image->data; min= 255; max= 0; for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { if (*srcptr < min) min= *srcptr; if (*srcptr > max) max= *srcptr; srcptr++; if (*srcptr < min) min= *srcptr; if (*srcptr > max) max= *srcptr; srcptr++; if (*srcptr < min) min= *srcptr; if (*srcptr > max) max= *srcptr; srcptr++; } setupNormalizationArray(min, max, array, verbose); srcptr= image->data; for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { *srcptr= array[*srcptr]; srcptr++; *srcptr= array[*srcptr]; srcptr++; *srcptr= array[*srcptr]; srcptr++; } newimage= image; } if (verbose) fprintf(stderr, "done\n"); return(newimage); } /* convert to grayscale */ void gray(image, verbose) Image *image; { int a; unsigned int size; Intensity intensity, red, green, blue; byte *destptr; goodImage(image, "gray"); if (BITMAPP(image)) return; if (verbose) { fprintf(stderr, " Converting image to grayscale..."); fflush(stderr); } switch (image->type) { case IRGB: for (a= 0; a < image->rgb.used; a++) { intensity= colorIntensity(image->rgb.red[a], image->rgb.green[a], image->rgb.blue[a]); image->rgb.red[a]= intensity; image->rgb.green[a]= intensity; image->rgb.blue[a]= intensity; } break; case ITRUE: size= image->width * image->height; destptr= image->data; for (a= 0; a < size; a++) { red= *destptr << 8; green= *(destptr + 1) << 8; blue= *(destptr + 2) << 8; intensity= colorIntensity(red, green, blue) >> 8; *(destptr++)= intensity; /* red */ *(destptr++)= intensity; /* green */ *(destptr++)= intensity; /* blue */ } break; } if (verbose) fprintf(stderr, "done\n"); } kit/image/clip.c010064400237450000000000000055340664163773600133540ustar nishidawheel/* clip.c: * * return a new image which is a clipped subsection of the old image * * jim frost 10.04.89 * * Copyright 1989, 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "image.h" Image *clip(simage, clipx, clipy, clipw, cliph, verbose) Image *simage; unsigned int clipx, clipy, clipw, cliph; unsigned int verbose; { Image *image=NULL; unsigned int x, y; unsigned int slinelen, dlinelen; unsigned int start; byte startmask, smask, dmask; byte *sp, *sline, *dp, *dline; goodImage(simage, "clip"); if (verbose) { fprintf(stderr, " Clipping image..."); fflush(stderr); } /* sane-ify clip area with respect to image */ if (clipx + clipw > simage->width) clipw -= (simage->width - (clipx + clipw)); if (clipy + cliph > simage->height) cliph -= (simage->height - (clipy + cliph)); switch (simage->type) { case IBITMAP: /* this could be sped up; i don't care */ image= newBitImage(clipw, cliph); for (x= 0; x < simage->rgb.used; x++) { *(image->rgb.red + x)= *(simage->rgb.red + x); *(image->rgb.green + x)= *(simage->rgb.green + x); *(image->rgb.blue + x)= *(simage->rgb.blue + x); } slinelen= (simage->width / 8) + (simage->width % 8 ? 1 : 0); dlinelen= (clipw / 8) + (clipw % 8 ? 1 : 0); start= clipx / 8; startmask= 0x80 >> (clipx % 8); sline= simage->data + (slinelen * clipy); dline= image->data; for (y= 0; y < cliph; y++) { sp= sline + start; dp= dline; smask= startmask; dmask= 0x80; for (x= 0; x < clipw; x++) { if (*sp & smask) *dp |= dmask; if (! (smask >>= 1)) { smask= 0x80; sp++; } if (! (dmask >>= 1)) { dmask= 0x80; dp++; } } sline += slinelen; dline += dlinelen; } break; case IRGB: case ITRUE: if (RGBP(simage)) { image= newRGBImage(clipw, cliph, simage->depth); for (x= 0; x < simage->rgb.used; x++) { *(image->rgb.red + x)= *(simage->rgb.red + x); *(image->rgb.green + x)= *(simage->rgb.green + x); *(image->rgb.blue + x)= *(simage->rgb.blue + x); } image->rgb.used= simage->rgb.used; } else image= newTrueImage(clipw, cliph); slinelen= simage->width * simage->pixlen; start= clipx * simage->pixlen; sline= simage->data + (clipy * slinelen); dp= image->data; for (y= 0; y < cliph; y++) { sp= sline + start; for (x= 0; x < clipw; x++) { valToMem(memToVal(sp, simage->pixlen), dp, simage->pixlen); sp += simage->pixlen; dp += simage->pixlen; } sline += slinelen; } break; default: fprintf(stderr, "clip: Unsupported image type\n"); cleanup(-1); } image->title= dupString(simage->title); if (verbose) fprintf(stderr, "done\n"); return(image); } kit/image/cmuwmraster.c010064400237450000000000000053600664163773700147740ustar nishidawheel/* * * handle CMU Window Manager (ITC) raster image type * * dan lovinger (dl2n+@andrew.cmu.edu) 07.11.90 * * the format is essentially a byte-reversed sun raster w/o encoding * * Copyright 1989 Jim Frost. See included file "copyright.h" for complete * copyright information. */ #include "copyright.h" #include "image.h" #include "cmuwmraster.h" /* SUPPRESS 558 */ void babble(name, headerp) char *name; struct cmuwm_header *headerp; { fprintf(stderr, "%s is a %dx%d %d plane CMU WM raster\n", name, (int) memToVal(headerp->width, sizeof(long)), (int) memToVal(headerp->height, sizeof(long)), (int) memToVal(headerp->depth, sizeof(short))); } int cmuwmIdent(fullname, name) char *fullname, *name; { ZFILE *zf; struct cmuwm_header header; int r; if (!(zf = zopen(fullname))) { perror("cmuwmIdent"); return(0); } switch (zread(zf, (byte *)&header, sizeof(struct cmuwm_header))) { case -1: perror("cmuwmIdent"); r =0; break; case sizeof(struct cmuwm_header): if (memToVal(header.magic, sizeof(long)) != CMUWM_MAGIC) { r = 0; break; } babble(name, &header); r = 1; break; default: r = 0; break; } zclose(zf); return r; } Image* cmuwmLoad(fullname, name, verbose) char *fullname, *name; unsigned int verbose; { ZFILE *zf; struct cmuwm_header header; Image *image; int height, width, row, linelen, r; byte *lineptr; if (!(zf= zopen(fullname))) { perror("cmuwmLoad"); return(NULL); } switch (zread(zf, (byte *)&header, sizeof(struct cmuwm_header))) { case -1: perror("cmuwmLoad"); zclose(zf); cleanup(-1); case sizeof(struct cmuwm_header): if (memToVal(header.magic, sizeof(long)) != CMUWM_MAGIC) { zclose(zf); return(NULL); } if (verbose) babble(name, &header); break; default: zclose(zf); return(NULL); } if (memToVal(header.depth, sizeof(short)) != 1) { fprintf(stderr,"CMU WM raster %s is of depth %d, must be 1", name, (int) header.depth); return(NULL); } image = newBitImage(width = memToVal(header.width, sizeof(long)), height = memToVal(header.height, sizeof(long))); linelen = (width / 8) + (width % 8 ? 1 : 0); lineptr = image->data; for (row = 0; row < height; row++) { r = zread(zf, lineptr, linelen); if (r == -1) { perror("cmuwmLoad"); cleanup(-1); } if (r != linelen) { fprintf(stderr, "cmuwmLoad: short raster\n"); cleanup(-1); } for (r = 0; r < linelen; r++) { lineptr[r] ^= 0xff; } lineptr += linelen; } zclose(zf); image->title = dupString(name); return image; } kit/image/cmuwmraster.h010064400237450000000000000004720642466043000147610ustar nishidawheel/* cmuwmraster.h * * this describes the header for ITC (CMU WM) raster files. It is * essentially a byte reversed Sun raster, 1 plane, no encoding. */ #include "copyright.h" struct cmuwm_header { byte magic[4]; byte width[4]; byte height[4]; byte depth[2]; }; #define CMUWM_MAGIC 0xf10040bb kit/image/compress.c010064400237450000000000000106161062310351400142260ustar nishidawheel/* compress.c: * * compress a colormap by removing unused or duplicate RGB colors. this * uses a 15-bit true color pixel as an index into a hash table of pixel * values (similar to the technique used in reduce.c). * * jim frost 10.05.89 * * Copyright 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "image.h" /* this converts a TLA-style pixel into a 15-bit true color pixel */ #define TLA_TO_15BIT(TABLE,PIXEL) \ ((((TABLE).red[PIXEL] & 0xf800) >> 1) | \ (((TABLE).green[PIXEL] & 0xf800) >> 6) | \ (((TABLE).blue[PIXEL] & 0xf800) >> 11)) /* these macros extract color intensities from a 15-bit true color pixel */ #define RED_INTENSITY(P) (((P) & 0x7c00) >> 10) #define GREEN_INTENSITY(P) (((P) & 0x03e0) >> 5) #define BLUE_INTENSITY(P) ((P) & 0x001f) #define NIL_PIXEL 0xffffffff void compress_colormap(image, verbose) Image *image; unsigned int verbose; { Pixel hash_table[32768]; Pixel *pixel_table; Pixel *pixel_map; Pixel index, oldpixval, newpixval; byte *pixptr; unsigned int x, y, badcount, dupcount; RGBMap rgb; goodImage(image, "compress"); if (!RGBP(image) || image->rgb.compressed) /* we're AT&T */ return; if (verbose) { fprintf(stderr, " Compressing colormap..."); fflush(stderr); } /* initialize hash table and allocate new RGB intensity tables */ for (x= 0; x < 32768; x++) hash_table[x]= NIL_PIXEL; newRGBMapData(&rgb, image->rgb.used); rgb.size= image->rgb.used; rgb.used= 0; pixel_table= (Pixel *)lmalloc(sizeof(Pixel) * image->rgb.used); pixel_map= (Pixel *)lmalloc(sizeof(Pixel) * image->rgb.used); for (x= 0; x < image->rgb.used; x++) pixel_map[x]= NIL_PIXEL; pixptr= image->data; dupcount= badcount= 0; for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { oldpixval= memToVal(pixptr, image->pixlen); if (oldpixval > image->rgb.used) { badcount++; oldpixval= 0; } /* if we don't already know what value the new pixel will have, * look for a similar pixel in hash table. */ if (pixel_map[oldpixval] == NIL_PIXEL) { index= TLA_TO_15BIT(image->rgb, oldpixval); /* nothing similar */ if (hash_table[index] == NIL_PIXEL) { newpixval= rgb.used++; hash_table[index]= newpixval; } /* we've seen one like this before; try to find out if it's an * exact match */ else { newpixval= hash_table[index]; for (;;) { /* if the color is the same as another color we've seen, * use the pixel that the other color is using */ if ((rgb.red[newpixval] == image->rgb.red[oldpixval]) && (rgb.green[newpixval] == image->rgb.green[oldpixval]) && (rgb.blue[newpixval] == image->rgb.blue[oldpixval])) { pixel_map[oldpixval]= newpixval; /* same color */ dupcount++; goto move_pixel; } /* if we're at the end of the chain, we're the first pixel * of this color */ if (pixel_table[newpixval] == NIL_PIXEL) /* end of the chain */ break; newpixval= pixel_table[newpixval]; } pixel_table[newpixval]= rgb.used; newpixval= rgb.used++; } pixel_map[oldpixval]= newpixval; pixel_table[newpixval]= NIL_PIXEL; rgb.red[newpixval]= image->rgb.red[oldpixval]; rgb.green[newpixval]= image->rgb.green[oldpixval]; rgb.blue[newpixval]= image->rgb.blue[oldpixval]; } /* change the pixel */ move_pixel: valToMem(pixel_map[oldpixval], pixptr, image->pixlen); pixptr += image->pixlen; } lfree(pixel_table); lfree(pixel_map); if (badcount) { if (verbose) fprintf(stderr, "%d out-of-range pixels, ", badcount); else fprintf(stderr, "Warning: %d out-of-range pixels were seen\n", badcount); } if (verbose) { if ((rgb.used == image->rgb.used) && !badcount) fprintf(stderr, "no improvment\n"); else { int unused= image->rgb.used - rgb.used - dupcount; if (dupcount) fprintf(stderr, "%d duplicate%s and %d unused color%s removed...", dupcount, (dupcount == 1 ? "" : "s"), unused, (unused == 1 ? "" : "s")); fprintf(stderr, "%d unique color%s\n", rgb.used, (rgb.used == 1 ? "" : "s")); } } /* image is converted; now fix up its colormap */ freeRGBMapData(&(image->rgb)); image->rgb= rgb; image->rgb.compressed= 1; } kit/image/copyright.h010064400237450000000000000021721062311735200144130ustar nishidawheel#ifndef _JIM_COPYRIGHT_ /* * Copyright 1989, 1990, 1991 Jim Frost * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. The author makes no representations * about the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty. * * THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE * USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef __SABER__ static const char *Copyright = "Copyright 1989, 1990, 1991, 1992 Jim Frost"; #endif #define _JIM_COPYRIGHT_ #endif kit/image/dither.c010064400237450000000000000136520647077533400137010ustar nishidawheel/* dither.c * * completely reworked dithering module for xloadimage * uses error-diffusion dithering (floyd-steinberg) instead * of simple 4x4 ordered-dither that was previously used * * the previous version of this code was written by steve losen * (scl@virginia.edu) * * jim frost 07.10.89 * Steve Losen 11.17.89 * kirk johnson 06.04.90 * * Copyright 1990 Kirk L. Johnson (see the included file * "kljcpyrght.h" for complete copyright information) * * Copyright 1989, 1990 Jim Frost and Steve Losen. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "kljcpyrght.h" #include "image.h" #define MaxIntensity 65536 /* maximum possible Intensity */ #define MaxGrey 32768 /* limits on the grey levels used */ #define Threshold 16384 /* in the dithering process */ #define MinGrey 0 static unsigned int tone_scale_adjust(); static void LeftToRight(); static void RightToLeft(); /* * simple floyd-steinberg dither with serpentine raster processing */ Image *dither(cimage, verbose) Image *cimage; unsigned int verbose; { Image *image; /* destination image */ unsigned int *grey; /* grey map for source image */ unsigned int spl; /* source pixel length in bytes */ unsigned int dll; /* destination line length in bytes */ unsigned char *src; /* source data */ unsigned char *dst; /* destination data */ int *curr; /* current line buffer */ int *next; /* next line buffer */ int *swap; /* for swapping line buffers */ Pixel color; /* pixel color */ unsigned int level; /* grey level */ unsigned int i, j; /* loop counters */ /* * check the source image */ goodImage(cimage, "dither"); if (BITMAPP(cimage)) return(NULL); /* * allocate destination image */ if (verbose) { fprintf(stderr, " Dithering image..."); fflush(stderr); } image = newBitImage(cimage->width, cimage->height); if (cimage->title) { image->title = (char *)lmalloc(strlen(cimage->title) + 12); sprintf(image->title, "%s (dithered)", cimage->title); } /* * if the number of entries in the colormap isn't too large, compute * the grey level for each entry and store it in grey[]. else the * grey levels will be computed on the fly. */ if (RGBP(cimage) && (cimage->depth <= 16)) { grey = (unsigned int *)lmalloc(sizeof(unsigned int) * cimage->rgb.used); for (i=0; irgb.used; i++) grey[i]= (colorIntensity(cimage->rgb.red[i], cimage->rgb.green[i], cimage->rgb.blue[i]) >> 1); for (i=0; irgb.used; i++) grey[i] = tone_scale_adjust(grey[i]); } else { grey = NULL; } /* * dither setup */ spl = cimage->pixlen; dll = (image->width / 8) + (image->width % 8 ? 1 : 0); src = cimage->data; dst = image->data; curr = (int *)lmalloc(sizeof(int) * (cimage->width + 2)); next = (int *)lmalloc(sizeof(int) * (cimage->width + 2)); curr += 1; next += 1; for (j=0; jwidth; j++) { curr[j] = 0; next[j] = 0; } /* * primary dither loop */ for (i=0; iheight; i++) { /* copy the row into the current line */ for (j=0; jwidth; j++) { color = memToVal(src, spl); src += spl; if (RGBP(cimage)) { if (grey == NULL) level = tone_scale_adjust(colorIntensity(cimage->rgb.red[color], cimage->rgb.green[color], cimage->rgb.blue[color]) >> 1); else level = grey[color]; } else { level = tone_scale_adjust(colorIntensity((TRUE_RED(color) << 8), (TRUE_GREEN(color) << 8), (TRUE_BLUE(color) << 8)) >> 1); } curr[j] += level; } /* dither the current line */ if (i & 0x01) RightToLeft(curr, next, cimage->width); else LeftToRight(curr, next, cimage->width); /* copy the dithered line to the destination image */ for (j=0; jwidth; j++) if (curr[j] < Threshold) dst[j / 8] |= 1 << (7 - (j & 7)); dst += dll; /* circulate the line buffers */ swap = curr; curr = next; next = swap; for (j=0; jwidth; j++) next[j] = 0; } /* * clean up */ lfree((byte *)grey); lfree((byte *)(curr-1)); lfree((byte *)(next-1)); if (verbose) fprintf(stderr, "done\n"); return(image); } /* * a _very_ simple tone scale adjustment routine. provides a piecewise * linear mapping according to the following: * * input: output: * 0 (MinGrey) 0 (MinGrey) * Threshold Threshold/2 * MaxGrey MaxGrey * * this should help things look a bit better on most displays. */ static unsigned int tone_scale_adjust(val) unsigned int val; { unsigned int rslt; if (val < Threshold) rslt = val / 2; else rslt = (((val - Threshold) * (MaxGrey-(Threshold/2))) / (MaxGrey-Threshold)) + (Threshold/2); return rslt; } /* * dither a line from left to right */ static void LeftToRight(curr, next, width) int *curr; int *next; int width; { int idx; int error; int output; for (idx=0; idx Threshold) ? MaxGrey : MinGrey; error = curr[idx] - output; curr[idx] = output; next[idx-1] += error * 3 / 16; next[idx] += error * 5 / 16; next[idx+1] += error * 1 / 16; curr[idx+1] += error * 7 / 16; } } /* * dither a line from right to left */ static void RightToLeft(curr, next, width) int *curr; int *next; int width; { int idx; int error; int output; for (idx=(width-1); idx>=0; idx--) { output = (curr[idx] > Threshold) ? MaxGrey : MinGrey; error = curr[idx] - output; curr[idx] = output; next[idx+1] += error * 3 / 16; next[idx] += error * 5 / 16; next[idx-1] += error * 1 / 16; curr[idx-1] += error * 7 / 16; } } kit/image/faces.c010064400237450000000000000077670734347160600135100ustar nishidawheel/* faces.c: * * faces format image loader * * jim frost 07.06.89 * * Copyright 1989 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "image.h" /* SUPPRESS 560 */ static short HexTable[256]; /* conversion value */ static unsigned int Initialized= 0; /* easier to fill in at run time */ #define HEXIGNORE -1 #define HEXBAD -2 #define MAXFACESNAME 256 /* to avoid buffer overflow */ /* build a hex digit value table with the bits inverted */ static void initHexTable() { int a; for (a= 0; a < 256; a++) HexTable[a]= HEXBAD; HexTable['0']= 0x0; HexTable['1']= 0x1; HexTable['2']= 0x2; HexTable['3']= 0x3; HexTable['4']= 0x4; HexTable['5']= 0x5; HexTable['6']= 0x6; HexTable['7']= 0x7; HexTable['8']= 0x8; HexTable['9']= 0x9; HexTable['A']= 0xa; HexTable['a']= HexTable['A']; HexTable['B']= 0xb; HexTable['b']= HexTable['B']; HexTable['C']= 0xc; HexTable['c']= HexTable['C']; HexTable['D']= 0xd; HexTable['d']= HexTable['D']; HexTable['E']= 0xe; HexTable['e']= HexTable['E']; HexTable['F']= 0xf; HexTable['f']= HexTable['F']; HexTable['\r']= HEXIGNORE; HexTable['\n']= HEXIGNORE; HexTable['\t']= HEXIGNORE; HexTable[' ']= HEXIGNORE; Initialized = 1; } /* read a hex value and return its value */ static int nextInt(zf, len) ZFILE *zf; unsigned int len; { int c; int value= 0; int count; len <<= 1; for (count= 0; count < len;) { c= zgetc(zf); if (c == EOF) return(-1); else { c= HexTable[c & 0xff]; switch(c) { case HEXIGNORE: break; case HEXBAD: return(-1); default: value= (value << 4) + c; count++; } } } return(value); } Image *facesLoad(fullname, name, verbose) char *fullname, *name; { ZFILE *zf; Image *image; char fname[BUFSIZ]; char lname[BUFSIZ]; char buf[BUFSIZ]; unsigned int w, h, d, iw, ih, id; unsigned int x, y; int value; unsigned int linelen; byte *lineptr, *dataptr; if (!Initialized) initHexTable(); if (! (zf= zopen(fullname))) return(NULL); w= h= d= 0; fname[0]= lname[0]= '\0'; while (zgets((byte *)buf, BUFSIZ - 1, zf)) { if (! strcmp(buf, "\n")) break; if (!strncmp(buf, "FirstName:", 10)){ strncpy(fname, buf + 11, MAXFACESNAME); } else if (!strncmp(buf, "LastName:", 9)) strncpy(lname, buf + 10, MAXFACESNAME); else if (!strncmp(buf, "Image:", 6)) { if (sscanf(buf + 7, "%d%d%d", &iw, &ih, &id) != 3) { fprintf(stderr, "%s: Bad Faces Project image\n", fullname); cleanup(-1); } } else if (!strncmp(buf, "PicData:", 8)) { if (sscanf(buf + 9, "%d%d%d", &w, &h, &d) != 3) { fprintf(stderr, "%s: Bad Faces Project image\n", fullname); cleanup(-1); } } } if (!w || !h || !d) { zclose(zf); return(NULL); } znocache(zf); if (verbose) fprintf(stderr, "%s is a %dx%d %d-bit grayscale Faces Project image\n", name, w, h, d); image= newRGBImage(w, h, d); fname[strlen(fname) - 1]= ' '; strcat(fname, lname); fname[strlen(fname) - 1]= '\0'; image->title= dupString(fname); /* image is greyscale; build RGB map accordingly */ for (x= 0; x < image->rgb.size; x++) *(image->rgb.red + x)= *(image->rgb.green + x)= *(image->rgb.blue + x)= (65536 / image->rgb.size) * x; image->rgb.used= image->rgb.size; /* read in image data */ linelen= w * image->pixlen; lineptr= image->data + (h * linelen); for (y= 0; y < h; y++) { lineptr -= linelen; dataptr= lineptr; for (x= 0; x < w; x++) { if ((value= nextInt(zf, image->pixlen)) < 0) { fprintf(stderr, "%s: Bad Faces Project image data\n", fullname); cleanup(-1); } *(dataptr++)= value; } } zclose(zf); return(image); } int facesIdent(fullname, name) char *fullname, *name; { Image *image; if ((image = facesLoad(fullname, name, 1))) { freeImage(image); return(1); } return(0); } kit/image/fbm.c010064400237450000000000000154510664163774300131660ustar nishidawheel/* * fbm.c: * * adapted from code by Michael Mauldin, (mlm) at Carnegie-Mellon * University, (fbm tools) and Kirk L. Johnson, (tuna@athena.mit.edu), * (gif.c). * * fbmin.c * Mark Majhor * August 1990 * * routines for reading FBM files * * Copyright 1990 Mark Majhor (see the included file * "mrmcpyrght.h" for complete copyright information) */ #include # include # include # include # include "image.h" # include "fbm.h" /**** ** ** local variables ** ****/ static BYTE file_open = 0; /* status flags */ static BYTE image_open = 0; static ZFILE *ins; /* input stream */ static FBMFILEHDR phdr; /* header structure */ /**** ** ** global variables ** ****/ static int fbmin_img_width; /* image width */ static int fbmin_img_height; /* image height */ static int fbmin_img_depth; /* image depth */ static int fbmin_img_bits; /* color bits */ static int fbmin_img_rowlen; /* length of one row of data */ static int fbmin_img_plnlen; /* length of one plane of data */ static int fbmin_img_clrlen; /* length of the colormap */ static int fbmin_img_aspect; /* image aspect ratio */ static int fbmin_img_physbits; /* physical bits per pixel */ static char *fbmin_img_title; /* name of image */ static char *fbmin_img_credit; /* credit for image */ static int fbmin_image_test() { if (fbmin_img_width < 1 || fbmin_img_width > 32767) { fprintf (stderr, "Invalid width (%d) on input\n", fbmin_img_width); return FBMIN_ERR_BAD_SD; } if (fbmin_img_height < 1 || fbmin_img_height > 32767) { fprintf (stderr, "Invalid height (%d) on input\n", fbmin_img_height); return (0); } if (fbmin_img_depth != 1 && fbmin_img_depth != 3) { fprintf (stderr, "Invalid number of planes (%d) on input %s\n", fbmin_img_depth, "(must be 1 or 3)"); return FBMIN_ERR_BAD_SD; } if (fbmin_img_bits < 1 || fbmin_img_bits > 8) { fprintf (stderr, "Invalid number of bits (%d) on input %s\n", fbmin_img_bits, "(must be [1..8])"); return FBMIN_ERR_BAD_SD; } if (fbmin_img_physbits != 1 && fbmin_img_physbits != 8) { fprintf (stderr, "Invalid number of physbits (%d) on input %s\n", fbmin_img_physbits, "(must be 1 or 8)"); return FBMIN_ERR_BAD_SD; } if (fbmin_img_rowlen < 1 || fbmin_img_rowlen > 32767) { fprintf (stderr, "Invalid row length (%d) on input\n", fbmin_img_rowlen); return FBMIN_ERR_BAD_SD; } if (fbmin_img_depth > 1 && fbmin_img_plnlen < 1) { fprintf (stderr, "Invalid plane length (%d) on input\n", fbmin_img_plnlen); return FBMIN_ERR_BAD_SD; } if (fbmin_img_aspect < 0.01 || fbmin_img_aspect > 100.0) { fprintf (stderr, "Invalid aspect ratio %dg on input\n", fbmin_img_aspect); return FBMIN_ERR_BAD_SD; } return FBMIN_SUCCESS; } /* * open FBM image in the input stream; returns FBMIN_SUCCESS if * successful. (might also return various FBMIN_ERR codes.) */ static int fbmin_open_image(s) ZFILE *s; { char *hp; /* header pointer */ /* make sure there isn't already a file open */ if (file_open) return(FBMIN_ERR_FAO); /* remember that we've got this file open */ file_open = 1; ins = s; /* read in the fbm file header */ hp = (char *) &phdr; if (zread(ins, (byte *)hp, sizeof(phdr)) != sizeof(phdr)) return FBMIN_ERR_EOF; if (strncmp(FBM_MAGIC, phdr.magic, sizeof(FBM_MAGIC)) != 0) return FBMIN_ERR_BAD_SIG; /* Now extract relevant features of FBM file header */ fbmin_img_width = atoi(phdr.cols); fbmin_img_height = atoi(phdr.rows); fbmin_img_depth = atoi(phdr.planes); fbmin_img_bits = atoi(phdr.bits); fbmin_img_rowlen = atoi(phdr.rowlen); fbmin_img_plnlen = atoi(phdr.plnlen); fbmin_img_clrlen = atoi(phdr.clrlen); fbmin_img_aspect = atoi(phdr.aspect); fbmin_img_physbits = atoi(phdr.physbits); fbmin_img_title = phdr.title; fbmin_img_credit = phdr.credits; if (fbmin_image_test() != FBMIN_SUCCESS) return FBMIN_ERR_BAD_SD; return FBMIN_SUCCESS; } /* * close an open FBM file */ static int fbmin_close_file() { /* make sure there's a file open */ if (!file_open) return FBMIN_ERR_NFO; /* mark file (and image) as closed */ file_open = 0; image_open = 0; /* done! */ return FBMIN_SUCCESS; } #if 0 /* * semi-graceful fatal error mechanism */ static fbmin_fatal(msg) char *msg; { fprintf(stderr, "Error reading FBM file: %s\n", msg); exit(0); } #endif /* * these are the routines added for interfacing to xloadimage */ /* * tell someone what the image we're loading is. this could be a little more * descriptive but I don't care */ static void tellAboutImage(name) char *name; { fprintf(stderr, "%s is a %dx%d FBM image with %d colors\n", name, fbmin_img_width, fbmin_img_height, fbmin_img_clrlen / 3); } Image *fbmLoad(fullname, name, verbose) char *fullname, *name; unsigned int verbose; { ZFILE *zf; Image *image; register int x, y, j, k, rowlen, plnlen; unsigned char *pixptr, *cm; unsigned char *r, *g, *b; if (! (zf= zopen(fullname))) return(NULL); if (fbmin_open_image(zf) != FBMIN_SUCCESS) { /* read image header */ fbmin_close_file(); zclose(zf); return(NULL); } if (verbose) tellAboutImage(name); znocache(zf); image = newRGBImage(fbmin_img_width, fbmin_img_height, fbmin_img_bits); /* if image has a local colormap, override global colormap */ if (fbmin_img_clrlen > 0) { cm = (unsigned char *) lmalloc(fbmin_img_clrlen); if (zread(ins, cm, fbmin_img_clrlen) != fbmin_img_clrlen) { fprintf (stderr, "can't read colormap (%d bytes)\n", fbmin_img_clrlen); return(NULL); } /* * fbm color map is organized as * buf[3][16] */ y = fbmin_img_clrlen / 3; r = &cm[0], g = &cm[y], b = &cm[2 * y]; for (x = 0; x < y; x++, r++, g++, b++) { image->rgb.red[x] = *r << 8; image->rgb.green[x] = *g << 8; image->rgb.blue[x] = *b << 8; } image->rgb.used = y; } else cm = NULL; rowlen = fbmin_img_rowlen; plnlen = fbmin_img_plnlen; for (k = 0; k < fbmin_img_depth; k++) { pixptr = &(image->data[k * plnlen]); for (j = 0; j < fbmin_img_height; j++, pixptr += rowlen) { if (zread(ins, pixptr, rowlen) != rowlen) { fprintf(stderr, "%s: Short read within image data\n", fullname); cleanup(-1); } } } if (cm != NULL) lfree(cm); fbmin_close_file(); zclose(zf); image->title= dupString(name); return(image); } int fbmIdent(fullname, name) char *fullname, *name; { ZFILE *zf; unsigned int ret; if (! (zf= zopen(fullname))) return(0); if (fbmin_open_image(zf) == FBMIN_SUCCESS) { tellAboutImage(name); ret = 1; } else ret = 0; fbmin_close_file(); zclose(zf); return(ret); } kit/image/fbm.h010064400237450000000000000035750642466043000131630ustar nishidawheel/***************************************************************** * fbm.h: FBM Library 0.9 (Beta Test) 07-Mar-89 Michael Mauldin * * Copyright (C) 1989 by Michael Mauldin. Permission is granted to * use this file in whole or in part provided that you do not sell it * for profit and that this copyright notice is retained unchanged. * * fbm.h: Fuzzy Bitmap Definition * *****************************************************************/ typedef unsigned char BYTE; /* 8 bits unsigned */ # define FBM_MAX_TITLE 80 /* For title and credits */ # define BIG 1 /* msb first byte order */ # define LITTLE 0 /* lsb first byte order */ #define FBMIN_SUCCESS 0 /* success */ #define FBMIN_ERR_BAD_SD -1 /* bad screen descriptor */ #define FBMIN_ERR_BAD_SIG -2 /* bad signature */ #define FBMIN_ERR_EOD -3 /* unexpected end of raster data */ #define FBMIN_ERR_EOF -4 /* unexpected end of input stream */ #define FBMIN_ERR_FAO -5 /* file already open */ #define FBMIN_ERR_IAO -6 /* image already open */ #define FBMIN_ERR_NFO -7 /* no file open */ #define FBMIN_ERR_NIO -8 /* no image open */ # define FBM_MAGIC "%bitmap" /* FBM bitmap headers in files (null terminated 12 character ascii strings) */ typedef struct fbm_filehdr_struct { char magic[8]; /* 2 bytes FBM_MAGIC number */ char cols[8]; /* Width in pixels */ char rows[8]; /* Height in pixels */ char planes[8]; /* Depth (1 for B+W, 3 for RGB) */ char bits[8]; /* Bits per pixel */ char physbits[8]; /* Bits to store each pixel */ char rowlen[12]; /* Length of a row in bytes */ char plnlen[12]; /* Length of a plane in bytes */ char clrlen[12]; /* Length of colormap in bytes */ char aspect[12]; /* ratio of Y to X of one pixel */ char title[FBM_MAX_TITLE]; /* Null terminated title */ char credits[FBM_MAX_TITLE]; /* Null terminated credits */ } FBMFILEHDR; kit/image/g3.c010064400237450000000000000243000664163774400127250ustar nishidawheel/** g3.c - read a Group 3 FAX file and product a bitmap ** ** Adapted from Paul Haeberli's G3 to Portable Bitmap ** code. ** ** modified by jimf on 09.18.90 to fail on any load error. this was done ** to cut down on the false positives caused by a lack of any read ID ** string. the old errors are currently ifdef'ed out -- if you want 'em ** define ALLOW_G3_ERRORS. **/ /* Edit History 04/15/91 8 nazgul Sanity check line widths Doing a zclose on all failures 04/14/91 1 schulert add for SYSV systems 04/13/91 6 nazgul Handle reinvocation on the same file 04/13/91 5 nazgul Bug fix to retry with bitreversed, and do not double allocate on multiple calls 04/12/91 4 nazgul Spot faxes that do not have a 000 header Handle faxes that have the bytes in the wrong order 07/03/90 2 nazgul Added recovery for premature EOF */ #include #include #include "image.h" #include "g3.h" /* SUPPRESS 530 */ /* SUPPRESS 558 */ /* SUPPRESS 560 */ /**** ** ** Local defines ** ****/ #define BITS_TO_BYTES(bits) (bits/8)+((bits-((bits/8)*8)?1:0)) #define TABSIZE(tab) (sizeof(tab)/sizeof(struct tableentry)) #ifdef VMS #define cols vmscols #endif /**** ** ** Local variables ** ****/ static int g3_eof = 0; static int g3_eols; static int g3_rawzeros; static int g3_Xrawzeros; static int maxlinelen; static int rows, cols; static int g3_error = 0; static int g3_verb; static int curbit; #define MAX_ERRORS 20 /**** ** ** Local tables ** ****/ tableentry *whash[HASHSIZE]; tableentry *bhash[HASHSIZE]; static void g3_addtohash(hash, te, n, a, b) tableentry *hash[]; tableentry *te; int n, a, b; { unsigned int pos; while (n--) { pos = ((te->length+a)*(te->code+b))%HASHSIZE; if (hash[pos] != 0) { #ifdef ALLOW_G3_ERRORS fprintf(stderr, "G3: Hash collision during initialization.\n"); cleanup(-1); #else ++g3_error; return; #endif } hash[pos] = te; te++; } } int g3_rawgetbit(fd) ZFILE *fd; { int b; static int shdata; if (curbit >= 8) { shdata = zgetc(fd); if (shdata == EOF) { #ifdef ALLOW_G3_ERRORS if (g3_verb) fprintf(stderr, "G3: Premature EOF at line %d.\n", rows); g3_eols = 5; g3_eof = 1; ++g3_error; return 0; #else return(-1); #endif } curbit = 0; } if (shdata & bmask[curbit]) { g3_Xrawzeros = g3_rawzeros; g3_rawzeros = 0; b = 1; } else { g3_rawzeros++; b = 0; } curbit++; return b; } static int g3_bitson(b, c, n) bit *b; int c, n; { int i, col; bit *bP; static int bitmask[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; bP = b; col = c; bP+=(c/8); i = (c - ((c/8)*8)); while(col <= (c+n)) { for(;col <= (c+n) && i < 8; i++) { *bP |= bitmask[i]; col++; } i = 0; bP++; } return(0); } tableentry *g3_hashfind(hash, length, code, a, b) tableentry *hash[]; int length, code; int a, b; { unsigned int pos; tableentry *te; pos = ((length+a)*(code+b))%HASHSIZE; if (pos >= HASHSIZE) { #ifndef ALLOW_G3_ERRORS fprintf(stderr, "G3: Bad hash position, length %d code %d pos %d.\n", length, code, pos); cleanup(-1); #else ++g3_error; return(NULL); #endif } te = hash[pos]; return ((te && te->length == length && te->code == code) ? te : 0); } int g3_getfaxrow(fd, bitrow) ZFILE *fd; byte *bitrow; { int col; int curlen, curcode, nextbit; int count, color; tableentry *te; /* First make the whole row white... */ memset((char *) bitrow, 0, maxlinelen); col = 0; g3_rawzeros = 0; curlen = 0; curcode = 0; color = 1; count = 0; while (!g3_eof) { if (col >= MAXCOLS) { #ifdef ALLOW_G3_ERRORS if (g3_verb) fprintf(stderr, "G3: Input row %d is too long, skipping to EOL.\n", rows); g3_skiptoeol(fd); ++g3_error; return (col); #else return(-1); #endif } do { if (g3_eof) return 0; if (g3_rawzeros >= 11) { nextbit = g3_rawgetbit(fd); if (nextbit) { if ( col == 0 ) /* 6 consecutive EOLs mean end of document */ g3_eof = (++g3_eols >= 5); else g3_eols = 0; return (col); } } else nextbit = g3_rawgetbit(fd); curcode = (curcode<<1) + nextbit; curlen++; } while (curcode <= 0); /* No codewords are greater than 13 bytes */ if (curlen > 13) { #ifdef ALLOW_G3_ERRORS if (g3_verb) fprintf(stderr, "G3: Bad code word at row %d, col %d (len %d code 0x%2.2x), skipping to EOL.\n", rows, col, curlen, curcode ); g3_skiptoeol(fd); ++g3_error; return (col); #else return(-1); #endif } if (color) { /* White codewords are at least 4 bits long */ if (curlen < 4) continue; te = g3_hashfind(whash, curlen, curcode, WHASHA, WHASHB); } else { /* Black codewords are at least 2 bits long */ if (curlen < 2) continue; te = g3_hashfind(bhash, curlen, curcode, BHASHA, BHASHB); } if (!te) continue; switch (te->tabid) { case TWTABLE: case TBTABLE: count += te->count; if (col+count > MAXCOLS) count = MAXCOLS-col; if (count > 0) { if (color) { col += count; count = 0; } else g3_bitson(bitrow, col, count); } curcode = 0; curlen = 0; color = !color; break; case MWTABLE: case MBTABLE: count += te->count; curcode = 0; curlen = 0; break; case EXTABLE: count += te->count; curcode = 0; curlen = 0; break; default: fprintf(stderr, "G3: Bad table id from table entry.\n"); #ifndef ALLOW_G3_ERRORS cleanup(-3); #else ++g3_error; return(-1); #endif } } return (0); } int g3_skiptoeol(fd) ZFILE *fd; { while (g3_rawzeros<11 && !g3_eof) (void) g3_rawgetbit(fd); while(!g3_rawgetbit(fd) && !g3_eof); return(0); } /* All G3 images begin with a G3 EOL codeword which is eleven binary 0's * followed by one binary 1. There could be up to 15 0' so that the image * starts on a char boundary. */ /* * They are all *supposed* to, but in fact some don't. In fact pbmtog3 doesn't seem * to generate them. So if that fails, we'll also try reading a line and seeing if * we get any errors. Note that this means we had to move the call to g3_ident * to after the hash table init. -nazgul */ int g3_ident(fd) ZFILE *fd; { int ret=0, col1=0, col2=0, i; byte *tmpline; int reverse = 0; struct cache *dataptr; int bufptr; g3_verb = 0; tmpline = (byte *) lmalloc(maxlinelen); /* In case this got reset by a previous pass through here */ for (i = 0; i < 8; ++i) { bmask[7-i] = 1 << i; } tryagain: curbit = 8; g3_Xrawzeros = 0; g3_eof = g3_eols = rows = cols = 0; /* If we have the zeros we're off to a good start, otherwise, skip some lines */ for (g3_rawzeros = 0; !g3_rawgetbit(fd) && !g3_eof;); if (g3_Xrawzeros >= 11 && g3_Xrawzeros <= 15) { fd->dataptr = fd->data; fd->bufptr = 0; curbit = 8; g3_skiptoeol(fd); if (!g3_error) g3_skiptoeol(fd); if (!g3_error) g3_skiptoeol(fd); if (!g3_error) g3_skiptoeol(fd); } else ret = 1; /* Now get two lines and make sure they are the same length. If not give up. * Note that it is possible for this to give false positives (value.o on a Sun IPC * did) but it's unlikely enough that I think we're okay. */ dataptr = fd->dataptr; bufptr = fd->bufptr; if (!g3_error) col1 = g3_getfaxrow(fd, tmpline); if (!g3_error) col2 = g3_getfaxrow(fd, tmpline); if (!g3_error && col1 == col2 && col1 != 0) ret = 1; else ret = 0; /* if (ret) fprintf(stderr, "%d = %d\n", col1, col2); */ fd->dataptr = dataptr; fd->bufptr = bufptr; curbit = 8; /* This bogus hack is to accomodate some fax modems which apparently use a chip * with a different byte order. We simply try again with the table reversed. */ if (!ret && !reverse) { rows = cols = g3_error = 0; fd->dataptr = fd->data; fd->bufptr = 0; g3_Xrawzeros = 0; for (i = 0; i < 8; ++i) { bmask[i] = 1 << i; } reverse = 1; goto tryagain; } g3_eols = rows = cols = 0; lfree(tmpline); return(ret); } Image *g3Load(fullname, name, verbose) char *fullname, *name; unsigned int verbose; { ZFILE *fd; Image *image; int i, col; byte *currline; static int firstTime = 1; if ((fd = zopen(fullname)) == NULL) return(NULL); if (firstTime) { firstTime = 0; /* Initialize and load the hash tables */ for ( i = 0; i < HASHSIZE; ++i ) whash[i] = bhash[i] = (tableentry *) 0; g3_addtohash(whash, twtable, TABSIZE(twtable), WHASHA, WHASHB); g3_addtohash(whash, mwtable, TABSIZE(mwtable), WHASHA, WHASHB); g3_addtohash(whash, extable, TABSIZE(extable), WHASHA, WHASHB); g3_addtohash(bhash, tbtable, TABSIZE(tbtable), BHASHA, BHASHB); g3_addtohash(bhash, mbtable, TABSIZE(mbtable), BHASHA, BHASHB); g3_addtohash(bhash, extable, TABSIZE(extable), BHASHA, BHASHB); } g3_eof = g3_eols = 0; curbit = 8; /* Reset on multiple reads */ /* Calulate the number of bytes needed for maximum number of columns * (bits), create a temprary storage area for it. */ maxlinelen = BITS_TO_BYTES(MAXCOLS); if (!g3_ident(fd)) { zclose(fd); return(NULL); } g3_verb = verbose; image = newBitImage(MAXCOLS, MAXROWS); currline = image->data; cols = 0; for (rows = 0; rows < MAXROWS; ++rows) { col = g3_getfaxrow(fd, currline); #ifndef ALLOW_G3_ERRORS if (col < 0) { freeImage(image); zclose(fd); return(NULL); } #else if (g3_error > MAX_ERRORS) { freeImage(image); zclose(fd); return(NULL); } #endif if (g3_eof) break; if (col > cols) cols = col; currline += BITS_TO_BYTES(cols); } zclose(fd); image->title= dupString(name); image->width = cols; image->height = rows; if (!image->width || !image->height) { /* sanity check */ freeImage(image); return(NULL); } if(verbose) fprintf(stderr, " %s is a %dx%d G3 FAX image.\n", name, image->width, image->height); return(image); } /* originally this used only g3_ident to determine if it was a G3 image, but * it was always getting false positives so now it loads the whole image in * to see if it's reasonable. */ int g3Ident(fullname, name) char *fullname, *name; { Image *image; g3_verb = 0; if ((image = g3Load(fullname, name, 1))) { freeImage(image); return(1); } return(0); } kit/image/g3.h010064400237450000000000000152260642466043000127240ustar nishidawheel/* g3.h - header file for group 3 FAX compression filters */ #define MAXCOLS 2550 /* Maximum image size is 8.5"x11" @ 300dpi */ #define MAXROWS 3300 #define TWTABLE 23 #define MWTABLE 24 #define TBTABLE 25 #define MBTABLE 26 #define EXTABLE 27 #define VRTABLE 28 #define WHASHA 3510 #define WHASHB 1178 #define BHASHA 293 #define BHASHB 2695 #define HASHSIZE 1021 #ifndef _G3_H_ #define _G3_H_ typedef unsigned char bit; int bmask[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; typedef struct tableentry { int tabid; int code; int length; int count; } tableentry; struct tableentry twtable[] = { { TWTABLE, 0x35, 8, 0 }, { TWTABLE, 0x7, 6, 1 }, { TWTABLE, 0x7, 4, 2 }, { TWTABLE, 0x8, 4, 3 }, { TWTABLE, 0xb, 4, 4 }, { TWTABLE, 0xc, 4, 5 }, { TWTABLE, 0xe, 4, 6 }, { TWTABLE, 0xf, 4, 7 }, { TWTABLE, 0x13, 5, 8 }, { TWTABLE, 0x14, 5, 9 }, { TWTABLE, 0x7, 5, 10 }, { TWTABLE, 0x8, 5, 11 }, { TWTABLE, 0x8, 6, 12 }, { TWTABLE, 0x3, 6, 13 }, { TWTABLE, 0x34, 6, 14 }, { TWTABLE, 0x35, 6, 15 }, { TWTABLE, 0x2a, 6, 16 }, { TWTABLE, 0x2b, 6, 17 }, { TWTABLE, 0x27, 7, 18 }, { TWTABLE, 0xc, 7, 19 }, { TWTABLE, 0x8, 7, 20 }, { TWTABLE, 0x17, 7, 21 }, { TWTABLE, 0x3, 7, 22 }, { TWTABLE, 0x4, 7, 23 }, { TWTABLE, 0x28, 7, 24 }, { TWTABLE, 0x2b, 7, 25 }, { TWTABLE, 0x13, 7, 26 }, { TWTABLE, 0x24, 7, 27 }, { TWTABLE, 0x18, 7, 28 }, { TWTABLE, 0x2, 8, 29 }, { TWTABLE, 0x3, 8, 30 }, { TWTABLE, 0x1a, 8, 31 }, { TWTABLE, 0x1b, 8, 32 }, { TWTABLE, 0x12, 8, 33 }, { TWTABLE, 0x13, 8, 34 }, { TWTABLE, 0x14, 8, 35 }, { TWTABLE, 0x15, 8, 36 }, { TWTABLE, 0x16, 8, 37 }, { TWTABLE, 0x17, 8, 38 }, { TWTABLE, 0x28, 8, 39 }, { TWTABLE, 0x29, 8, 40 }, { TWTABLE, 0x2a, 8, 41 }, { TWTABLE, 0x2b, 8, 42 }, { TWTABLE, 0x2c, 8, 43 }, { TWTABLE, 0x2d, 8, 44 }, { TWTABLE, 0x4, 8, 45 }, { TWTABLE, 0x5, 8, 46 }, { TWTABLE, 0xa, 8, 47 }, { TWTABLE, 0xb, 8, 48 }, { TWTABLE, 0x52, 8, 49 }, { TWTABLE, 0x53, 8, 50 }, { TWTABLE, 0x54, 8, 51 }, { TWTABLE, 0x55, 8, 52 }, { TWTABLE, 0x24, 8, 53 }, { TWTABLE, 0x25, 8, 54 }, { TWTABLE, 0x58, 8, 55 }, { TWTABLE, 0x59, 8, 56 }, { TWTABLE, 0x5a, 8, 57 }, { TWTABLE, 0x5b, 8, 58 }, { TWTABLE, 0x4a, 8, 59 }, { TWTABLE, 0x4b, 8, 60 }, { TWTABLE, 0x32, 8, 61 }, { TWTABLE, 0x33, 8, 62 }, { TWTABLE, 0x34, 8, 63 }, }; struct tableentry mwtable[] = { { MWTABLE, 0x1b, 5, 64 }, { MWTABLE, 0x12, 5, 128 }, { MWTABLE, 0x17, 6, 192 }, { MWTABLE, 0x37, 7, 256 }, { MWTABLE, 0x36, 8, 320 }, { MWTABLE, 0x37, 8, 384 }, { MWTABLE, 0x64, 8, 448 }, { MWTABLE, 0x65, 8, 512 }, { MWTABLE, 0x68, 8, 576 }, { MWTABLE, 0x67, 8, 640 }, { MWTABLE, 0xcc, 9, 704 }, { MWTABLE, 0xcd, 9, 768 }, { MWTABLE, 0xd2, 9, 832 }, { MWTABLE, 0xd3, 9, 896 }, { MWTABLE, 0xd4, 9, 960 }, { MWTABLE, 0xd5, 9, 1024 }, { MWTABLE, 0xd6, 9, 1088 }, { MWTABLE, 0xd7, 9, 1152 }, { MWTABLE, 0xd8, 9, 1216 }, { MWTABLE, 0xd9, 9, 1280 }, { MWTABLE, 0xda, 9, 1344 }, { MWTABLE, 0xdb, 9, 1408 }, { MWTABLE, 0x98, 9, 1472 }, { MWTABLE, 0x99, 9, 1536 }, { MWTABLE, 0x9a, 9, 1600 }, { MWTABLE, 0x18, 6, 1664 }, { MWTABLE, 0x9b, 9, 1728 }, }; struct tableentry tbtable[] = { { TBTABLE, 0x37, 10, 0 }, { TBTABLE, 0x2, 3, 1 }, { TBTABLE, 0x3, 2, 2 }, { TBTABLE, 0x2, 2, 3 }, { TBTABLE, 0x3, 3, 4 }, { TBTABLE, 0x3, 4, 5 }, { TBTABLE, 0x2, 4, 6 }, { TBTABLE, 0x3, 5, 7 }, { TBTABLE, 0x5, 6, 8 }, { TBTABLE, 0x4, 6, 9 }, { TBTABLE, 0x4, 7, 10 }, { TBTABLE, 0x5, 7, 11 }, { TBTABLE, 0x7, 7, 12 }, { TBTABLE, 0x4, 8, 13 }, { TBTABLE, 0x7, 8, 14 }, { TBTABLE, 0x18, 9, 15 }, { TBTABLE, 0x17, 10, 16 }, { TBTABLE, 0x18, 10, 17 }, { TBTABLE, 0x8, 10, 18 }, { TBTABLE, 0x67, 11, 19 }, { TBTABLE, 0x68, 11, 20 }, { TBTABLE, 0x6c, 11, 21 }, { TBTABLE, 0x37, 11, 22 }, { TBTABLE, 0x28, 11, 23 }, { TBTABLE, 0x17, 11, 24 }, { TBTABLE, 0x18, 11, 25 }, { TBTABLE, 0xca, 12, 26 }, { TBTABLE, 0xcb, 12, 27 }, { TBTABLE, 0xcc, 12, 28 }, { TBTABLE, 0xcd, 12, 29 }, { TBTABLE, 0x68, 12, 30 }, { TBTABLE, 0x69, 12, 31 }, { TBTABLE, 0x6a, 12, 32 }, { TBTABLE, 0x6b, 12, 33 }, { TBTABLE, 0xd2, 12, 34 }, { TBTABLE, 0xd3, 12, 35 }, { TBTABLE, 0xd4, 12, 36 }, { TBTABLE, 0xd5, 12, 37 }, { TBTABLE, 0xd6, 12, 38 }, { TBTABLE, 0xd7, 12, 39 }, { TBTABLE, 0x6c, 12, 40 }, { TBTABLE, 0x6d, 12, 41 }, { TBTABLE, 0xda, 12, 42 }, { TBTABLE, 0xdb, 12, 43 }, { TBTABLE, 0x54, 12, 44 }, { TBTABLE, 0x55, 12, 45 }, { TBTABLE, 0x56, 12, 46 }, { TBTABLE, 0x57, 12, 47 }, { TBTABLE, 0x64, 12, 48 }, { TBTABLE, 0x65, 12, 49 }, { TBTABLE, 0x52, 12, 50 }, { TBTABLE, 0x53, 12, 51 }, { TBTABLE, 0x24, 12, 52 }, { TBTABLE, 0x37, 12, 53 }, { TBTABLE, 0x38, 12, 54 }, { TBTABLE, 0x27, 12, 55 }, { TBTABLE, 0x28, 12, 56 }, { TBTABLE, 0x58, 12, 57 }, { TBTABLE, 0x59, 12, 58 }, { TBTABLE, 0x2b, 12, 59 }, { TBTABLE, 0x2c, 12, 60 }, { TBTABLE, 0x5a, 12, 61 }, { TBTABLE, 0x66, 12, 62 }, { TBTABLE, 0x67, 12, 63 }, }; struct tableentry mbtable[] = { { MBTABLE, 0xf, 10, 64 }, { MBTABLE, 0xc8, 12, 128 }, { MBTABLE, 0xc9, 12, 192 }, { MBTABLE, 0x5b, 12, 256 }, { MBTABLE, 0x33, 12, 320 }, { MBTABLE, 0x34, 12, 384 }, { MBTABLE, 0x35, 12, 448 }, { MBTABLE, 0x6c, 13, 512 }, { MBTABLE, 0x6d, 13, 576 }, { MBTABLE, 0x4a, 13, 640 }, { MBTABLE, 0x4b, 13, 704 }, { MBTABLE, 0x4c, 13, 768 }, { MBTABLE, 0x4d, 13, 832 }, { MBTABLE, 0x72, 13, 896 }, { MBTABLE, 0x73, 13, 960 }, { MBTABLE, 0x74, 13, 1024 }, { MBTABLE, 0x75, 13, 1088 }, { MBTABLE, 0x76, 13, 1152 }, { MBTABLE, 0x77, 13, 1216 }, { MBTABLE, 0x52, 13, 1280 }, { MBTABLE, 0x53, 13, 1344 }, { MBTABLE, 0x54, 13, 1408 }, { MBTABLE, 0x55, 13, 1472 }, { MBTABLE, 0x5a, 13, 1536 }, { MBTABLE, 0x5b, 13, 1600 }, { MBTABLE, 0x64, 13, 1664 }, { MBTABLE, 0x65, 13, 1728 }, }; struct tableentry extable[] = { { EXTABLE, 0x8, 11, 1792 }, { EXTABLE, 0xc, 11, 1856 }, { EXTABLE, 0xd, 11, 1920 }, { EXTABLE, 0x12, 12, 1984 }, { EXTABLE, 0x13, 12, 2048 }, { EXTABLE, 0x14, 12, 2112 }, { EXTABLE, 0x15, 12, 2176 }, { EXTABLE, 0x16, 12, 2240 }, { EXTABLE, 0x17, 12, 2304 }, { EXTABLE, 0x1c, 12, 2368 }, { EXTABLE, 0x1d, 12, 2432 }, { EXTABLE, 0x1e, 12, 2496 }, { EXTABLE, 0x1f, 12, 2560 }, }; #endif /*_G3_H_*/ kit/image/gif.c010064400237450000000000000117630706112435400131530ustar nishidawheel/* gif.c: * * adapted from code by kirk johnson (tuna@athena.mit.edu). most of this * code is unchanged. -- jim frost 12.31.89 * * gifin.c * kirk johnson * november 1989 * * routines for reading GIF files * * Copyright 1989 Kirk L. Johnson (see the included file * "kljcpyrght.h" for complete copyright information) */ #ifdef USE_GIF #include "image.h" #include static void tellAboutImage(name, gifp) char *name; GifFileType *gifp; { fprintf(stderr, "%s is a %dx%d GIF image\n", name, gifp->SWidth, gifp->SHeight); } /* The way Interlaced image should. */ static int InterlacedOffset[] = { 0, 4, 2, 1 }; /* be read - offsets and jumps... */ static int InterlacedJumps[] = { 8, 8, 4, 2 }; Image * gifLoad(fullname, name, verbose) char *fullname, *name; unsigned int verbose; { byte *pixline; unsigned char *Buffer, *BufferP; Image *image; int Size, Row, Col, Width, Height, Count, ExtCode; int i, j, x, y, trans = 0; GifRecordType RecordType; GifByteType *Extension; GifRowType *ScreenBuffer; GifRowType GifRow; GifFileType *GifFile; ColorMapObject *ColorMap; GifColorType *ColorMapEntry; GifFile = DGifOpenFileName(fullname); if (GifFile == NULL) return NULL; if ((ScreenBuffer = (GifRowType *) malloc(GifFile->SHeight * sizeof(GifRowType *))) == NULL) { fprintf(stderr, "malloc failed\n"); exit(1); } /* Size in bytes one row.*/ Size = GifFile->SWidth * sizeof(GifPixelType); /* First row. */ if ((ScreenBuffer[0] = (GifRowType) malloc(Size)) == NULL) { fprintf(stderr, "malloc failed\n"); exit(1); } /* Set its color to BackGround. */ for (i = 0; i < GifFile->SWidth; i++) ScreenBuffer[0][i] = GifFile->SBackGroundColor; for (i = 1; i < GifFile->SHeight; i++) { /* * Allocate the other rows, and set their color to background * too: */ if ((ScreenBuffer[i] = (GifRowType) malloc(Size)) == NULL) { fprintf(stderr, "malloc failed\n"); exit(1); } memcpy(ScreenBuffer[i], ScreenBuffer[0], Size); } /* Scan the content of the GIF file and load the image(s) in: */ do { if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { PrintGifError(); exit(-1); } switch (RecordType) { case IMAGE_DESC_RECORD_TYPE: if (DGifGetImageDesc(GifFile) == GIF_ERROR) { PrintGifError(); exit(-1); } Row = GifFile->Image.Top; /* Image Position relative to Screen. */ Col = GifFile->Image.Left; Width = GifFile->Image.Width; Height = GifFile->Image.Height; if (GifFile->Image.Left + GifFile->Image.Width > GifFile->SWidth || GifFile->Image.Top + GifFile->Image.Height > GifFile->SHeight) { fprintf(stderr, "Image %d is not confined to screen dimension, aborted.\n"); exit(-2); } if (GifFile->Image.Interlace) { /* Need to perform 4 passes on the images: */ for (Count = i = 0; i < 4; i++) for (j = Row + InterlacedOffset[i]; j < Row + Height; j += InterlacedJumps[i]) { if (DGifGetLine(GifFile, &ScreenBuffer[j][Col], Width) == GIF_ERROR) { PrintGifError(); exit(-1); } } } else { for (i = 0; i < Height; i++) { if (DGifGetLine(GifFile, &ScreenBuffer[Row++][Col], Width) == GIF_ERROR) { PrintGifError(); exit(-1); } } } break; case EXTENSION_RECORD_TYPE: /* Skip any extension blocks in file: */ if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) { PrintGifError(); exit(-1); } /* very adhoc transparency support */ if (ExtCode == GRAPHICS_EXT_FUNC_CODE){ if (*((char *)Extension +1) & 1) trans = 1; } while (Extension != NULL) { if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) { PrintGifError(); exit(-1); } } break; case TERMINATE_RECORD_TYPE: break; default: /* Should be traps by DGifGetRecordType. */ break; } } while (RecordType != TERMINATE_RECORD_TYPE); /* Lets dump it - set the global variables required and do it: */ ColorMap = (GifFile->Image.ColorMap ? GifFile->Image.ColorMap : GifFile->SColorMap); image = newRGBImage(GifFile->SWidth, GifFile->SHeight, 8); if (trans) image->trans = GifFile->SBackGroundColor; else image->trans = -1; image->rgb.used = ColorMap->ColorCount; for (i = 0; i < ColorMap->ColorCount; i++) { ColorMapEntry = &ColorMap->Colors[i]; image->rgb.red[i]= ColorMapEntry->Red << 8; image->rgb.green[i]= ColorMapEntry->Green << 8; image->rgb.blue[i]= ColorMapEntry->Blue << 8; } for (y = 0; y < GifFile->SHeight; y++) { GifRow = ScreenBuffer[y]; pixline = image->data + (y * image->width * image->pixlen); for (x = 0; x < GifFile->SWidth; x++) pixline[x] = GifRow[x]; } if (DGifCloseFile(GifFile) == GIF_ERROR) { PrintGifError(); exit(-1); } image->title = dupString(name); return image; } int gifIdent(fullname, name) char *fullname, *name; { GifFileType *gifp; int ret; gifp = DGifOpenFileName(fullname); if (gifp == NULL) ret = 0; else { DGifCloseFile(gifp); tellAboutImage(name); ret = 1; } return ret; } #endif /*USE_GIF*/ kit/image/halftone.c010064400237450000000000000231310664163775000142120ustar nishidawheel/* dither.c: * * routine for dithering a color image to monochrome based on color * intensity. this is loosely based on an algorithm which barry shein * (bzs@std.com) used in his "xf" program. * * jim frost 07.10.89 * * Copyright 1989, 1990 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "image.h" /* RGB intensity tables. red is (val * 0.30), green is (val * 0.59), blue * is (val * .11), where val is intensity >> 8. these are used by the * colorIntensity() macro in images.h. */ unsigned short RedIntensity[256]= { 0, 76, 153, 230, 307, 384, 460, 537, 614, 691, 768, 844, 921, 998, 1075, 1152, 1228, 1305, 1382, 1459, 1536, 1612, 1689, 1766, 1843, 1920, 1996, 2073, 2150, 2227, 2304, 2380, 2457, 2534, 2611, 2688, 2764, 2841, 2918, 2995, 3072, 3148, 3225, 3302, 3379, 3456, 3532, 3609, 3686, 3763, 3840, 3916, 3993, 4070, 4147, 4224, 4300, 4377, 4454, 4531, 4608, 4684, 4761, 4838, 4915, 4992, 5068, 5145, 5222, 5299, 5376, 5452, 5529, 5606, 5683, 5760, 5836, 5913, 5990, 6067, 6144, 6220, 6297, 6374, 6451, 6528, 6604, 6681, 6758, 6835, 6912, 6988, 7065, 7142, 7219, 7296, 7372, 7449, 7526, 7603, 7680, 7756, 7833, 7910, 7987, 8064, 8140, 8217, 8294, 8371, 8448, 8524, 8601, 8678, 8755, 8832, 8908, 8985, 9062, 9139, 9216, 9292, 9369, 9446, 9523, 9600, 9676, 9753, 9830, 9907, 9984, 10060, 10137, 10214, 10291, 10368, 10444, 10521, 10598, 10675, 10752, 10828, 10905, 10982, 11059, 11136, 11212, 11289, 11366, 11443, 11520, 11596, 11673, 11750, 11827, 11904, 11980, 12057, 12134, 12211, 12288, 12364, 12441, 12518, 12595, 12672, 12748, 12825, 12902, 12979, 13056, 13132, 13209, 13286, 13363, 13440, 13516, 13593, 13670, 13747, 13824, 13900, 13977, 14054, 14131, 14208, 14284, 14361, 14438, 14515, 14592, 14668, 14745, 14822, 14899, 14976, 15052, 15129, 15206, 15283, 15360, 15436, 15513, 15590, 15667, 15744, 15820, 15897, 15974, 16051, 16128, 16204, 16281, 16358, 16435, 16512, 16588, 16665, 16742, 16819, 16896, 16972, 17049, 17126, 17203, 17280, 17356, 17433, 17510, 17587, 17664, 17740, 17817, 17894, 17971, 18048, 18124, 18201, 18278, 18355, 18432, 18508, 18585, 18662, 18739, 18816, 18892, 18969, 19046, 19123, 19200, 19276, 19353, 19430, 19507, 19584 }; unsigned short GreenIntensity[256]= { 0, 151, 302, 453, 604, 755, 906, 1057, 1208, 1359, 1510, 1661, 1812, 1963, 2114, 2265, 2416, 2567, 2718, 2869, 3020, 3171, 3322, 3473, 3624, 3776, 3927, 4078, 4229, 4380, 4531, 4682, 4833, 4984, 5135, 5286, 5437, 5588, 5739, 5890, 6041, 6192, 6343, 6494, 6645, 6796, 6947, 7098, 7249, 7400, 7552, 7703, 7854, 8005, 8156, 8307, 8458, 8609, 8760, 8911, 9062, 9213, 9364, 9515, 9666, 9817, 9968,10119,10270,10421,10572,10723, 10874,11025,11176,11328,11479,11630,11781,11932, 12083,12234,12385,12536,12687,12838,12989,13140, 13291,13442,13593,13744,13895,14046,14197,14348, 14499,14650,14801,14952,15104,15255,15406,15557, 15708,15859,16010,16161,16312,16463,16614,16765, 16916,17067,17218,17369,17520,17671,17822,17973, 18124,18275,18426,18577,18728,18880,19031,19182, 19333,19484,19635,19786,19937,20088,20239,20390, 20541,20692,20843,20994,21145,21296,21447,21598, 21749,21900,22051,22202,22353,22504,22656,22807, 22958,23109,23260,23411,23562,23713,23864,24015, 24166,24317,24468,24619,24770,24921,25072,25223, 25374,25525,25676,25827,25978,26129,26280,26432, 26583,26734,26885,27036,27187,27338,27489,27640, 27791,27942,28093,28244,28395,28546,28697,28848, 28999,29150,29301,29452,29603,29754,29905,30056, 30208,30359,30510,30661,30812,30963,31114,31265, 31416,31567,31718,31869,32020,32171,32322,32473, 32624,32775,32926,33077,33228,33379,33530,33681, 33832,33984,34135,34286,34437,34588,34739,34890, 35041,35192,35343,35494,35645,35796,35947,36098, 36249,36400,36551,36702,36853,37004,37155,37306, 37457,37608,37760,37911,38062,38213,38364,38515 }; unsigned short BlueIntensity[256]= { 0, 28, 56, 84, 112, 140, 168, 197, 225, 253, 281, 309, 337, 366, 394, 422, 450, 478, 506, 535, 563, 591, 619, 647, 675, 704, 732, 760, 788, 816, 844, 872, 901, 929, 957, 985, 1013, 1041, 1070, 1098, 1126, 1154, 1182, 1210, 1239, 1267, 1295, 1323, 1351, 1379, 1408, 1436, 1464, 1492, 1520, 1548, 1576, 1605, 1633, 1661, 1689, 1717, 1745, 1774, 1802, 1830, 1858, 1886, 1914, 1943, 1971, 1999, 2027, 2055, 2083, 2112, 2140, 2168, 2196, 2224, 2252, 2280, 2309, 2337, 2365, 2393, 2421, 2449, 2478, 2506, 2534, 2562, 2590, 2618, 2647, 2675, 2703, 2731, 2759, 2787, 2816, 2844, 2872, 2900, 2928, 2956, 2984, 3013, 3041, 3069, 3097, 3125, 3153, 3182, 3210, 3238, 3266, 3294, 3322, 3351, 3379, 3407, 3435, 3463, 3491, 3520, 3548, 3576, 3604, 3632, 3660, 3688, 3717, 3745, 3773, 3801, 3829, 3857, 3886, 3914, 3942, 3970, 3998, 4026, 4055, 4083, 4111, 4139, 4167, 4195, 4224, 4252, 4280, 4308, 4336, 4364, 4392, 4421, 4449, 4477, 4505, 4533, 4561, 4590, 4618, 4646, 4674, 4702, 4730, 4759, 4787, 4815, 4843, 4871, 4899, 4928, 4956, 4984, 5012, 5040, 5068, 5096, 5125, 5153, 5181, 5209, 5237, 5265, 5294, 5322, 5350, 5378, 5406, 5434, 5463, 5491, 5519, 5547, 5575, 5603, 5632, 5660, 5688, 5716, 5744, 5772, 5800, 5829, 5857, 5885, 5913, 5941, 5969, 5998, 6026, 6054, 6082, 6110, 6138, 6167, 6195, 6223, 6251, 6279, 6307, 6336, 6364, 6392, 6420, 6448, 6476, 6504, 6533, 6561, 6589, 6617, 6645, 6673, 6702, 6730, 6758, 6786, 6814, 6842, 6871, 6899, 6927, 6955, 6983, 7011, 7040, 7068, 7096, 7124, 7152, 7180 }; /* 4x4 arrays used for dithering, arranged by nybble */ #define GRAYS 17 /* ((4 * 4) + 1) patterns for a good dither */ #define GRAYSTEP ((unsigned long)(65536 / GRAYS)) static byte DitherBits[GRAYS][4] = { { 0xf, 0xf, 0xf, 0xf }, { 0xe, 0xf, 0xf, 0xf }, { 0xe, 0xf, 0xb, 0xf }, { 0xa, 0xf, 0xb, 0xf }, { 0xa, 0xf, 0xa, 0xf }, { 0xa, 0xd, 0xa, 0xf }, { 0xa, 0xd, 0xa, 0x7 }, { 0xa, 0x5, 0xa, 0x7 }, { 0xa, 0x5, 0xa, 0x5 }, { 0x8, 0x5, 0xa, 0x5 }, { 0x8, 0x5, 0x2, 0x5 }, { 0x0, 0x5, 0x2, 0x5 }, { 0x0, 0x5, 0x0, 0x5 }, { 0x0, 0x4, 0x0, 0x5 }, { 0x0, 0x4, 0x0, 0x1 }, { 0x0, 0x0, 0x0, 0x1 }, { 0x0, 0x0, 0x0, 0x0 } }; /* simple dithering algorithm, really optimized for the 4x4 array */ Image *halftone(cimage, verbose) Image *cimage; unsigned int verbose; { Image *image; unsigned char *sp, *dp, *dp2; /* data pointers */ unsigned int dindex; /* index into dither array */ unsigned int spl; /* source pixel length in bytes */ unsigned int dll; /* destination line length in bytes */ Pixel color; /* pixel color */ unsigned int *index; /* index into dither array for a given pixel */ unsigned int a, x, y; /* random counters */ goodImage(cimage, "dither"); if (BITMAPP(cimage)) return(NULL); /* set up */ if (verbose) { fprintf(stderr, " Halftoning image..."); fflush(stderr); } image= newBitImage(cimage->width * 4, cimage->height * 4); if (cimage->title) { image->title= (char *)lmalloc(strlen(cimage->title) + 13); sprintf(image->title, "%s (halftoned)", cimage->title); } spl= cimage->pixlen; dll= (image->width / 8) + (image->width % 8 ? 1 : 0); /* if the number of possible pixels isn't very large, build an array * which we index by the pixel value to find the dither array index * by color brightness. we do this in advance so we don't have to do * it for each pixel. things will break if a pixel value is greater * than (1 << depth), which is bogus anyway. this calculation is done * on a per-pixel basis if the colormap is too big. */ if (RGBP(cimage) && (cimage->depth <= 16)) { index= (unsigned int *)lmalloc(sizeof(unsigned int) * cimage->rgb.used); for (x= 0; x < cimage->rgb.used; x++) { *(index + x)= ((unsigned long)colorIntensity(*(cimage->rgb.red + x), *(cimage->rgb.green + x), *(cimage->rgb.blue + x))) / GRAYSTEP; if (*(index + x) >= GRAYS) /* rounding errors can do this */ *(index + x)= GRAYS - 1; } } else index= NULL; /* dither each pixel */ sp= cimage->data; dp= image->data; for (y= 0; y < cimage->height; y++) { for (x= 0; x < cimage->width; x++) { dp2= dp + (x >> 1); color= memToVal(sp, spl); if (RGBP(cimage)) { if (index) dindex= *(index + color); else { dindex= ((unsigned long)colorIntensity(cimage->rgb.red[color], cimage->rgb.green[color], cimage->rgb.blue[color])) / GRAYSTEP; } } else { dindex= ((unsigned long)colorIntensity((TRUE_RED(color) << 8), (TRUE_GREEN(color) << 8), (TRUE_BLUE(color) << 8))) / GRAYSTEP; } if (dindex >= GRAYS) /* rounding errors can do this */ dindex= GRAYS - 1; /* loop for the four Y bits in the dither pattern, putting all * four X bits in at once. if you think this would be hard to * change to be an NxN dithering array, you're right, since we're * banking on the fact that we need only shift the mask based on * whether x is odd or not. an 8x8 array wouldn't even need that, * but blowing an image up by 64x is probably not a feature. */ if (x & 1) for (a= 0; a < 4; a++, dp2 += dll) *dp2 |= DitherBits[dindex][a]; else for (a= 0; a < 4; a++, dp2 += dll) *dp2 |= (DitherBits[dindex][a] << 4); sp += spl; } dp += (dll << 2); /* (dll * 4) but I like shifts */ } if (verbose) fprintf(stderr, "done\n"); return(image); } kit/image/image.h010064400237450000000000000125071010174522300134630ustar nishidawheel/* image.h: * * portable image type declarations * * jim frost 10.02.89 * * Copyright 1989 Jim Frost. See included file "copyright.h" for complete * copyright information. */ #include "copyright.h" #include #if defined(SYSV) || defined(VMS) || 1 #include #ifndef index /* some SysV's do this for you */ #define index strchr #endif #ifndef rindex #define rindex strrchr #endif #ifndef HAS_MEMCPY #define HAS_MEMCPY #endif #else /* !SYSV && !VMS */ #include #endif /* !SYSV && !VMS */ #ifdef VMS #define R_OK 4 #define NO_UNCOMPRESS #endif #ifdef HAS_MEMCPY /* equate bcopy w/ memcpy and bzero w/ memset where appropriate. */ #ifndef bcopy #define bcopy(P1,P2,N) memcpy((char *)(P2),(char *)(P1),(N)) #endif #ifndef bzero #define bzero(P,N) memset((P),'\0',(N)) #endif #endif /* HAS_MEMCPY */ typedef unsigned long Pixel; /* what X thinks a pixel is */ typedef unsigned short Intensity; /* what X thinks an RGB intensity is */ typedef unsigned char byte; /* byte type */ struct cache { int len; char buf[BUFSIZ]; struct cache *next; }; typedef struct { unsigned int type; /* ZIO file type */ unsigned int nocache; /* true if caching has been disabled */ FILE *stream; /* file input stream */ char *filename; /* filename */ struct cache *data; /* data cache */ struct cache *dataptr; /* ptr to current cache block */ int bufptr; /* ptr within current cache block */ } ZFILE; #define ZSTANDARD 0 /* standard file */ #define ZPIPE 1 /* file is a pipe (ie uncompress) */ #define ZSTDIN 2 /* file is stdin */ typedef struct rgbmap { unsigned int size; /* size of RGB map */ unsigned int used; /* number of colors used in RGB map */ unsigned int compressed; /* image uses colormap fully */ Intensity *red; /* color values in X style */ Intensity *green; Intensity *blue; } RGBMap; /* image structure */ typedef struct { char *title; /* name of image */ unsigned int type; /* type of image */ RGBMap rgb; /* RGB map of image if IRGB type */ unsigned int width; /* width of image in pixels */ unsigned int height; /* height of image in pixels */ unsigned int depth; /* depth of image in bits if IRGB type */ unsigned int pixlen; /* length of pixel if IRGB type */ byte *data; /* data rounded to full byte for each row */ int trans; /* transparent index in rgb */ } Image; #define IBITMAP 0 /* image is a bitmap */ #define IRGB 1 /* image is RGB */ #define ITRUE 2 /* image is true color */ #define BITMAPP(IMAGE) ((IMAGE)->type == IBITMAP) #define RGBP(IMAGE) ((IMAGE)->type == IRGB) #define TRUEP(IMAGE) ((IMAGE)->type == ITRUE) #define TRUE_RED(PIXVAL) (((PIXVAL) & 0xff0000) >> 16) #define TRUE_GREEN(PIXVAL) (((PIXVAL) & 0xff00) >> 8) #define TRUE_BLUE(PIXVAL) ((PIXVAL) & 0xff) #define RGB_TO_TRUE(R,G,B) \ ((((R) & 0xff00) << 8) | ((G) & 0xff00) | ((B) >> 8)) /* special case 1-byte transfers so they're inline */ #define memToVal(PTR,LEN) ((LEN) == 1 ? (unsigned long)(*(PTR)) : \ doMemToVal(PTR,LEN)) #define memToValLSB(PTR,LEN) ((LEN) == 1 ? (unsigned long)(*(PTR)) : \ doMemToValLSB(PTR,LEN)) #define valToMem(VAL,PTR,LEN) ((LEN) == 1 ? \ (unsigned long)(*(PTR) = (byte)(VAL)) : \ doValToMem(VAL,PTR,LEN)) #define valToMemLSB(VAL,PTR,LEN) ((LEN) == 1 ? \ (unsigned long)(*(PTR) = (byte)(VAL)) : \ (int)doValToMemLSB(VAL,PTR,LEN)) /* SUPPRESS 558 */ /* function declarations */ Image *clip(); /* clip.c */ void brighten(); /* bright.c */ void equalize(); void gray(); Image *normalize(); void compress_colormap(); /* compress.c */ Image *dither(); /* dither.c */ void fill(); /* fill.c */ void fold(); /* fold.c */ Image *halftone(); /* halftone.c */ Image *loadImage(); /* imagetypes.c */ void identifyImage(); void goodImage(); Image *merge(); /* merge.c */ extern unsigned long DepthToColorsTable[]; /* new.c */ unsigned long colorsToDepth(); char *dupString(); Image *newBitImage(); Image *newRGBImage(); Image *newTrueImage(); void freeImage(); void freeImageData(); void newRGBMapData(); void freeRGBMapData(); byte *lcalloc(); byte *lmalloc(); void lfree(); #define depthToColors(n) DepthToColorsTable[((n) < 32 ? (n) : 32)] Image *reduce(); /* reduce.c */ Image *expand(); Image *rotate(); /* rotate.c */ Image *smooth(); /* smooth.c */ /* doMemToVal and doMemToValLSB used to be void type but some compilers * (particularly the 4.1.1 SunOS compiler) couldn't handle the * (void)(thing= value) conversion used in the macros. */ unsigned long doMemToVal(); /* value.c */ unsigned long doValToMem(); unsigned long doMemToValLSB(); unsigned long doValToMemLSB(); void flipBits(); #ifdef __APPLE__ /* darwin has zopen() */ ZFILE *zzopen(); /* zio.c */ #define zopen zzopen #else ZFILE *zopen(); /* zio.c */ #endif int zread(); int zgetc(); char *zgets(); void zclose(); void znocache(); void zreset(); Image *zoom(); /* zoom.c */ /* this returns the (approximate) intensity of an RGB triple */ #define colorIntensity(R,G,B) \ (RedIntensity[(R) >> 8] + GreenIntensity[(G) >> 8] + BlueIntensity[(B) >> 8]) extern unsigned short RedIntensity[]; extern unsigned short GreenIntensity[]; extern unsigned short BlueIntensity[]; extern void cleanup(int); kit/image/imagetypes.c010064400237450000000000000065700723153110200145450ustar nishidawheel/* imagetypes.c: * * this contains things which reference the global ImageTypes array * * jim frost 09.27.89 * * Copyright 1989, 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "image.h" #include "imagetypes.h" #include /* some of these are order-dependent */ static struct imagetypes { int (*identifier)(); /* print out image info if this kind of image */ Image *(*loader)(); /* load image if this kind of image */ char *name; /* name of this image format */ } ImageTypes[] = { #ifdef USE_IMLIB { imIdent, imLoad, "Imlib" }, #else { fbmIdent, fbmLoad, "FBM Image" }, { sunRasterIdent, sunRasterLoad, "Sun Rasterfile" }, { cmuwmIdent, cmuwmLoad, "CMU WM Raster" }, { pbmIdent, pbmLoad, "Portable Bit Map (PBM, PGM, PPM)" }, { facesIdent, facesLoad, "Faces Project" }, #ifdef USE_GIF { gifIdent, gifLoad, "GIF Image" }, #endif #ifdef USE_PNG { pngIdent, pngLoad, "PNG Image" }, #endif { rleIdent, rleLoad, "Utah RLE Image" }, { jpegIdent, jpegLoad, "JFIF-style JPEG Image" }, { xwdIdent, xwdLoad, "X Window Dump" }, { mcidasIdent, mcidasLoad, "McIDAS areafile" }, { g3Ident, g3Load, "G3 FAX Image" }, { pcxIdent, pcxLoad, "PC Paintbrush Image" }, { imgIdent, imgLoad, "GEM Bit Image" }, { macIdent, macLoad, "MacPaint Image" }, { xpixmapIdent, xpixmapLoad, "X Pixmap" }, { xbitmapIdent, xbitmapLoad, "X Bitmap" }, #endif { NULL, NULL, NULL } }; /* SUPPRESS 560 */ extern int errno; extern int findImage(char *, char *); /* load a named image */ Image *loadImage(name, verbose) char *name; unsigned int verbose; { char fullname[BUFSIZ]; Image *image; int a; if (findImage(name, fullname) < 0) { if (errno == ENOENT) fprintf(stderr, "%s: image not found\n", name); else perror(fullname); return(NULL); } for (a= 0; ImageTypes[a].loader; a++) if ((image = ImageTypes[a].loader(fullname, name, verbose))) { zreset(NULL); return(image); } fprintf(stderr, "%s: unknown or unsupported image type\n", fullname); zreset(NULL); return(NULL); } /* identify what kind of image a named image is */ void identifyImage(name) char *name; { char fullname[BUFSIZ]; int a; if (findImage(name, fullname) < 0) { if (errno == ENOENT) fprintf(stderr, "%s: image not found\n", name); else perror(fullname); return; } for (a= 0; ImageTypes[a].identifier; a++) { if (ImageTypes[a].identifier(fullname, name)) { zreset(NULL); return; } } zreset(NULL); fprintf(stderr, "%s: unknown or unsupported image type\n", fullname); } /* tell user what image types we support */ void supportedImageTypes() { int a; fprintf(stderr, "Image types supported:\n"); for (a= 0; ImageTypes[a].name; a++) fprintf(stderr, " %s\n", ImageTypes[a].name); } void goodImage(image, func) Image *image; char *func; { if (!image) { fprintf(stderr, "%s: nil image\n", func); cleanup(-1); } switch (image->type) { case IBITMAP: case IRGB: case ITRUE: break; default: fprintf(stderr, "%s: bad destination image\n", func); cleanup(-1); } } kit/image/imagetypes.h010064400237450000000000000015601011524341000145410ustar nishidawheel/* imagetypes.h: * * supported image types and the imagetypes array declaration. when you * add a new image type, only the makefile and this header need to be * changed. * * jim frost 10.15.89 */ Image *facesLoad(); Image *pbmLoad(); Image *sunRasterLoad(); Image *gifLoad(); Image *rleLoad(); Image *xwdLoad(); Image *xbitmapLoad(); Image *xpixmapLoad(); Image *g3Load(); Image *fbmLoad(); Image *pcxLoad(); Image *imgLoad(); Image *macLoad(); Image *cmuwmLoad(); Image *mcidasLoad(); Image *jpegLoad(); Image *imLoad(); int facesIdent(); int pbmIdent(); int sunRasterIdent(); int gifIdent(); int rleIdent(); int xwdIdent(); int xbitmapIdent(); int xpixmapIdent(); int g3Ident(); int fbmIdent(); int pcxIdent(); int imgIdent(); int macIdent(); int cmuwmIdent(); int mcidasIdent(); int jpegIdent(); int imIdent(); #ifdef USE_PNG int pngIdent(); Image *pngLoad(); #endif kit/image/img.c010064400237450000000000000165070647077534300132000ustar nishidawheel/* ** img.c - load a GEM Bit Image file for use inside xloadimage ** ** Tim Northrup ** ** Version 0.1 -- 4/25/91 -- Initial cut ** ** Copyright (C) 1991 Tim Northrup ** (see file "tgncpyrght.h" for complete copyright information) */ #include #include "tgncpyrght.h" #include "image.h" #include "img.h" static int Debug = 0; /* Set to 1 for info */ static unsigned char *BitRow; /* working row of bits */ static int RowRepeat; /* number of repititons */ static int RowCount; /* current row */ static int ColCount; /* current column */ static int IMG_ReadHeader(); /* Read file header */ static void IMG_WriteByte(); /* Write output byte */ /* ** imgIdent ** ** Identify passed file as a GEM Bit Image or not ** ** Returns 1 if file is a GEM Image, 0 otherwise */ unsigned int imgIdent (fullname,name) char *fullname, *name; { ZFILE *zf; /* Input file */ IMG_Header header; /* GEM Image header info */ unsigned int ret = 0; /* Return value */ if ( ! (zf = zopen(fullname))) return(0); if (IMG_ReadHeader(zf,&header) == 0) { fprintf(stderr, "%s is a %dx%d GEM Bit Image\n", fullname, header.llen, header.lines); ret = 1; } zclose(zf); return(ret); } /* ** imgLoad ** ** Load GEM Image file into an Image structure. ** ** Returns pointer to allocated struct if successful, NULL otherwise */ Image *imgLoad (fullname,name,verbose) char *fullname, *name; unsigned int verbose; { register int i; /* Random index */ ZFILE *zf; /* Input file */ short creps; /* Repetition counter */ short ictr; /* Secondary index counter */ unsigned int bpl; /* Bytes per scanline */ Image *image; /* Allocated image struct */ IMG_Header header; /* GEM Image header */ unsigned char inbuf[MAX_LITERAL], ichr; /* Input buffer/char */ if ( ! (zf = zopen(fullname))) return((Image *)NULL); if ((i = IMG_ReadHeader(zf,&header)) != 0) { zclose(zf); switch (i) { case 1: /* short read in header */ case 2: /* not a GEM image */ break; case 3: fprintf(stderr, " Color GEM images are not supported (yet)\n"); break; case 4: fprintf(stderr, " GEM image is too large\n"); break; default: fprintf(stderr, " Unsupported GEM image pattern length\n"); break; } return((Image *)NULL); } if (verbose) fprintf(stderr, "%s is a %dx%d GEM Image\n",name,header.llen,header.lines); znocache(zf); image = newBitImage(header.llen,header.lines); BitRow = &(image->data[0]); bpl = header.llen / 8; /* bytes per line */ ColCount = 0; /* starting column */ RowCount = 0; /* starting row */ RowRepeat = 1; /* default repeat */ while (RowCount < header.lines) { /* While the last line has not been reached ... */ i = zgetc(zf); if (i == EOF) { fprintf(stderr, "GEM Image Failure: premature EOF\n"); break; } if (i == BYTE_FLAG) { /* scanline */ i = zgetc(zf); if (i == EOF) { fprintf(stderr, "GEM Image Failure: premature EOF\n"); break; } if (i == BYTE_SLREPEAT) { /* repeat scanline */ if (ColCount != 0) { fprintf(stderr, "GEM Image Failure: corrupted\n"); break; } i = zgetc(zf); /* SLFLAG byte (0xFF) */ if (i != BYTE_SLFLAG) { fprintf(stderr, "GEM Image Failure: corrupted\n"); break; } RowRepeat = zgetc(zf); /* repeat count */ } else { /* repeat pattern_len */ creps = i; zread(zf,inbuf,header.patlen); for (i = 0 ; i < creps ; i++) for (ictr = 0 ; ictr < header.patlen ; ictr++) IMG_WriteByte(inbuf[ictr],header.llen,bpl); } } else if (i == BYTE_LITERAL) { /* literal follows */ creps = zgetc(zf); /* literal length */ zread(zf,inbuf,creps); /* literal */ for (ictr = 0 ; ictr < creps ; ictr++) IMG_WriteByte(inbuf[ictr],header.llen,bpl); } else { /* monochrome mode bits */ creps = RUN_LENGTH(i); ichr = (RUN_COLOR(i) == 1) ? BYTE_BLACK : BYTE_WHITE; for (i = 0 ; i < creps ; i++) IMG_WriteByte(ichr,header.llen,bpl); } } zclose(zf); image->title = dupString(name); return(image); } /* ** IMG_ReadHeader ** ** Read in IMG file header information, skip extras. ** ** Returns 0 if successful ** 1 if not enough file for header record ** 2 if header data is nonsensical/invalid ** 3 if image is color (unsupported) ** 4 if image is too wide ( > 8K bits!!) ** 5 if pattern length is too big ( > 255) */ static int IMG_ReadHeader (zf,h) ZFILE *zf; IMG_Header *h; { register int tlen; /* total to read in */ register int rlen; /* read lengths */ unsigned char junkbuffer[MAX_SCANLINE]; /* scrap buffer */ tlen = zread(zf,junkbuffer,(DEF_HLEN * 2)); if (tlen != (DEF_HLEN * 2)) return(1); /* not enough data */ /* convert from big-endian to machine specific */ h->vers = junkbuffer[1] + (256 * junkbuffer[0]); h->hlen = junkbuffer[3] + (256 * junkbuffer[2]); h->colors = junkbuffer[5] + (256 * junkbuffer[4]); h->patlen = junkbuffer[7] + (256 * junkbuffer[6]); h->pixw = junkbuffer[9] + (256 * junkbuffer[8]); h->pixh = junkbuffer[11] + (256 * junkbuffer[10]); h->llen = junkbuffer[13] + (256 * junkbuffer[12]); h->lines = junkbuffer[15] + (256 * junkbuffer[14]); /* sanity check; if fields don't look right, it's probably not a GEM * image. */ if ((h->vers != DEF_VERSION) || (h->hlen < DEF_HLEN) || (h->colors < 0) || (h->colors > 256) || (h->pixw < 1) || (h->pixh < 1) || (h->llen < 1) || (h->llen > (MAX_SCANLINE * 8)) || (h->lines < 1) || (h->lines > 8192) || (h->patlen < 0) || (h->patlen > MAX_LITERAL)) return(2); if (Debug) { fprintf(stderr,"Header Information:\n"); fprintf(stderr,"\tIMG Version: %d\n",h->vers); fprintf(stderr,"\t Header Len: %d\n",h->hlen); fprintf(stderr,"\t Colors: %d\n",h->colors); fprintf(stderr,"\tPattern Len: %d\n",h->patlen); fprintf(stderr,"\t Pixel Size: %d x %d (microns=1000th mm)\n", h->pixw,h->pixh); fprintf(stderr,"\t Image Size: %d x %d (pixels)\n", h->llen,h->lines); } /* validity check on particular fields */ if (h->colors != 1) return(3); if (h->llen > (MAX_SCANLINE * 8)) return(4); if (h->patlen > MAX_LITERAL) return(5); /* make life easier if not on an even boundary */ if (h->llen % 8) { h->llen += (8 - (h->llen % 8)); if (Debug) fprintf(stderr,"Image expanded to %d pixels wide\n", h->llen); } /* skip additional header information if present */ if (h->hlen > DEF_HLEN) { tlen = ((h->hlen - DEF_HLEN) * 2); if (Debug) fprintf(stderr,"%d bytes of extra header skipped",tlen); for ( ; tlen > 0 ; tlen -= rlen) { rlen = (tlen > MAX_SCANLINE) ? MAX_SCANLINE : tlen; zread(zf,junkbuffer,rlen); } } return(0); } /* ** IMG_WriteByte ** ** Add byte to image; if end of scanline, may need to replicate it ** ** Returns no value (void function) */ static void IMG_WriteByte (c,cols,bpl) unsigned char c; register int cols; unsigned int bpl; { register int i; register unsigned char *ptr; register unsigned char *ptr2; BitRow[ColCount] = c; if (++ColCount >= bpl) { /* end of scanline */ ptr2 = BitRow + bpl; RowCount++; /* count one already out */ while (--RowRepeat > 0) { for (ptr = BitRow, i = 0 ; i < bpl ; i++, ptr++) *ptr2++ = *ptr; RowCount++; } BitRow = ptr2; ColCount = 0; RowRepeat = 1; } return; } kit/image/img.h010064400237450000000000000042610642466043000131640ustar nishidawheel/* ** img.h - structures/definitions for GEM Bit Image format conversion ** ** Tim Northrup ** ** Version 0.1 -- 4/25/91 -- Initial cut ** ** Copyright (C) 1991 Tim Northrup ** (see file "tgncpyrght.h" for complete copyright information) */ #ifndef GEM_H #define GEM_H /* ** Standard IMG Header Structure (8 words long) ** ** May be followed by implementation-dependent information, so the ** value of hlen should be checked on input. */ typedef struct { short vers, /* image version number */ hlen, /* header length (in words) */ colors, /* number of color planes (1=mono) */ patlen, /* pattern length (for encoding) */ pixw, pixh, /* pixel dimensions (in microns) */ llen, lines; /* pixels/line and number of lines */ } IMG_Header; /* ** Header record values used when creating an IMG file */ #define DEF_VERSION 1 /* default version number (on output) */ #define DEF_HLEN 8 /* always standard header */ #define DEF_COLORS 1 /* always B/W pics */ #define DEF_PATLEN 1 /* easiest pattern size */ #define DEF_PIXW 85 /* just a guess on this one */ #define DEF_PIXH 85 /* assumed 1:1 aspect ratio */ /* ** Program limits and other constants */ #define MAX_SCANLINE 1024 /* max bytes for 1 scanline */ #define MAX_SLREPEAT 255 /* max repititions of scanline */ #define MAX_PATREPEAT 255 /* max repititions of pattern */ #define MAX_BYTEREPEAT 127 /* max repititions of byte value */ #define MAX_LITERAL 255 /* max literal length allowed */ #define BYTE_FLAG 0x00 /* first byte 0 the ... */ #define BYTE_SLREPEAT 0x00 /* second 0 means scanline repeat */ #define BYTE_SLFLAG 0xFF /* always followed by FF (?) */ #define BYTE_LITERAL 0x80 /* char 80h - flag literal string */ #define BYTE_BLACK 0xFF /* byte is all 1's */ #define BIT_BLACK 1 /* single black bit */ #define BYTE_WHITE 0x00 /* byte is all 0's */ #define BIT_WHITE 0 /* single white bit */ #define RUN_BLACK 0x80 /* bit flag for run of all 0's or 1's */ #define RUN_WHITE 0x00 #define RUN_LENGTH(X) ((X) & 0x7F) #define RUN_COLOR(X) ((((X) & RUN_BLACK) == RUN_BLACK)?BIT_BLACK:BIT_WHITE) #define PIXEL_COLOR(X) ((((X) & 0x01) == 1)?BIT_BLACK:BIT_WHITE) #endif /* GEM_H */ kit/image/imlib_loader.c010064400237450000000000000077011114676321700150330ustar nishidawheel #ifdef USE_IMLIB #include "image.h" #include #include #include #include #define IMFILENUM 500 static char imfile[IMFILENUM][1024]; static Imlib_Image *imdata[IMFILENUM]; static Image *imagedata[IMFILENUM]; static int imnum; static Imlib_Context *id; int imIdent(char *fullname, char *name) { return 1; } Image *imLoad(char *fullname, char *name, unsigned int verbose) { static Display *disp = NULL; Image *image = NULL; Imlib_Image *im; unsigned int w,h, size, i; DATA32 * argb_data; byte * rgb_ptr; Imlib_Image *search_imdata(); void regist_imdata(); if (disp == NULL) { disp=XOpenDisplay(NULL); } /* if (id == NULL) id=Imlib_init(disp); */ /* might needs more work */ if (id == NULL) { /* dither for non-truecolor displays */ imlib_context_set_dither(1); imlib_context_set_display(disp); imlib_context_set_visual(DefaultVisual(disp, DefaultScreen(disp))); imlib_context_set_colormap(DefaultColormap(disp, DefaultScreen(disp))); } if ((im = search_imdata(fullname), image) == NULL) { /* im = Imlib_load_image(id, fullname); */ im = imlib_load_image(fullname); } if (im == NULL) { return NULL; } imlib_context_set_image(im); w = imlib_image_get_width(); h = imlib_image_get_height(); size = w * h; if (image == NULL) image = newTrueImage(w, h); /* Imlib2 stores images in ARGB format (32 bpp). MagicPoint * wants RGB data (24 bpp). So we need a conversion pass. */ argb_data = imlib_image_get_data_for_reading_only(); rgb_ptr = image->data; for (i = 0; i < size; ++i) { if ((argb_data[i] >> 24) < 128) { /* If this is a transparent pixel, we store #FE00FE. */ *rgb_ptr++ = 0xFE; *rgb_ptr++ = 0x00; *rgb_ptr++ = 0xFE; /* Tell mgp we have transparent pixels. */ image->trans = 0xFE00FE; } else if ((argb_data[i] & 0x00FFFFFF) == 0x00FE00FE) { /* If that color is actually used, we substitute something close. */ *rgb_ptr++ = 0xFF; *rgb_ptr++ = 0x00; *rgb_ptr++ = 0xFE; } else { /* Otherwise, we can copy the pixel. */ *rgb_ptr++ = (argb_data[i] >> 16) & 0xFF; /* red */ *rgb_ptr++ = (argb_data[i] >> 8) & 0xFF; /* green */ *rgb_ptr++ = argb_data[i] & 0xFF; /* blue */ } } #if 0 /* * bug fix for transparent gif handling * suggested by Jose Geraldo Alves Brito Neto */ if ((shape.r >=0) && (shape.g >= 0) && (shape.b >= 0)) image->trans = \ ((shape.r & 0xff) << 16) | ((shape.g & 0xff) << 8) | ((shape.b & 0xff) << 0); #endif image->title = dupString(name); #if 0 Imlib_kill_image(id, im); #else regist_imdata(name, im, image); #endif return image; } Imlib_Image *search_imdata(char *fullname, Image *image) { int i; for (i = 0; i < imnum; i ++){ if (!strcmp(imfile[i], fullname)) { image = imagedata[i]; return imdata[i]; } } return NULL; } void regist_imdata(fullname, im, image) char *fullname; Imlib_Image *im; Image *image; { strcpy(imfile[imnum], fullname); imdata[imnum] = im; imagedata[imnum] = image; imnum ++; } Pixmap pixmap_fromimimage(imimage, width, height) Imlib_Image *imimage; int width, height; { static Pixmap pixmap; #if 0 Imlib_render(id, imimage, width, height); pixmap = Imlib_move_image(id, imimage); #else imlib_render_pixmaps_for_whole_image_at_size(&pixmap, NULL, width, height); #endif return pixmap; } #define MAXPMAP 100 void manage_pixmap(pixmap, add, page) Pixmap pixmap; int add; int page; { static Pixmap pmap[MAXPMAP]; static int ppage[MAXPMAP]; int i; if (add) { for (i = 0; i < MAXPMAP; i ++) { if (pmap[i] == pixmap) return; } for (i = 0; i < MAXPMAP; i ++) { if (!pmap[i]) break; } if (i == MAXPMAP) { fprintf(stderr, "warning: too many images in manage_pixmap\n"); return; } pmap[i] = pixmap; ppage[i] = page; } else { for (i = 0; i < MAXPMAP; i ++) { if (ppage[i] == page && pmap[i] != 0){ imlib_free_pixmap_and_mask(pmap[i]); pmap[i] = 0; } } } } #endif kit/image/jpeg.c010064400237450000000000003145570664163775500133630ustar nishidawheel/* * JPEG software copyright: * * The authors make NO WARRANTY or representation, either express or implied, * with respect to this software, its quality, accuracy, merchantability, or * fitness for a particular purpose. This software is provided "AS IS", and you, * its user, assume the entire risk as to its quality and accuracy. * * This software is copyright (C) 1991, Thomas G. Lane. * All Rights Reserved except as specified below. * * Permission is hereby granted to use, copy, modify, and distribute this * software (or portions thereof) for any purpose, without fee, subject to these * conditions: * (1) If any part of the source code for this software is distributed, then this * README file must be included, with this copyright and no-warranty notice * unaltered; and any additions, deletions, or changes to the original files * must be clearly indicated in accompanying documentation. * (2) If only executable code is distributed, then the accompanying * documentation must state that "this software is based in part on the work of * the Independent JPEG Group". * (3) Permission for use of this software is granted only if the user accepts * full responsibility for any undesirable consequences; the authors accept * NO LIABILITY for damages of any kind. * * Permission is NOT granted for the use of any author's name or author's company * name in advertising or publicity relating to this software or products derived * from it. This software may be referred to only as "the Independent JPEG * Group's software". * * We specifically permit and encourage the use of this software as the basis of * commercial products, provided that all warranty or liability claims are * assumed by the product vendor. * */ /* * jpeg - This is a quick hack to give xloadimage the ability to * read a JFIF file. The jpeg sofware is based on the first public * release of the Independent JPEG Group's free JPEG software. * * Graeme Gill 18/11/91 * */ #undef DEBUG #ifdef DEBUG # define debug(xx) fprintf(stderr,xx) #else # define debug(xx) #endif #include "image.h" #include "jpeg.h" METHODDEF int read_jpeg_data (); int jpegIdent(fullname, name) char *fullname, *name; { struct decompress_info_struct cinfo; struct decompress_methods_struct dc_methods; struct external_methods_struct e_methods; int retv = 0; /* Initialize the system-dependent method pointers. */ cinfo.methods = &dc_methods; cinfo.emethods = &e_methods; jselerror(&e_methods); /* error/trace message routines */ jselvirtmem(&e_methods); /* memory allocation routines */ dc_methods.d_ui_method_selection = jselwxli; dc_methods.read_jpeg_data = read_jpeg_data; /* Tell methods about input file */ cinfo.filename = name; cinfo.input_file = zopen(fullname); cinfo.verbose = 1; cinfo.image = NULL; /* in case we fail */ /* Allocate memory for input buffer. */ cinfo.input_buffer = (char *) (*cinfo.emethods->alloc_small) ((size_t) (JPEG_BUF_SIZE + MIN_UNGET)); cinfo.bytes_in_buffer = 0; /* initialize buffer to empty */ cinfo.eof_found = FALSE; /* Set up default parameters. */ e_methods.trace_level = 0; cinfo.do_block_smoothing = FALSE; cinfo.do_pixel_smoothing = FALSE; cinfo.out_color_space = CS_RGB; cinfo.jpeg_color_space = CS_UNKNOWN; /* Set up to read a JFIF or baseline-JPEG file. */ /* A smarter UI would inspect the first few bytes of the input file */ /* to determine its type. */ jselrjfif(&cinfo); /* Do it to it! */ if (cinfo.input_file != NULL) { if (jpeg_decompress(&cinfo, TRUE)) retv = 1; zclose(cinfo.input_file); } /* Release memory. */ (*cinfo.emethods->free_small) ((void *) cinfo.input_buffer); /* All done. */ return retv; } Image *jpegLoad(fullname,name,verbose) char *fullname,*name; unsigned int verbose; { struct decompress_info_struct cinfo; struct decompress_methods_struct dc_methods; struct external_methods_struct e_methods; /* Initialize the system-dependent method pointers. */ cinfo.methods = &dc_methods; cinfo.emethods = &e_methods; jselerror(&e_methods); /* error/trace message routines */ jselvirtmem(&e_methods); /* memory allocation routines */ dc_methods.d_ui_method_selection = jselwxli; dc_methods.read_jpeg_data = read_jpeg_data; cinfo.eof_found = FALSE; /* Tell methods about input file */ cinfo.filename = name; cinfo.input_file = zopen(fullname); cinfo.verbose = verbose; cinfo.image = NULL; /* in case we fail */ cinfo.rows_put = 0; /* Allocate memory for input buffer. */ cinfo.input_buffer = (char *) (*cinfo.emethods->alloc_small) ((size_t) (JPEG_BUF_SIZE + MIN_UNGET)); cinfo.bytes_in_buffer = 0; /* initialize buffer to empty */ /* Set up default parameters. */ e_methods.trace_level = 0; cinfo.do_block_smoothing = FALSE; cinfo.do_pixel_smoothing = FALSE; cinfo.out_color_space = CS_RGB; cinfo.jpeg_color_space = CS_UNKNOWN; /* Set up to read a JFIF or baseline-JPEG file. */ /* A smarter UI would inspect the first few bytes of the input file */ /* to determine its type. */ jselrjfif(&cinfo); /* Do it to it! */ if (cinfo.input_file != NULL) { jpeg_decompress(&cinfo, FALSE); if (cinfo.image != NULL && cinfo.eof_found) fprintf(stderr, "jpeg: Short read data in file"); zclose(cinfo.input_file); } /* Release memory. */ (*cinfo.emethods->free_small) ((void *) cinfo.input_buffer); /* All done. */ return (cinfo.image); } /*****************************************/ /* Output stuff */ /*****************************************/ METHODDEF void output_init (cinfo) decompress_info_ptr cinfo; { int i; if (cinfo->out_color_space == CS_GRAYSCALE) { cinfo->image = newRGBImage(cinfo->image_width,cinfo->image_height,8); cinfo->image->title = dupString(cinfo->filename); /* set a linear map */ for(i=0;i<256;i++) { *(cinfo->image->rgb.red + i) = *(cinfo->image->rgb.green + i) = *(cinfo->image->rgb.blue + i) = i<<8; } cinfo->image->rgb.used = 256; } else if (cinfo->out_color_space == CS_RGB) { cinfo->image = newTrueImage(cinfo->image_width,cinfo->image_height); cinfo->image->title = dupString(cinfo->filename); } else { cinfo->image = NULL; fprintf(stderr, "Can't cope with JPEG image type\n"); } } /* * Write some pixel data. */ METHODDEF void put_pixel_rows (cinfo, num_rows, pixel_data) decompress_info_ptr cinfo; int num_rows; JSAMPIMAGE pixel_data; { register unsigned char *bufp; register JSAMPROW ptr0, ptr1, ptr2; register long col; register long width = cinfo->image_width; register int row; /* Assume JSAMPLE == chars */ if (cinfo->out_color_space == CS_GRAYSCALE) { bufp = cinfo->image->data + cinfo->rows_put * width; for (row = 0; row < num_rows; row++) { memcpy(bufp, pixel_data[0][row], width); bufp += width; } } else { bufp = cinfo->image->data + cinfo->rows_put * width * 3; for (row = 0; row < num_rows; row++) { ptr0 = pixel_data[0][row]; ptr1 = pixel_data[1][row]; ptr2 = pixel_data[2][row]; for (col = width; col > 0; col--) { *bufp = *ptr0; bufp++; ptr0++; *bufp = *ptr1; bufp++; ptr1++; *bufp = *ptr2; bufp++; ptr2++; } } } cinfo->rows_put += num_rows; } /* * Finish up at the end of the file. */ METHODDEF void output_term (cinfo) decompress_info_ptr cinfo; { zclose(cinfo->input_file); } /* * The method selection routine for xloadimage internal format output. */ GLOBAL void jselwxli (cinfo) decompress_info_ptr cinfo; { /* if grayscale or CMYK input, force similar output; */ /* else leave the output colorspace as set by options. */ if (cinfo->jpeg_color_space == CS_GRAYSCALE) cinfo->out_color_space = CS_GRAYSCALE; else if (cinfo->jpeg_color_space == CS_CMYK) cinfo->out_color_space = CS_CMYK; cinfo->methods->output_init = output_init; cinfo->methods->put_pixel_rows = put_pixel_rows; cinfo->methods->output_term = output_term; } /*****************************************/ /* Input Stuff */ /*****************************************/ /* * Reload the input buffer after it's been emptied, and return the next byte. * See the JGETC macro for calling conditions. * * This routine would need to be replaced if reading JPEG data from something * other than a stdio stream. */ METHODDEF int read_jpeg_data (cinfo) decompress_info_ptr cinfo; { cinfo->bytes_in_buffer = zread(cinfo->input_file, cinfo->input_buffer + MIN_UNGET, JPEG_BUF_SIZE); cinfo->next_input_byte = cinfo->input_buffer + MIN_UNGET; if (cinfo->bytes_in_buffer <= 0) cinfo->eof_found = TRUE; return JGETC(cinfo); } /* ########################################################################## */ /* * jdmaster.c * */ METHODDEF void d_per_scan_method_selection (cinfo) decompress_info_ptr cinfo; /* Central point for per-scan method selection */ { /* MCU disassembly */ jseldmcu(cinfo); /* Un-subsampling of pixels */ jselunsubsample(cinfo); } LOCAL void d_initial_method_selection (cinfo) decompress_info_ptr cinfo; /* Central point for initial method selection (after reading file header) */ { /* JPEG file scanning method selection is already done. */ /* So is output file format selection (both are done by user interface). */ /* Entropy decoding: either Huffman or arithmetic coding. */ #ifdef ARITH_CODING_SUPPORTED jseldarithmetic(cinfo); #else if (cinfo->arith_code) { ERREXIT(cinfo->emethods, "Arithmetic coding not supported"); } #endif jseldhuffman(cinfo); /* Cross-block smoothing */ #ifdef BLOCK_SMOOTHING_SUPPORTED jselbsmooth(cinfo); #else cinfo->do_block_smoothing = FALSE; #endif /* Gamma and color space conversion */ jseldcolor(cinfo); /* Pipeline control */ jseldpipeline(cinfo); /* Overall control (that's me!) */ cinfo->methods->d_per_scan_method_selection = d_per_scan_method_selection; } LOCAL void initial_setup (cinfo) decompress_info_ptr cinfo; /* Do computations that are needed before initial method selection */ { short ci; jpeg_component_info *compptr; /* Compute maximum sampling factors; check factor validity */ cinfo->max_h_samp_factor = 1; cinfo->max_v_samp_factor = 1; for (ci = 0; ci < cinfo->num_components; ci++) { compptr = &cinfo->comp_info[ci]; if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) ERREXIT(cinfo->emethods, "Bogus sampling factors"); cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, compptr->h_samp_factor); cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, compptr->v_samp_factor); } /* Compute logical subsampled dimensions of components */ for (ci = 0; ci < cinfo->num_components; ci++) { compptr = &cinfo->comp_info[ci]; compptr->true_comp_width = (cinfo->image_width * compptr->h_samp_factor + cinfo->max_h_samp_factor - 1) / cinfo->max_h_samp_factor; compptr->true_comp_height = (cinfo->image_height * compptr->v_samp_factor + cinfo->max_v_samp_factor - 1) / cinfo->max_v_samp_factor; } } /* * This is the main entry point to the JPEG decompressor. * Set identify TRUE if you just want to check if this is a JPEG file. * This returns TRUE if we think it is a JPEG file. */ GLOBAL boolean jpeg_decompress (cinfo, identify) decompress_info_ptr cinfo; boolean identify; { short i; boolean retv = FALSE; /* Initialize pointers as needed to mark stuff unallocated. */ cinfo->comp_info = NULL; for (i = 0; i < NUM_QUANT_TBLS; i++) cinfo->quant_tbl_ptrs[i] = NULL; for (i = 0; i < NUM_HUFF_TBLS; i++) { cinfo->dc_huff_tbl_ptrs[i] = NULL; cinfo->ac_huff_tbl_ptrs[i] = NULL; } /* Read the JPEG file header markers; everything up through the first SOS * marker is read now. NOTE: the user interface must have initialized the * read_file_header method pointer (eg, by calling jselrjfif or jselrtiff). * The other file reading methods (read_scan_header etc.) were probably * set at the same time, but could be set up by read_file_header itself. */ if (! ((*cinfo->methods->read_file_header) (cinfo))) goto rett; /* image will be null */ if (! ((*cinfo->methods->read_scan_header) (cinfo))) goto rett; /* Empty JPEG file - something went wrong */ if (cinfo->verbose) { fprintf(stderr, "%s is a %dx%d JPEG Image, color space ", cinfo->filename, (int) cinfo->image_width, (int) cinfo->image_height); switch (cinfo->jpeg_color_space) { case CS_UNKNOWN: fprintf(stderr, "Unknown"); break; case CS_GRAYSCALE: fprintf(stderr, "Grayscale"); break; case CS_RGB: fprintf(stderr, "RGB"); break; case CS_YCbCr: fprintf(stderr, "YCbCr"); break; case CS_YIQ: fprintf(stderr, "YIQ"); break; case CS_CMYK: fprintf(stderr, "CMYK"); break; } fprintf(stderr, ", %d comp%s,",cinfo->num_components, cinfo->num_components ? "s." : "."); if (cinfo->arith_code) fprintf(stderr, " Arithmetic coding\n"); else fprintf(stderr, " Huffman coding\n"); } if (identify) { retv = TRUE; goto rett; } /* Give UI a chance to adjust decompression parameters and select */ /* output file format based on info from file header. */ (*cinfo->methods->d_ui_method_selection) (cinfo); /* Now select methods for decompression steps. */ initial_setup(cinfo); d_initial_method_selection(cinfo); /* Initialize the output file & other modules as needed */ (*cinfo->methods->output_init) (cinfo); (*cinfo->methods->colorout_init) (cinfo); /* And let the pipeline controller do the rest. */ (*cinfo->methods->d_pipeline_controller) (cinfo); /* Finish output file, release working storage, etc */ (*cinfo->methods->colorout_term) (cinfo); (*cinfo->methods->output_term) (cinfo); (*cinfo->methods->read_file_trailer) (cinfo); /* Release allocated storage for tables */ #define FREE(ptr) if ((ptr) != NULL) \ (*cinfo->emethods->free_small) ((void *) ptr) rett: FREE(cinfo->comp_info); for (i = 0; i < NUM_QUANT_TBLS; i++) FREE(cinfo->quant_tbl_ptrs[i]); for (i = 0; i < NUM_HUFF_TBLS; i++) { FREE(cinfo->dc_huff_tbl_ptrs[i]); FREE(cinfo->ac_huff_tbl_ptrs[i]); } if (cinfo->image != NULL) retv = TRUE; /* My, that was easy, wasn't it? */ return retv; } /* ########################################################################## */ /* * jrdjfif.c * */ typedef enum { /* JPEG marker codes */ M_SOF0 = 0xc0, M_SOF1 = 0xc1, M_SOF2 = 0xc2, M_SOF3 = 0xc3, M_SOF5 = 0xc5, M_SOF6 = 0xc6, M_SOF7 = 0xc7, M_JPG = 0xc8, M_SOF9 = 0xc9, M_SOF10 = 0xca, M_SOF11 = 0xcb, M_SOF13 = 0xcd, M_SOF14 = 0xce, M_SOF15 = 0xcf, M_DHT = 0xc4, M_DAC = 0xcc, M_RST0 = 0xd0, M_RST1 = 0xd1, M_RST2 = 0xd2, M_RST3 = 0xd3, M_RST4 = 0xd4, M_RST5 = 0xd5, M_RST6 = 0xd6, M_RST7 = 0xd7, M_SOI = 0xd8, M_EOI = 0xd9, M_SOS = 0xda, M_DQT = 0xdb, M_DNL = 0xdc, M_DRI = 0xdd, M_DHP = 0xde, M_EXP = 0xdf, M_APP0 = 0xe0, M_APP15 = 0xef, M_JPG0 = 0xf0, M_JPG13 = 0xfd, M_COM = 0xfe, M_TEM = 0x01, M_ERROR = 0x100 } JPEG_MARKER; /* * Routines to parse JPEG markers & save away the useful info. */ LOCAL INT32 get_2bytes (cinfo) decompress_info_ptr cinfo; /* Get a 2-byte unsigned integer (e.g., a marker parameter length field) */ { INT32 a; a = JGETC(cinfo); return (a << 8) + JGETC(cinfo); } LOCAL void skip_variable (cinfo, code) decompress_info_ptr cinfo; int code; /* Skip over an unknown or uninteresting variable-length marker */ { INT32 length; length = get_2bytes(cinfo); TRACEMS2(cinfo->emethods, 1, "Skipping marker 0x%02x, length %d", code, length); for (length -= 2; length > 0; length--) (void) JGETC(cinfo); } LOCAL void get_dht (cinfo) decompress_info_ptr cinfo; /* Process a DHT marker */ { INT32 length; UINT8 bits[17]; UINT8 huffval[256]; int i, index, count; HUFF_TBL **htblptr; length = get_2bytes(cinfo)-2; while (length > 0) { index = JGETC(cinfo); TRACEMS1(cinfo->emethods, 1, "Define Huffman Table 0x%02x", index); bits[0] = 0; count = 0; for (i = 1; i <= 16; i++) { bits[i] = JGETC(cinfo); count += bits[i]; } TRACEMS8(cinfo->emethods, 2, " %3d %3d %3d %3d %3d %3d %3d %3d", bits[1], bits[2], bits[3], bits[4], bits[5], bits[6], bits[7], bits[8]); TRACEMS8(cinfo->emethods, 2, " %3d %3d %3d %3d %3d %3d %3d %3d", bits[9], bits[10], bits[11], bits[12], bits[13], bits[14], bits[15], bits[16]); if (count > 256) ERREXIT(cinfo->emethods, "Bogus DHT counts"); for (i = 0; i < count; i++) huffval[i] = JGETC(cinfo); length -= 1 + 16 + count; if (index & 0x10) { /* AC table definition */ index -= 0x10; htblptr = &cinfo->ac_huff_tbl_ptrs[index]; } else { /* DC table definition */ htblptr = &cinfo->dc_huff_tbl_ptrs[index]; } if (index < 0 || index >= NUM_HUFF_TBLS) ERREXIT1(cinfo->emethods, "Bogus DHT index %d", index); if (*htblptr == NULL) *htblptr = (HUFF_TBL *)(*cinfo->emethods->alloc_small) (SIZEOF(HUFF_TBL)); memcpy((void *) (*htblptr)->bits, (void *) bits, SIZEOF((*htblptr)->bits)); memcpy((void *) (*htblptr)->huffval, (void *) huffval, SIZEOF((*htblptr)->huffval)); } } LOCAL void get_dac (cinfo) decompress_info_ptr cinfo; /* Process a DAC marker */ { INT32 length; int index, val; length = get_2bytes(cinfo)-2; while (length > 0) { index = JGETC(cinfo); val = JGETC(cinfo); TRACEMS2(cinfo->emethods, 1, "Define Arithmetic Table 0x%02x: 0x%02x", index, val); if (index < 0 || index >= (2*NUM_ARITH_TBLS)) ERREXIT1(cinfo->emethods, "Bogus DAC index %d", index); if (index >= NUM_ARITH_TBLS) { /* define AC table */ cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = val; } else { /* define DC table */ cinfo->arith_dc_L[index] = val & 0x0F; cinfo->arith_dc_U[index] = val >> 4; if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index]) ERREXIT1(cinfo->emethods, "Bogus DAC value 0x%x", val); } length -= 2; } } LOCAL void get_dqt (cinfo) decompress_info_ptr cinfo; /* Process a DQT marker */ { INT32 length; int n, i, prec; UINT16 tmp; QUANT_TBL_PTR quant_ptr; length = get_2bytes(cinfo) - 2; while (length > 0) { n = JGETC(cinfo); prec = n >> 4; n &= 0x0F; TRACEMS2(cinfo->emethods, 1, "Define Quantization Table %d precision %d", n, prec); if (n >= NUM_QUANT_TBLS) ERREXIT1(cinfo->emethods, "Bogus table number %d", n); if (cinfo->quant_tbl_ptrs[n] == NULL) cinfo->quant_tbl_ptrs[n] = (QUANT_TBL_PTR)(*cinfo->emethods->alloc_small) (SIZEOF(QUANT_TBL)); quant_ptr = cinfo->quant_tbl_ptrs[n]; for (i = 0; i < DCTSIZE2; i++) { tmp = JGETC(cinfo); if (prec) tmp = (tmp<<8) + JGETC(cinfo); quant_ptr[i] = tmp; } for (i = 0; i < DCTSIZE2; i += 8) { TRACEMS8(cinfo->emethods, 2, " %4d %4d %4d %4d %4d %4d %4d %4d", quant_ptr[i ], quant_ptr[i+1], quant_ptr[i+2], quant_ptr[i+3], quant_ptr[i+4], quant_ptr[i+5], quant_ptr[i+6], quant_ptr[i+7]); } length -= DCTSIZE2+1; if (prec) length -= DCTSIZE2; } } LOCAL void get_dri (cinfo) decompress_info_ptr cinfo; /* Process a DRI marker */ { if (get_2bytes(cinfo) != 4) ERREXIT(cinfo->emethods, "Bogus length in DRI"); cinfo->restart_interval = get_2bytes(cinfo); TRACEMS1(cinfo->emethods, 1, "Define Restart Interval %d", cinfo->restart_interval); } LOCAL void get_app0 (cinfo) decompress_info_ptr cinfo; /* Process an APP0 marker */ { #define JFIF_LEN 14 INT32 length; UINT8 b[JFIF_LEN]; int buffp; length = get_2bytes(cinfo) - 2; /* See if a JFIF APP0 marker is present */ if (length >= JFIF_LEN) { for (buffp = 0; buffp < JFIF_LEN; buffp++) b[buffp] = JGETC(cinfo); length -= JFIF_LEN; if (b[0]=='J' && b[1]=='F' && b[2]=='I' && b[3]=='F' && b[4]==0) { /* Found JFIF APP0 marker: check version */ /* Major version must be 1 */ if (b[5] != 1) ERREXIT2(cinfo->emethods, "Unsupported JFIF revision number %d.%02d", b[5], b[6]); /* Minor version should be 0 or 1, but try to process anyway if newer */ if (b[6] != 0 && b[6] != 1) TRACEMS2(cinfo->emethods, 0, "Warning: unknown JFIF revision number %d.%02d", b[5], b[6]); /* Save info */ cinfo->density_unit = b[7]; cinfo->X_density = (b[8] << 8) + b[9]; cinfo->Y_density = (b[10] << 8) + b[11]; /* Assume colorspace is YCbCr, unless UI has overridden me */ if (cinfo->jpeg_color_space == CS_UNKNOWN) cinfo->jpeg_color_space = CS_YCbCr; TRACEMS3(cinfo->emethods, 1, "JFIF APP0 marker, density %dx%d %d", cinfo->X_density, cinfo->Y_density, cinfo->density_unit); } else { TRACEMS(cinfo->emethods, 1, "Unknown APP0 marker (not JFIF)"); } } else { TRACEMS1(cinfo->emethods, 1, "Short APP0 marker, length %d", (int) length); } while (length-- > 0) /* skip any remaining data */ (void) JGETC(cinfo); } LOCAL void get_sof (cinfo, code) decompress_info_ptr cinfo; int code; /* Process a SOFn marker */ { INT32 length; short ci; int c; jpeg_component_info * compptr; length = get_2bytes(cinfo); cinfo->data_precision = JGETC(cinfo); cinfo->image_height = get_2bytes(cinfo); cinfo->image_width = get_2bytes(cinfo); cinfo->num_components = JGETC(cinfo); TRACEMS4(cinfo->emethods, 1, "Start Of Frame 0x%02x: width=%d, height=%d, components=%d", code, cinfo->image_width, cinfo->image_height, cinfo->num_components); /* We don't support files in which the image height is initially specified */ /* as 0 and is later redefined by DNL. As long as we have to check that, */ /* might as well have a general sanity check. */ if (cinfo->image_height <= 0 || cinfo->image_width <= 0 || cinfo->num_components <= 0) ERREXIT(cinfo->emethods, "Empty JPEG image (DNL not supported)"); #ifdef EIGHT_BIT_SAMPLES if (cinfo->data_precision != 8) ERREXIT(cinfo->emethods, "Unsupported JPEG data precision"); #endif #ifdef TWELVE_BIT_SAMPLES if (cinfo->data_precision != 12) /* this needs more thought?? */ ERREXIT(cinfo->emethods, "Unsupported JPEG data precision"); #endif #ifdef SIXTEEN_BIT_SAMPLES if (cinfo->data_precision != 16) /* this needs more thought?? */ ERREXIT(cinfo->emethods, "Unsupported JPEG data precision"); #endif if (length != (cinfo->num_components * 3 + 8)) ERREXIT(cinfo->emethods, "Bogus SOF length"); cinfo->comp_info = (jpeg_component_info *)((*cinfo->emethods->alloc_small) (cinfo->num_components * SIZEOF(jpeg_component_info))); for (ci = 0; ci < cinfo->num_components; ci++) { compptr = &cinfo->comp_info[ci]; compptr->component_index = ci; compptr->component_id = JGETC(cinfo); c = JGETC(cinfo); compptr->h_samp_factor = (c >> 4) & 15; compptr->v_samp_factor = (c ) & 15; compptr->quant_tbl_no = JGETC(cinfo); TRACEMS4(cinfo->emethods, 1, " Component %d: %dhx%dv q=%d", compptr->component_id, compptr->h_samp_factor, compptr->v_samp_factor, compptr->quant_tbl_no); } } LOCAL void get_sos (cinfo) decompress_info_ptr cinfo; /* Process a SOS marker */ { INT32 length; int i, ci, n, c, cc; jpeg_component_info * compptr; length = get_2bytes(cinfo); n = JGETC(cinfo); /* Number of components */ cinfo->comps_in_scan = n; length -= 3; if (length != (n * 2 + 3) || n < 1 || n > MAX_COMPS_IN_SCAN) ERREXIT(cinfo->emethods, "Bogus SOS length"); TRACEMS1(cinfo->emethods, 1, "Start Of Scan: %d components", n); for (i = 0; i < n; i++) { cc = JGETC(cinfo); c = JGETC(cinfo); length -= 2; for (ci = 0; ci < cinfo->num_components; ci++) if (cc == cinfo->comp_info[ci].component_id) break; if (ci >= cinfo->num_components) ERREXIT(cinfo->emethods, "Invalid component number in SOS"); compptr = &cinfo->comp_info[ci]; cinfo->cur_comp_info[i] = compptr; compptr->dc_tbl_no = (c >> 4) & 15; compptr->ac_tbl_no = (c ) & 15; TRACEMS3(cinfo->emethods, 1, " c%d: [dc=%d ac=%d]", cc, compptr->dc_tbl_no, compptr->ac_tbl_no); } while (length > 0) { (void) JGETC(cinfo); length--; } } LOCAL void get_soi (cinfo) decompress_info_ptr cinfo; /* Process an SOI marker */ { int i; TRACEMS(cinfo->emethods, 1, "Start of Image"); /* Reset all parameters that are defined to be reset by SOI */ for (i = 0; i < NUM_ARITH_TBLS; i++) { cinfo->arith_dc_L[i] = 0; cinfo->arith_dc_U[i] = 1; cinfo->arith_ac_K[i] = 5; } cinfo->restart_interval = 0; cinfo->density_unit = 0; /* set default JFIF APP0 values */ cinfo->X_density = 1; cinfo->Y_density = 1; cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling */ } LOCAL int next_marker (cinfo) decompress_info_ptr cinfo; /* Find the next JPEG marker */ /* Note that the output might not be a valid marker code, */ /* but it will never be 0 or FF */ { int c, nbytes; nbytes = 0; do { do { /* skip any non-FF bytes */ nbytes++; c = JGETC(cinfo); } while (c != 0xFF && !cinfo->eof_found); do { /* skip any duplicate FFs */ nbytes++; c = JGETC(cinfo); } while (c == 0xFF && !cinfo->eof_found); } while (c == 0 && !cinfo->eof_found); /* repeat if it was a stuffed FF/00 */ if (nbytes != 2) TRACEMS2(cinfo->emethods, 1, "Skipped %d bytes before marker 0x%02x", nbytes-2, c); return c; } LOCAL JPEG_MARKER process_tables (cinfo) decompress_info_ptr cinfo; /* Scan and process JPEG markers that can appear in any order */ /* Return when an SOI, EOI, SOFn, or SOS is found */ { int c; while (TRUE) { c = next_marker(cinfo); if (cinfo->eof_found) return 0; switch (c) { case M_SOF0: case M_SOF1: case M_SOF2: case M_SOF3: case M_SOF5: case M_SOF6: case M_SOF7: case M_JPG: case M_SOF9: case M_SOF10: case M_SOF11: case M_SOF13: case M_SOF14: case M_SOF15: case M_SOI: case M_EOI: case M_SOS: return c; case M_DHT: get_dht(cinfo); break; case M_DAC: get_dac(cinfo); break; case M_DQT: get_dqt(cinfo); break; case M_DRI: get_dri(cinfo); break; case M_APP0: get_app0(cinfo); break; case M_RST0: /* these are all parameterless */ case M_RST1: case M_RST2: case M_RST3: case M_RST4: case M_RST5: case M_RST6: case M_RST7: case M_TEM: TRACEMS1(cinfo->emethods, 1, "Unexpected marker 0x%02x", c); break; default: /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn */ skip_variable(cinfo, c); break; } } } /* * Initialize and read the file header (everything through the SOF marker). * Return FALSE if we don't recognize the file. */ METHODDEF boolean read_file_header (cinfo) decompress_info_ptr cinfo; { int c; /* Expect an SOI marker first */ if (next_marker(cinfo) == M_SOI) get_soi(cinfo); else return FALSE; /* Process markers until SOF */ c = process_tables(cinfo); switch (c) { case M_SOF0: case M_SOF1: get_sof(cinfo, c); cinfo->arith_code = FALSE; break; case M_SOF9: get_sof(cinfo, c); cinfo->arith_code = TRUE; break; default: /* Unsupported SOF marker type */ fprintf(stderr, "unsupported SOF marker type 0x%02x\n", c); return FALSE; } /* Figure out what colorspace we have */ /* (too bad the JPEG committee didn't provide a real way to specify this) */ switch (cinfo->num_components) { case 1: cinfo->jpeg_color_space = CS_GRAYSCALE; break; case 3: /* if we saw a JFIF marker, leave it set to YCbCr; */ /* also leave it alone if UI has provided a value */ if (cinfo->jpeg_color_space == CS_UNKNOWN) { short cid0 = cinfo->comp_info[0].component_id; short cid1 = cinfo->comp_info[1].component_id; short cid2 = cinfo->comp_info[2].component_id; if (cid0 == 1 && cid1 == 2 && cid2 == 3) cinfo->jpeg_color_space = CS_YCbCr; /* assume it's JFIF w/out marker */ else if (cid0 == 1 && cid1 == 4 && cid2 == 5) cinfo->jpeg_color_space = CS_YIQ; /* prototype's YIQ matrix */ else { TRACEMS3(cinfo->emethods, 0, "Unrecognized component IDs %d %d %d, assuming YCbCr", cid0, cid1, cid2); cinfo->jpeg_color_space = CS_YCbCr; } } break; case 4: cinfo->jpeg_color_space = CS_CMYK; break; default: cinfo->jpeg_color_space = CS_UNKNOWN; break; } return TRUE; } /* * Read the start of a scan (everything through the SOS marker). * Return TRUE if find SOS, FALSE if find EOI. */ METHODDEF boolean read_scan_header (cinfo) decompress_info_ptr cinfo; { int c; /* Process markers until SOS or EOI */ c = process_tables(cinfo); switch (c) { case M_SOS: get_sos(cinfo); return TRUE; case M_EOI: TRACEMS(cinfo->emethods, 1, "End Of Image"); return FALSE; default: if (cinfo->eof_found) return FALSE; ERREXIT1(cinfo->emethods, "Unexpected marker 0x%02x", c); break; } return FALSE; /* keeps lint happy */ } /* * Finish up after a compressed scan (series of read_jpeg_data calls); * prepare for another read_scan_header call. */ METHODDEF void read_scan_trailer (cinfo) decompress_info_ptr cinfo; { /* no work needed */ } /* * Finish up at the end of the file. */ METHODDEF void read_file_trailer (cinfo) decompress_info_ptr cinfo; { /* no work needed */ } /* * The method selection routine for standard JPEG header reading. * Note that this must be called by the user interface before calling * jpeg_decompress. When a non-JFIF file is to be decompressed (TIFF, * perhaps), the user interface must discover the file type and call * the appropriate method selection routine. */ GLOBAL void jselrjfif (cinfo) decompress_info_ptr cinfo; { cinfo->methods->read_file_header = read_file_header; cinfo->methods->read_scan_header = read_scan_header; /* For JFIF/raw-JPEG format, the user interface supplies read_jpeg_data. */ #if 0 cinfo->methods->read_jpeg_data = read_jpeg_data; #endif cinfo->methods->read_scan_trailer = read_scan_trailer; cinfo->methods->read_file_trailer = read_file_trailer; } /* ########################################################################## */ /* * jdpipe.c * */ /* * About the data structures: * * The processing chunk size for unsubsampling is referred to in this file as * a "row group": a row group is defined as Vk (v_samp_factor) sample rows of * any component while subsampled, or Vmax (max_v_samp_factor) unsubsampled * rows. In an interleaved scan each MCU row contains exactly DCTSIZE row * groups of each component in the scan. In a noninterleaved scan an MCU row * is one row of blocks, which might not be an integral number of row groups; * therefore, we read in Vk MCU rows to obtain the same amount of data as we'd * have in an interleaved scan. * To provide context for the unsubsampling step, we have to retain the last * two row groups of the previous MCU row while reading in the next MCU row * (or set of Vk MCU rows). To do this without copying data about, we create * a rather strange data structure. Exactly DCTSIZE+2 row groups of samples * are allocated, but we create two different sets of pointers to this array. * The second set swaps the last two pairs of row groups. By working * alternately with the two sets of pointers, we can access the data in the * desired order. * * Cross-block smoothing also needs context above and below the "current" row. * Since this is an optional feature, I've implemented it in a way that is * much simpler but requires more than the minimum amount of memory. We * simply allocate three extra MCU rows worth of coefficient blocks and use * them to "read ahead" one MCU row in the file. For a typical 1000-pixel-wide * image with 2x2,1x1,1x1 sampling, each MCU row is about 50Kb; an 80x86 * machine may be unable to apply cross-block smoothing to wider images. */ /* * These variables are logically local to the pipeline controller, * but we make them static so that scan_big_image can use them * without having to pass them through the quantization routines. * If you don't support 2-pass quantization, you could make them locals. */ static int rows_in_mem; /* # of sample rows in full-size buffers */ /* Full-size image array holding desubsampled, color-converted data. */ /* * Utility routines: common code for pipeline controllers */ LOCAL void interleaved_scan_setup (cinfo) decompress_info_ptr cinfo; /* Compute all derived info for an interleaved (multi-component) scan */ /* On entry, cinfo->comps_in_scan and cinfo->cur_comp_info[] are set up */ { short ci, mcublks; jpeg_component_info *compptr; if (cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) ERREXIT(cinfo->emethods, "Too many components for interleaved scan"); cinfo->MCUs_per_row = (cinfo->image_width + cinfo->max_h_samp_factor*DCTSIZE - 1) / (cinfo->max_h_samp_factor*DCTSIZE); cinfo->MCU_rows_in_scan = (cinfo->image_height + cinfo->max_v_samp_factor*DCTSIZE - 1) / (cinfo->max_v_samp_factor*DCTSIZE); cinfo->blocks_in_MCU = 0; for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; /* for interleaved scan, sampling factors give # of blocks per component */ compptr->MCU_width = compptr->h_samp_factor; compptr->MCU_height = compptr->v_samp_factor; compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; /* compute physical dimensions of component */ compptr->subsampled_width = jround_up(compptr->true_comp_width, (long) (compptr->MCU_width*DCTSIZE)); compptr->subsampled_height = jround_up(compptr->true_comp_height, (long) (compptr->MCU_height*DCTSIZE)); /* Sanity check */ if (compptr->subsampled_width != (cinfo->MCUs_per_row * (compptr->MCU_width*DCTSIZE))) ERREXIT(cinfo->emethods, "I'm confused about the image width"); /* Prepare array describing MCU composition */ mcublks = compptr->MCU_blocks; if (cinfo->blocks_in_MCU + mcublks > MAX_BLOCKS_IN_MCU) ERREXIT(cinfo->emethods, "Sampling factors too large for interleaved scan"); while (mcublks-- > 0) { cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; } } (*cinfo->methods->d_per_scan_method_selection) (cinfo); } LOCAL void noninterleaved_scan_setup (cinfo) decompress_info_ptr cinfo; /* Compute all derived info for a noninterleaved (single-component) scan */ /* On entry, cinfo->comps_in_scan = 1 and cinfo->cur_comp_info[0] is set up */ { jpeg_component_info *compptr = cinfo->cur_comp_info[0]; /* for noninterleaved scan, always one block per MCU */ compptr->MCU_width = 1; compptr->MCU_height = 1; compptr->MCU_blocks = 1; /* compute physical dimensions of component */ compptr->subsampled_width = jround_up(compptr->true_comp_width, (long) DCTSIZE); compptr->subsampled_height = jround_up(compptr->true_comp_height, (long) DCTSIZE); cinfo->MCUs_per_row = compptr->subsampled_width / DCTSIZE; cinfo->MCU_rows_in_scan = compptr->subsampled_height / DCTSIZE; /* Prepare array describing MCU composition */ cinfo->blocks_in_MCU = 1; cinfo->MCU_membership[0] = 0; (*cinfo->methods->d_per_scan_method_selection) (cinfo); } LOCAL void reverse_DCT (cinfo, coeff_data, output_data, start_row) decompress_info_ptr cinfo; JBLOCKIMAGE coeff_data; JSAMPIMAGE output_data; int start_row; /* Perform inverse DCT on each block in an MCU row's worth of data; */ /* output the results into a sample array starting at row start_row. */ /* NB: start_row can only be nonzero when dealing with a single-component */ /* scan; otherwise we'd have to provide for different offsets for different */ /* components, since the heights of interleaved MCU rows can vary. */ { DCTBLOCK block; JBLOCKROW browptr; JSAMPARRAY srowptr; long blocksperrow, bi; short numrows, ri; short ci; for (ci = 0; ci < cinfo->comps_in_scan; ci++) { /* calc size of an MCU row in this component */ blocksperrow = cinfo->cur_comp_info[ci]->subsampled_width / DCTSIZE; numrows = cinfo->cur_comp_info[ci]->MCU_height; /* iterate through all blocks in MCU row */ for (ri = 0; ri < numrows; ri++) { browptr = coeff_data[ci][ri]; srowptr = output_data[ci] + (ri * DCTSIZE + start_row); for (bi = 0; bi < blocksperrow; bi++) { /* copy the data into a local DCTBLOCK. This allows for change of * representation (if DCTELEM != JCOEF). On 80x86 machines it also * brings the data back from FAR storage to NEAR storage. */ { register JCOEFPTR elemptr = browptr[bi]; register DCTELEM *localblkptr = block; register short elem = DCTSIZE2; while (--elem >= 0) *localblkptr++ = (DCTELEM) *elemptr++; } j_rev_dct(block); /* perform inverse DCT */ /* output the data into the sample array. * Note change from signed to unsigned representation: * DCT calculation works with values +-CENTERJSAMPLE, * but sample arrays always hold 0..MAXJSAMPLE. * Have to do explicit range-limiting because of quantization errors * and so forth in the DCT/IDCT phase. */ { register JSAMPROW elemptr; register DCTELEM *localblkptr = block; register short elemr, elemc; register DCTELEM temp; for (elemr = 0; elemr < DCTSIZE; elemr++) { elemptr = srowptr[elemr] + (bi * DCTSIZE); for (elemc = 0; elemc < DCTSIZE; elemc++) { temp = (*localblkptr++) + CENTERJSAMPLE; if (temp < 0) temp = 0; else if (temp > MAXJSAMPLE) temp = MAXJSAMPLE; *elemptr++ = (JSAMPLE) temp; } } } } } } } LOCAL JSAMPIMAGE alloc_sampimage (cinfo, num_comps, num_rows, num_cols) decompress_info_ptr cinfo; int num_comps; long num_rows; long num_cols; /* Allocate an in-memory sample image (all components same size) */ { JSAMPIMAGE image; int ci; image = (JSAMPIMAGE) (*cinfo->emethods->alloc_small) (num_comps * SIZEOF(JSAMPARRAY)); for (ci = 0; ci < num_comps; ci++) { image[ci] = (*cinfo->emethods->alloc_small_sarray) (num_cols, num_rows); } return image; } LOCAL void free_sampimage (cinfo, image, num_comps, num_rows) decompress_info_ptr cinfo; JSAMPIMAGE image; int num_comps; long num_rows; /* Release a sample image created by alloc_sampimage */ { int ci; for (ci = 0; ci < num_comps; ci++) { (*cinfo->emethods->free_small_sarray) (image[ci], num_rows); } (*cinfo->emethods->free_small) ((void *) image); } LOCAL JBLOCKIMAGE alloc_MCU_row (cinfo) decompress_info_ptr cinfo; /* Allocate one MCU row's worth of coefficient blocks */ { JBLOCKIMAGE image; int ci; image = (JBLOCKIMAGE) (*cinfo->emethods->alloc_small) (cinfo->comps_in_scan * SIZEOF(JBLOCKARRAY)); for (ci = 0; ci < cinfo->comps_in_scan; ci++) { image[ci] = (*cinfo->emethods->alloc_small_barray) (cinfo->cur_comp_info[ci]->subsampled_width / DCTSIZE, (long) cinfo->cur_comp_info[ci]->MCU_height); } return image; } LOCAL void free_MCU_row (cinfo, image) decompress_info_ptr cinfo; JBLOCKIMAGE image; /* Release a coefficient block array created by alloc_MCU_row */ { int ci; for (ci = 0; ci < cinfo->comps_in_scan; ci++) { (*cinfo->emethods->free_small_barray) (image[ci], (long) cinfo->cur_comp_info[ci]->MCU_height); } (*cinfo->emethods->free_small) ((void *) image); } LOCAL void alloc_sampling_buffer (cinfo, subsampled_data) decompress_info_ptr cinfo; JSAMPIMAGE subsampled_data[2]; /* Create a subsampled-data buffer having the desired structure */ /* (see comments at head of file) */ { short ci, vs, i; /* Get top-level space for array pointers */ subsampled_data[0] = (JSAMPIMAGE) (*cinfo->emethods->alloc_small) (cinfo->comps_in_scan * SIZEOF(JSAMPARRAY)); subsampled_data[1] = (JSAMPIMAGE) (*cinfo->emethods->alloc_small) (cinfo->comps_in_scan * SIZEOF(JSAMPARRAY)); for (ci = 0; ci < cinfo->comps_in_scan; ci++) { vs = cinfo->cur_comp_info[ci]->v_samp_factor; /* row group height */ /* Allocate the real storage */ subsampled_data[0][ci] = (*cinfo->emethods->alloc_small_sarray) (cinfo->cur_comp_info[ci]->subsampled_width, (long) (vs * (DCTSIZE+2))); /* Create space for the scrambled-order pointers */ subsampled_data[1][ci] = (JSAMPARRAY) (*cinfo->emethods->alloc_small) (vs * (DCTSIZE+2) * SIZEOF(JSAMPROW)); /* Duplicate the first DCTSIZE-2 row groups */ for (i = 0; i < vs * (DCTSIZE-2); i++) { subsampled_data[1][ci][i] = subsampled_data[0][ci][i]; } /* Copy the last four row groups in swapped order */ for (i = 0; i < vs * 2; i++) { subsampled_data[1][ci][vs*DCTSIZE + i] = subsampled_data[0][ci][vs*(DCTSIZE-2) + i]; subsampled_data[1][ci][vs*(DCTSIZE-2) + i] = subsampled_data[0][ci][vs*DCTSIZE + i]; } } } LOCAL void free_sampling_buffer (cinfo, subsampled_data) decompress_info_ptr cinfo; JSAMPIMAGE subsampled_data[2]; /* Release a sampling buffer created by alloc_sampling_buffer */ { short ci, vs; for (ci = 0; ci < cinfo->comps_in_scan; ci++) { vs = cinfo->cur_comp_info[ci]->v_samp_factor; /* row group height */ /* Free the real storage */ (*cinfo->emethods->free_small_sarray) (subsampled_data[0][ci], (long) (vs * (DCTSIZE+2))); /* Free the scrambled-order pointers */ (*cinfo->emethods->free_small) ((void *) subsampled_data[1][ci]); } /* Free the top-level space */ (*cinfo->emethods->free_small) ((void *) subsampled_data[0]); (*cinfo->emethods->free_small) ((void *) subsampled_data[1]); } LOCAL void duplicate_row (image_data, num_cols, source_row, num_rows) JSAMPARRAY image_data; long num_cols; int source_row; int num_rows; /* Duplicate the source_row at source_row+1 .. source_row+num_rows */ /* This happens only at the bottom of the image, */ /* so it needn't be super-efficient */ { register int row; for (row = 1; row <= num_rows; row++) { jcopy_sample_rows(image_data, source_row, image_data, source_row + row, 1, num_cols); } } LOCAL void jexpand (cinfo, subsampled_data, fullsize_data, fullsize_width, above, current, below, out) decompress_info_ptr cinfo; JSAMPIMAGE subsampled_data; JSAMPIMAGE fullsize_data; long fullsize_width; short above; short current; short below; short out; /* Do unsubsampling expansion of a single row group (of each component). */ /* above, current, below are indexes of row groups in subsampled_data; */ /* out is the index of the target row group in fullsize_data. */ /* Special case: above, below can be -1 to indicate top, bottom of image. */ { jpeg_component_info *compptr; JSAMPARRAY above_ptr, below_ptr; JSAMPROW dummy[MAX_SAMP_FACTOR]; /* for subsample expansion at top/bottom */ short ci, vs, i; for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; vs = compptr->v_samp_factor; /* row group height */ if (above >= 0) above_ptr = subsampled_data[ci] + above * vs; else { /* Top of image: make a dummy above-context with copies of 1st row */ /* We assume current=0 in this case */ for (i = 0; i < vs; i++) dummy[i] = subsampled_data[ci][0]; above_ptr = (JSAMPARRAY) dummy; /* possible near->far pointer conv */ } if (below >= 0) below_ptr = subsampled_data[ci] + below * vs; else { /* Bot of image: make a dummy below-context with copies of last row */ for (i = 0; i < vs; i++) dummy[i] = subsampled_data[ci][(current+1)*vs-1]; below_ptr = (JSAMPARRAY) dummy; /* possible near->far pointer conv */ } (*cinfo->methods->unsubsample[ci]) (cinfo, (int) ci, compptr->subsampled_width, (int) vs, fullsize_width, (int) cinfo->max_v_samp_factor, above_ptr, subsampled_data[ci] + current * vs, below_ptr, fullsize_data[ci] + out * cinfo->max_v_samp_factor); } } LOCAL void emit_1pass (cinfo, num_rows, fullsize_data, color_data) decompress_info_ptr cinfo; int num_rows; JSAMPIMAGE fullsize_data; JSAMPIMAGE color_data; /* Do color conversion and output of num_rows full-size rows. */ /* This is not used for 2-pass color quantization. */ { (*cinfo->methods->color_convert) (cinfo, num_rows, fullsize_data, color_data); (*cinfo->methods->put_pixel_rows) (cinfo, num_rows, color_data); } /* * Support routines for cross-block smoothing. */ #ifdef BLOCK_SMOOTHING_SUPPORTED LOCAL void smooth_mcu_row (cinfo, above, input, below, output) decompress_info_ptr cinfo; JBLOCKIMAGE above; JBLOCKIMAGE input; JBLOCKIMAGE below; JBLOCKIMAGE output; /* Apply cross-block smoothing to one MCU row's worth of coefficient blocks. */ /* above,below are NULL if at top/bottom of image. */ { jpeg_component_info *compptr; short ci, ri, last; JBLOCKROW prev; for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; last = compptr->MCU_height - 1; if (above == NULL) prev = NULL; else prev = above[ci][last]; for (ri = 0; ri < last; ri++) { (*cinfo->methods->smooth_coefficients) (cinfo, compptr, prev, input[ci][ri], input[ci][ri+1], output[ci][ri]); prev = input[ci][ri]; } if (below == NULL) (*cinfo->methods->smooth_coefficients) (cinfo, compptr, prev, input[ci][last], (JBLOCKROW) NULL, output[ci][last]); else (*cinfo->methods->smooth_coefficients) (cinfo, compptr, prev, input[ci][last], below[ci][0], output[ci][last]); } } LOCAL void get_smoothed_row (cinfo, coeff_data, bsmooth, whichb, cur_mcu_row) decompress_info_ptr cinfo; JBLOCKIMAGE coeff_data; JBLOCKIMAGE bsmooth[3]; int * whichb; long cur_mcu_row; /* Get an MCU row of coefficients, applying cross-block smoothing. */ /* The output row is placed in coeff_data. bsmooth and whichb hold */ /* working state, and cur_row is needed to check for image top/bottom. */ /* This routine just takes care of the buffering logic. */ { int prev, cur, next; /* Special case for top of image: need to pre-fetch a row & init whichb */ if (cur_mcu_row == 0) { (*cinfo->methods->disassemble_MCU) (cinfo, bsmooth[0]); if (cinfo->MCU_rows_in_scan > 1) { (*cinfo->methods->disassemble_MCU) (cinfo, bsmooth[1]); smooth_mcu_row(cinfo, (JBLOCKIMAGE) NULL, bsmooth[0], bsmooth[1], coeff_data); } else { smooth_mcu_row(cinfo, (JBLOCKIMAGE) NULL, bsmooth[0], (JBLOCKIMAGE) NULL, coeff_data); } *whichb = 1; /* points to next bsmooth[] element to use */ return; } cur = *whichb; /* set up references */ prev = (cur == 0 ? 2 : cur - 1); next = (cur == 2 ? 0 : cur + 1); *whichb = next; /* advance whichb for next time */ /* Special case for bottom of image: don't read another row */ if (cur_mcu_row >= cinfo->MCU_rows_in_scan - 1) { smooth_mcu_row(cinfo, bsmooth[prev], bsmooth[cur], (JBLOCKIMAGE) NULL, coeff_data); return; } /* Normal case: read ahead a new row, smooth the one I got before */ (*cinfo->methods->disassemble_MCU) (cinfo, bsmooth[next]); smooth_mcu_row(cinfo, bsmooth[prev], bsmooth[cur], bsmooth[next], coeff_data); } #endif /* BLOCK_SMOOTHING_SUPPORTED */ /* * Decompression pipeline controller used for single-scan files * without 2-pass color quantization. */ METHODDEF void single_dcontroller (cinfo) decompress_info_ptr cinfo; { long fullsize_width; /* # of samples per row in full-size buffers */ long cur_mcu_row; /* counts # of MCU rows processed */ long pixel_rows_output; /* # of pixel rows actually emitted */ int mcu_rows_per_loop; /* # of MCU rows processed per outer loop */ /* Work buffer for dequantized coefficients (IDCT input) */ JBLOCKIMAGE coeff_data; /* Work buffer for cross-block smoothing input */ #ifdef BLOCK_SMOOTHING_SUPPORTED JBLOCKIMAGE bsmooth[3]; /* this is optional */ int whichb; #endif /* Work buffer for subsampled image data (see comments at head of file) */ JSAMPIMAGE subsampled_data[2]; /* Work buffer for desubsampled data */ JSAMPIMAGE fullsize_data; /* Work buffer for color conversion output (full size) */ JSAMPIMAGE color_data; int whichss, ri; short i; /* Prepare for single scan containing all components */ if (cinfo->comps_in_scan == 1) { noninterleaved_scan_setup(cinfo); /* Need to read Vk MCU rows to obtain Vk block rows */ mcu_rows_per_loop = cinfo->cur_comp_info[0]->v_samp_factor; } else { interleaved_scan_setup(cinfo); /* in an interleaved scan, one MCU row provides Vk block rows */ mcu_rows_per_loop = 1; } /* Compute dimensions of full-size pixel buffers */ /* Note these are the same whether interleaved or not. */ rows_in_mem = cinfo->max_v_samp_factor * DCTSIZE; fullsize_width = jround_up(cinfo->image_width, (long) (cinfo->max_h_samp_factor * DCTSIZE)); /* Allocate working memory: */ /* coeff_data holds a single MCU row of coefficient blocks */ coeff_data = alloc_MCU_row(cinfo); /* if doing cross-block smoothing, need extra space for its input */ #ifdef BLOCK_SMOOTHING_SUPPORTED if (cinfo->do_block_smoothing) { bsmooth[0] = alloc_MCU_row(cinfo); bsmooth[1] = alloc_MCU_row(cinfo); bsmooth[2] = alloc_MCU_row(cinfo); } #endif /* subsampled_data is sample data before unsubsampling */ alloc_sampling_buffer(cinfo, subsampled_data); /* fullsize_data is sample data after unsubsampling */ fullsize_data = alloc_sampimage(cinfo, (int) cinfo->num_components, (long) rows_in_mem, fullsize_width); /* color_data is the result of the colorspace conversion step */ color_data = alloc_sampimage(cinfo, (int) cinfo->color_out_comps, (long) rows_in_mem, fullsize_width); /* Tell the memory manager to instantiate big arrays. * We don't need any big arrays in this controller, * but some other module (like the output file writer) may need one. */ (*cinfo->emethods->alloc_big_arrays) ((long) 0, /* no more small sarrays */ (long) 0, /* no more small barrays */ (long) 0); /* no more "medium" objects */ /* Initialize to read scan data */ (*cinfo->methods->entropy_decoder_init) (cinfo); (*cinfo->methods->unsubsample_init) (cinfo); (*cinfo->methods->disassemble_init) (cinfo); /* Loop over scan's data: rows_in_mem pixel rows are processed per loop */ pixel_rows_output = 0; whichss = 1; /* arrange to start with subsampled_data[0] */ for (cur_mcu_row = 0; cur_mcu_row < cinfo->MCU_rows_in_scan; cur_mcu_row += mcu_rows_per_loop) { whichss ^= 1; /* switch to other subsample buffer */ /* Obtain v_samp_factor block rows of each component in the scan. */ /* This is a single MCU row if interleaved, multiple MCU rows if not. */ /* In the noninterleaved case there might be fewer than v_samp_factor */ /* block rows remaining; if so, pad with copies of the last pixel row */ /* so that unsubsampling doesn't have to treat it as a special case. */ for (ri = 0; ri < mcu_rows_per_loop; ri++) { if (cur_mcu_row + ri < cinfo->MCU_rows_in_scan) { /* OK to actually read an MCU row. */ #ifdef BLOCK_SMOOTHING_SUPPORTED if (cinfo->do_block_smoothing) get_smoothed_row(cinfo, coeff_data, bsmooth, &whichb, cur_mcu_row + ri); else #endif (*cinfo->methods->disassemble_MCU) (cinfo, coeff_data); reverse_DCT(cinfo, coeff_data, subsampled_data[whichss], ri * DCTSIZE); } else { /* Need to pad out with copies of the last subsampled row. */ /* This can only happen if there is just one component. */ duplicate_row(subsampled_data[whichss][0], cinfo->cur_comp_info[0]->subsampled_width, ri * DCTSIZE - 1, DCTSIZE); } } /* Unsubsample the data */ /* First time through is a special case */ if (cur_mcu_row) { /* Expand last row group of previous set */ jexpand(cinfo, subsampled_data[whichss], fullsize_data, fullsize_width, (short) DCTSIZE, (short) (DCTSIZE+1), (short) 0, (short) (DCTSIZE-1)); /* and dump the previous set's expanded data */ emit_1pass (cinfo, rows_in_mem, fullsize_data, color_data); pixel_rows_output += rows_in_mem; /* Expand first row group of this set */ jexpand(cinfo, subsampled_data[whichss], fullsize_data, fullsize_width, (short) (DCTSIZE+1), (short) 0, (short) 1, (short) 0); } else { /* Expand first row group with dummy above-context */ jexpand(cinfo, subsampled_data[whichss], fullsize_data, fullsize_width, (short) (-1), (short) 0, (short) 1, (short) 0); } /* Expand second through next-to-last row groups of this set */ for (i = 1; i <= DCTSIZE-2; i++) { jexpand(cinfo, subsampled_data[whichss], fullsize_data, fullsize_width, (short) (i-1), (short) i, (short) (i+1), (short) i); } } /* end of outer loop */ /* Expand the last row group with dummy below-context */ /* Note whichss points to last buffer side used */ jexpand(cinfo, subsampled_data[whichss], fullsize_data, fullsize_width, (short) (DCTSIZE-2), (short) (DCTSIZE-1), (short) (-1), (short) (DCTSIZE-1)); /* and dump the remaining data (may be less than full height) */ emit_1pass (cinfo, (int) (cinfo->image_height - pixel_rows_output), fullsize_data, color_data); /* Clean up after the scan */ (*cinfo->methods->disassemble_term) (cinfo); (*cinfo->methods->unsubsample_term) (cinfo); (*cinfo->methods->entropy_decoder_term) (cinfo); (*cinfo->methods->read_scan_trailer) (cinfo); /* Verify that we've seen the whole input file */ if ((*cinfo->methods->read_scan_header) (cinfo)) ERREXIT(cinfo->emethods, "Didn't expect more than one scan"); /* Release working memory */ free_MCU_row(cinfo, coeff_data); #ifdef BLOCK_SMOOTHING_SUPPORTED if (cinfo->do_block_smoothing) { free_MCU_row(cinfo, bsmooth[0]); free_MCU_row(cinfo, bsmooth[1]); free_MCU_row(cinfo, bsmooth[2]); } #endif free_sampling_buffer(cinfo, subsampled_data); free_sampimage(cinfo, fullsize_data, (int) cinfo->num_components, (long) rows_in_mem); free_sampimage(cinfo, color_data, (int) cinfo->color_out_comps, (long) rows_in_mem); } /* * Decompression pipeline controller used for multiple-scan files * without 2-pass color quantization. * * The current implementation places the "big" buffer at the stage of * desubsampled data. Buffering subsampled data instead would reduce the * size of temp files (by about a factor of 2 in typical cases). However, * the unsubsampling logic is dependent on the assumption that unsubsampling * occurs during a scan, so it's much easier to do the enlargement as the * JPEG file is read. This also simplifies life for the memory manager, * which would otherwise have to deal with overlapping access_big_sarray() * requests. * * At present it appears that most JPEG files will be single-scan, so * it doesn't seem worthwhile to try to make this implementation smarter. */ #ifdef MULTISCAN_FILES_SUPPORTED METHODDEF void multi_dcontroller (cinfo) decompress_info_ptr cinfo; { long fullsize_width; /* # of samples per row in full-size buffers */ long cur_mcu_row; /* counts # of MCU rows processed */ long pixel_rows_output; /* # of pixel rows actually emitted */ int mcu_rows_per_loop; /* # of MCU rows processed per outer loop */ /* Work buffer for dequantized coefficients (IDCT input) */ JBLOCKIMAGE coeff_data; /* Work buffer for cross-block smoothing input */ #ifdef BLOCK_SMOOTHING_SUPPORTED JBLOCKIMAGE bsmooth[3]; /* this is optional */ int whichb; #endif /* Work buffer for subsampled image data (see comments at head of file) */ JSAMPIMAGE subsampled_data[2]; /* Full-image buffer holding desubsampled, but not color-converted, data */ big_sarray_ptr *fullsize_image; JSAMPIMAGE fullsize_ptrs; /* workspace for access_big_sarray() results */ /* Work buffer for color conversion output (full size) */ JSAMPIMAGE color_data; int whichss, ri; short ci, i; /* Compute dimensions of full-size pixel buffers */ /* Note these are the same whether interleaved or not. */ rows_in_mem = cinfo->max_v_samp_factor * DCTSIZE; fullsize_width = jround_up(cinfo->image_width, (long) (cinfo->max_h_samp_factor * DCTSIZE)); /* Allocate all working memory that doesn't depend on scan info */ /* color_data is the result of the colorspace conversion step */ color_data = alloc_sampimage(cinfo, (int) cinfo->color_out_comps, (long) rows_in_mem, fullsize_width); /* Get a big image: fullsize_image is sample data after unsubsampling. */ fullsize_image = (big_sarray_ptr *) (*cinfo->emethods->alloc_small) (cinfo->num_components * SIZEOF(big_sarray_ptr)); for (ci = 0; ci < cinfo->num_components; ci++) { fullsize_image[ci] = (*cinfo->emethods->request_big_sarray) (fullsize_width, jround_up(cinfo->image_height, (long) rows_in_mem), (long) rows_in_mem); } /* Also get an area for pointers to currently accessible chunks */ fullsize_ptrs = (JSAMPIMAGE) (*cinfo->emethods->alloc_small) (cinfo->num_components * SIZEOF(JSAMPARRAY)); /* Tell the memory manager to instantiate big arrays */ (*cinfo->emethods->alloc_big_arrays) /* extra sarray space is for subsampled-data buffers: */ ((long) (fullsize_width /* max width in samples */ * cinfo->max_v_samp_factor*(DCTSIZE+2) /* max height */ * cinfo->num_components), /* max components per scan */ /* extra barray space is for MCU-row buffers: */ (long) ((fullsize_width / DCTSIZE) /* max width in blocks */ * cinfo->max_v_samp_factor /* max height */ * cinfo->num_components /* max components per scan */ * (cinfo->do_block_smoothing ? 4 : 1)),/* how many of these we need */ /* no extra "medium"-object space */ (long) 0); /* Loop over scans in file */ do { /* Prepare for this scan */ if (cinfo->comps_in_scan == 1) { noninterleaved_scan_setup(cinfo); /* Need to read Vk MCU rows to obtain Vk block rows */ mcu_rows_per_loop = cinfo->cur_comp_info[0]->v_samp_factor; } else { interleaved_scan_setup(cinfo); /* in an interleaved scan, one MCU row provides Vk block rows */ mcu_rows_per_loop = 1; } /* Allocate scan-local working memory */ /* coeff_data holds a single MCU row of coefficient blocks */ coeff_data = alloc_MCU_row(cinfo); /* if doing cross-block smoothing, need extra space for its input */ #ifdef BLOCK_SMOOTHING_SUPPORTED if (cinfo->do_block_smoothing) { bsmooth[0] = alloc_MCU_row(cinfo); bsmooth[1] = alloc_MCU_row(cinfo); bsmooth[2] = alloc_MCU_row(cinfo); } #endif /* subsampled_data is sample data before unsubsampling */ alloc_sampling_buffer(cinfo, subsampled_data); /* line up the big buffers */ for (ci = 0; ci < cinfo->comps_in_scan; ci++) { fullsize_ptrs[ci] = (*cinfo->emethods->access_big_sarray) (fullsize_image[cinfo->cur_comp_info[ci]->component_index], (long) 0, TRUE); } /* Initialize to read scan data */ (*cinfo->methods->entropy_decoder_init) (cinfo); (*cinfo->methods->unsubsample_init) (cinfo); (*cinfo->methods->disassemble_init) (cinfo); /* Loop over scan's data: rows_in_mem pixel rows are processed per loop */ pixel_rows_output = 0; whichss = 1; /* arrange to start with subsampled_data[0] */ for (cur_mcu_row = 0; cur_mcu_row < cinfo->MCU_rows_in_scan; cur_mcu_row += mcu_rows_per_loop) { whichss ^= 1; /* switch to other subsample buffer */ /* Obtain v_samp_factor block rows of each component in the scan. */ /* This is a single MCU row if interleaved, multiple MCU rows if not. */ /* In the noninterleaved case there might be fewer than v_samp_factor */ /* block rows remaining; if so, pad with copies of the last pixel row */ /* so that unsubsampling doesn't have to treat it as a special case. */ for (ri = 0; ri < mcu_rows_per_loop; ri++) { if (cur_mcu_row + ri < cinfo->MCU_rows_in_scan) { /* OK to actually read an MCU row. */ #ifdef BLOCK_SMOOTHING_SUPPORTED if (cinfo->do_block_smoothing) get_smoothed_row(cinfo, coeff_data, bsmooth, &whichb, cur_mcu_row + ri); else #endif (*cinfo->methods->disassemble_MCU) (cinfo, coeff_data); reverse_DCT(cinfo, coeff_data, subsampled_data[whichss], ri * DCTSIZE); } else { /* Need to pad out with copies of the last subsampled row. */ /* This can only happen if there is just one component. */ duplicate_row(subsampled_data[whichss][0], cinfo->cur_comp_info[0]->subsampled_width, ri * DCTSIZE - 1, DCTSIZE); } } /* Unsubsample the data */ /* First time through is a special case */ if (cur_mcu_row) { /* Expand last row group of previous set */ jexpand(cinfo, subsampled_data[whichss], fullsize_ptrs, fullsize_width, (short) DCTSIZE, (short) (DCTSIZE+1), (short) 0, (short) (DCTSIZE-1)); /* Realign the big buffers */ pixel_rows_output += rows_in_mem; for (ci = 0; ci < cinfo->comps_in_scan; ci++) { fullsize_ptrs[ci] = (*cinfo->emethods->access_big_sarray) (fullsize_image[cinfo->cur_comp_info[ci]->component_index], pixel_rows_output, TRUE); } /* Expand first row group of this set */ jexpand(cinfo, subsampled_data[whichss], fullsize_ptrs, fullsize_width, (short) (DCTSIZE+1), (short) 0, (short) 1, (short) 0); } else { /* Expand first row group with dummy above-context */ jexpand(cinfo, subsampled_data[whichss], fullsize_ptrs, fullsize_width, (short) (-1), (short) 0, (short) 1, (short) 0); } /* Expand second through next-to-last row groups of this set */ for (i = 1; i <= DCTSIZE-2; i++) { jexpand(cinfo, subsampled_data[whichss], fullsize_ptrs, fullsize_width, (short) (i-1), (short) i, (short) (i+1), (short) i); } } /* end of outer loop */ /* Expand the last row group with dummy below-context */ /* Note whichss points to last buffer side used */ jexpand(cinfo, subsampled_data[whichss], fullsize_ptrs, fullsize_width, (short) (DCTSIZE-2), (short) (DCTSIZE-1), (short) (-1), (short) (DCTSIZE-1)); /* Clean up after the scan */ (*cinfo->methods->disassemble_term) (cinfo); (*cinfo->methods->unsubsample_term) (cinfo); (*cinfo->methods->entropy_decoder_term) (cinfo); (*cinfo->methods->read_scan_trailer) (cinfo); /* Release scan-local working memory */ free_MCU_row(cinfo, coeff_data); #ifdef BLOCK_SMOOTHING_SUPPORTED if (cinfo->do_block_smoothing) { free_MCU_row(cinfo, bsmooth[0]); free_MCU_row(cinfo, bsmooth[1]); free_MCU_row(cinfo, bsmooth[2]); } #endif free_sampling_buffer(cinfo, subsampled_data); /* Repeat if there is another scan */ } while ((*cinfo->methods->read_scan_header) (cinfo)); /* Now that we've collected all the data, color convert & output it. */ for (pixel_rows_output = 0; pixel_rows_output < cinfo->image_height; pixel_rows_output += rows_in_mem) { /* realign the big buffers */ for (ci = 0; ci < cinfo->num_components; ci++) { fullsize_ptrs[ci] = (*cinfo->emethods->access_big_sarray) (fullsize_image[ci], pixel_rows_output, FALSE); } emit_1pass (cinfo, (int) MIN(rows_in_mem, cinfo->image_height-pixel_rows_output), fullsize_ptrs, color_data); } /* Release working memory */ free_sampimage(cinfo, color_data, (int) cinfo->color_out_comps, (long) rows_in_mem); for (ci = 0; ci < cinfo->num_components; ci++) { (*cinfo->emethods->free_big_sarray) (fullsize_image[ci]); } (*cinfo->emethods->free_small) ((void *) fullsize_image); (*cinfo->emethods->free_small) ((void *) fullsize_ptrs); } #endif /* MULTISCAN_FILES_SUPPORTED */ /* * Decompression pipeline controller used for multiple-scan files * with 2-pass color quantization. */ #ifdef MULTISCAN_FILES_SUPPORTED #ifdef QUANT_2PASS_SUPPORTED METHODDEF void multi_2quant_dcontroller cinfo) decompress_info_ptr cinfo; { ERREXIT(cinfo->emethods, "Not implemented yet"); } #endif /* QUANT_2PASS_SUPPORTED */ #endif /* MULTISCAN_FILES_SUPPORTED */ /* * The method selection routine for decompression pipeline controllers. * Note that at this point we've already read the JPEG header and first SOS, * so we can tell whether the input is one scan or not. */ GLOBAL void jseldpipeline (cinfo) decompress_info_ptr cinfo; { if (cinfo->comps_in_scan == cinfo->num_components) { /* It's a single-scan file */ cinfo->methods->d_pipeline_controller = single_dcontroller; } else { /* It's a multiple-scan file */ #ifdef MULTISCAN_FILES_SUPPORTED cinfo->methods->d_pipeline_controller = multi_dcontroller; #else ERREXIT(cinfo->emethods, "Multiple-scan support was not compiled"); #endif } } /* ########################################################################## */ /* * jbsmooth.c * */ #ifdef BLOCK_SMOOTHING_SUPPORTED /* * Cross-block coefficient smoothing. */ METHODDEF void smooth_coefficients (cinfo, compptr, above, currow, below, output) decompress_info_ptr cinfo; jpeg_component_info *compptr; JBLOCKROW above; JBLOCKROW currow; JBLOCKROW below; JBLOCKROW output; { QUANT_TBL_PTR Qptr = cinfo->quant_tbl_ptrs[compptr->quant_tbl_no]; long blocks_in_row = compptr->subsampled_width / DCTSIZE; long col; /* First, copy the block row as-is. * This takes care of the first & last blocks in the row, the top/bottom * special cases, and the higher-order coefficients in each block. */ jcopy_block_row(currow, output, blocks_in_row); /* Now apply the smoothing calculation, but not to any blocks on the * edges of the image. */ if (above != NULL && below != NULL) { for (col = 1; col < blocks_in_row-1; col++) { /* See section 13.10 of JPEG-8-R8, or K.8 of JPEG-9-R6. * * As I understand it, this produces approximations * for the low frequency AC components, based on the * DC values of the block and its eight neighboring blocks. * (Thus it can't be used for blocks on the image edges.) */ /* The layout of these variables corresponds to * the text in 13.10 */ JCOEF DC1, DC2, DC3; JCOEF DC4, DC5, DC6; JCOEF DC7, DC8, DC9; long AC01, AC02; long AC10, AC11; long AC20; DC1 = above [col-1][0]; DC2 = above [col ][0]; DC3 = above [col+1][0]; DC4 = currow[col-1][0]; DC5 = currow[col ][0]; DC6 = currow[col+1][0]; DC7 = below [col-1][0]; DC8 = below [col ][0]; DC9 = below [col+1][0]; #define DIVIDE_256(x) x = ( (x) < 0 ? -((128-(x))/256) : ((x)+128)/256 ) AC01 = (36 * (DC4 - DC6)); DIVIDE_256(AC01); AC10 = (36 * (DC2 - DC8)); DIVIDE_256(AC10); AC20 = (9 * (DC2 + DC8 - 2*DC5)); DIVIDE_256(AC20); AC11 = (5 * ((DC1 - DC3) - (DC7 - DC9))); DIVIDE_256(AC11); AC02 = (9 * (DC4 + DC6 - 2*DC5)); DIVIDE_256(AC02); /* I think that this checks to see if the quantisation * on the transmitting side would have produced this * answer. If so, then we use our (hopefully better) * estimate. */ #define ABS(x) ((x) < 0 ? -(x) : (x)) #define COND_ASSIGN(_ac,_n,_z) if ((ABS(output[col][_n] - (_ac))<<1) <= Qptr[_z]) output[col][_n] = (_ac) COND_ASSIGN(AC01, 1, 1); COND_ASSIGN(AC02, 2, 5); COND_ASSIGN(AC10, 8, 2); COND_ASSIGN(AC11, 9, 4); COND_ASSIGN(AC20, 16, 3); } } } /* * The method selection routine for cross-block smoothing. */ GLOBAL void jselbsmooth (cinfo) decompress_info_ptr cinfo; { /* just one implementation for now */ cinfo->methods->smooth_coefficients = smooth_coefficients; } #endif /* BLOCK_SMOOTHING_SUPPORTED */ /* ########################################################################## */ /* * jdarith.c * */ #ifdef ARITH_CODING_SUPPORTED /* * The arithmetic coding option of the JPEG standard specifies Q-coding, * which is covered by patents held by IBM (and possibly AT&T and Mitsubishi). * At this time it does not appear to be legal for the Independent JPEG * Group to distribute software that implements arithmetic coding. * We have therefore removed arithmetic coding support from the * distributed source code. * * We're not happy about it either. */ /* * The method selection routine for arithmetic entropy decoding. */ GLOBAL void jseldarithmetic (cinfo) decompress_info_ptr cinfo; { if (cinfo->arith_code) { ERREXIT(cinfo->emethods, "Sorry, there are legal restrictions on arithmetic coding"); } } #endif /* ARITH_CODING_SUPPORTED */ /* ########################################################################## */ /* * jdhuff.c * */ /* Static variables to avoid passing 'round extra parameters */ static decompress_info_ptr dcinfo; static unsigned int get_buffer; /* current bit-extraction buffer */ static int bits_left; /* # of unused bits in it */ LOCAL void fix_huff_tbl (htbl) HUFF_TBL * htbl; /* Compute derived values for a Huffman table */ { int p, i, l, lastp, si; char huffsize[257]; UINT16 huffcode[257]; UINT16 code; /* Figure 7.3.5.4.2.1: make table of Huffman code length for each symbol */ /* Note that this is in code-length order. */ p = 0; for (l = 1; l <= 16; l++) { for (i = 1; i <= htbl->bits[l]; i++) huffsize[p++] = l; } huffsize[p] = 0; lastp = p; /* Figure 7.3.5.4.2.2: generate the codes themselves */ /* Note that this is in code-length order. */ code = 0; si = huffsize[0]; p = 0; while (huffsize[p]) { while (huffsize[p] == si) { huffcode[p++] = code; code++; } code <<= 1; si++; } /* Figure 7.3.5.4.2.3: generate encoding tables */ /* These are code and size indexed by symbol value */ for (p = 0; p < lastp; p++) { htbl->ehufco[htbl->huffval[p]] = huffcode[p]; htbl->ehufsi[htbl->huffval[p]] = huffsize[p]; } /* Figure 13.4.2.3.1: generate decoding tables */ p = 0; for (l = 1; l <= 16; l++) { if (htbl->bits[l]) { htbl->valptr[l] = p; /* huffval[] index of 1st sym of code len l */ htbl->mincode[l] = huffcode[p]; /* minimum code of length l */ p += htbl->bits[l]; htbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */ } else { htbl->maxcode[l] = -1; } } } /* Extract the next N bits from the input stream (N <= 8) */ LOCAL int get_bits (nbits) int nbits; { int result; while (nbits > bits_left) { int c = JGETC(dcinfo); get_buffer = (get_buffer << 8) + c; bits_left += 8; /* If it's 0xFF, check and discard stuffed zero byte */ if (c == 0xff) { c = JGETC(dcinfo); /* Byte stuffing */ if (c != 0) ERREXIT1(dcinfo->emethods, "Unexpected marker 0x%02x in compressed data", c); } } bits_left -= nbits; result = (get_buffer >> bits_left) & ((1 << nbits) - 1); return result; } /* Macro to make things go at some speed! */ #define get_bit() (bits_left ? \ ((get_buffer >> (--bits_left)) & 1) : \ get_bits(1)) /* Figure 13.4.2.3.2: extract next coded symbol from input stream */ LOCAL int huff_DECODE (htbl) HUFF_TBL * htbl; { int l, p; INT32 code; code = get_bit(); l = 1; while (code > htbl->maxcode[l]) { code = (code << 1) + get_bit(); l++; } p = htbl->valptr[l] + (code - htbl->mincode[l]); return htbl->huffval[p]; } /* Figure 13.4.2.1.1: extend sign bit */ #define huff_EXTEND(x, s) ((x) < (1 << ((s)-1)) ? \ (x) + (-1 << (s)) + 1 : \ (x)) /* Decode a single block's worth of coefficients */ /* Note that only the difference is returned for the DC coefficient */ LOCAL void decode_one_block (block, dctbl, actbl) JBLOCK block; HUFF_TBL *dctbl; HUFF_TBL *actbl; { int s, k, r, n; /* zero out the coefficient block */ memset((void *) block, 0, SIZEOF(JBLOCK)); /* Section 13.4.2.1: decode the DC coefficient difference */ s = huff_DECODE(dctbl); r = get_bits(s); /* bug fix: original code did not care if 's' was zero, causing * 1 << -1 in the huff_EXTEND macro, which is illegal. - jimf 11.25.91 */ if (s) block[0] = huff_EXTEND(r, s); else block[0] = r; /* Section 13.4.2.2: decode the AC coefficients */ for (k = 1; k < DCTSIZE2; k++) { r = huff_DECODE(actbl); s = r & 15; n = r >> 4; if (s) { k = k + n; r = get_bits(s); block[k] = huff_EXTEND(r, s); } else { if (n != 15) break; k += 15; } } } /* * Initialize for a Huffman-compressed scan. * This is invoked after reading the SOS marker. */ METHODDEF void huff_decoder_init (cinfo) decompress_info_ptr cinfo; { short ci; jpeg_component_info * compptr; /* Initialize static variables */ dcinfo = cinfo; bits_left = 0; for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; /* Make sure requested tables are present */ if (cinfo->dc_huff_tbl_ptrs[compptr->dc_tbl_no] == NULL || cinfo->ac_huff_tbl_ptrs[compptr->ac_tbl_no] == NULL) ERREXIT(cinfo->emethods, "Use of undefined Huffman table"); /* Compute derived values for Huffman tables */ /* We may do this more than once for same table, but it's not a big deal */ fix_huff_tbl(cinfo->dc_huff_tbl_ptrs[compptr->dc_tbl_no]); fix_huff_tbl(cinfo->ac_huff_tbl_ptrs[compptr->ac_tbl_no]); /* Initialize DC predictions to 0 */ cinfo->last_dc_val[ci] = 0; } /* Initialize restart stuff */ cinfo->restarts_to_go = cinfo->restart_interval; cinfo->next_restart_num = 0; } /* * Check for a restart marker & resynchronize decoder. */ LOCAL void process_restart (cinfo) decompress_info_ptr cinfo; { int c, nbytes; short ci; /* Throw away any partial unread byte */ bits_left = 0; /* Scan for next JPEG marker */ nbytes = 0; do { do { /* skip any non-FF bytes */ nbytes++; c = JGETC(cinfo); } while (c != 0xFF); do { /* skip any duplicate FFs */ nbytes++; c = JGETC(cinfo); } while (c == 0xFF); } while (c == 0); /* repeat if it was a stuffed FF/00 */ if (c != (RST0 + cinfo->next_restart_num)) ERREXIT2(cinfo->emethods, "Found 0x%02x marker instead of RST%d", c, cinfo->next_restart_num); if (nbytes != 2) TRACEMS2(cinfo->emethods, 1, "Skipped %d bytes before RST%d", nbytes-2, cinfo->next_restart_num); else TRACEMS1(cinfo->emethods, 2, "RST%d", cinfo->next_restart_num); /* Re-initialize DC predictions to 0 */ for (ci = 0; ci < cinfo->comps_in_scan; ci++) cinfo->last_dc_val[ci] = 0; /* Update restart state */ cinfo->restarts_to_go = cinfo->restart_interval; cinfo->next_restart_num++; cinfo->next_restart_num &= 7; } /* * Decode and return one MCU's worth of Huffman-compressed coefficients. */ METHODDEF void huff_decode (cinfo, MCU_data) decompress_info_ptr cinfo; JBLOCK *MCU_data; { short blkn, ci; jpeg_component_info * compptr; /* Account for restart interval, process restart marker if needed */ if (cinfo->restart_interval) { if (cinfo->restarts_to_go == 0) process_restart(cinfo); cinfo->restarts_to_go--; } for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { ci = cinfo->MCU_membership[blkn]; compptr = cinfo->cur_comp_info[ci]; decode_one_block(MCU_data[blkn], cinfo->dc_huff_tbl_ptrs[compptr->dc_tbl_no], cinfo->ac_huff_tbl_ptrs[compptr->ac_tbl_no]); /* Convert DC difference to actual value, update last_dc_val */ MCU_data[blkn][0] += cinfo->last_dc_val[ci]; cinfo->last_dc_val[ci] = MCU_data[blkn][0]; } } /* * Finish up at the end of a Huffman-compressed scan. */ METHODDEF void huff_decoder_term (cinfo) decompress_info_ptr cinfo; { /* No work needed */ } /* * The method selection routine for Huffman entropy decoding. */ GLOBAL void jseldhuffman (cinfo) decompress_info_ptr cinfo; { if (! cinfo->arith_code) { cinfo->methods->entropy_decoder_init = huff_decoder_init; cinfo->methods->entropy_decode = huff_decode; cinfo->methods->entropy_decoder_term = huff_decoder_term; } } /* ########################################################################## */ /* * jdcolor.c * */ /* * Initialize for colorspace conversion. */ METHODDEF void colorout_init (cinfo) decompress_info_ptr cinfo; { /* no work needed */ } /* * Convert some rows of samples to the output colorspace. * This version handles YCbCr -> RGB conversion. * YCbCr is defined per CCIR 601-1, except that Cb and Cr are * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. */ METHODDEF void ycc_rgb_convert (cinfo, num_rows, input_data, output_data) decompress_info_ptr cinfo; int num_rows; JSAMPIMAGE input_data; JSAMPIMAGE output_data; { register INT32 y, u, v, x; register JSAMPROW inptr0, inptr1, inptr2; register JSAMPROW outptr0, outptr1, outptr2; register long col; register long width = cinfo->image_width; register int row; for (row = 0; row < num_rows; row++) { inptr0 = input_data[0][row]; inptr1 = input_data[1][row]; inptr2 = input_data[2][row]; outptr0 = output_data[0][row]; outptr1 = output_data[1][row]; outptr2 = output_data[2][row]; for (col = width; col > 0; col--) { y = GETJSAMPLE(*inptr0++); u = (int) GETJSAMPLE(*inptr1++) - CENTERJSAMPLE; v = (int) GETJSAMPLE(*inptr2++) - CENTERJSAMPLE; /* Note: if the inputs were computed directly from RGB values, * range-limiting would be unnecessary here; but due to possible * noise in the DCT/IDCT phase, we do need to apply range limits. */ y *= 1024; /* in case compiler can't spot common subexpression */ x = y + 1436*v + 512; /* red */ if (x < 0) x = 0; if (x > ((INT32) MAXJSAMPLE*1024)) x = (INT32) MAXJSAMPLE*1024; *outptr0++ = x >> 10; x = y - 352*u - 731*v + 512; /* green */ if (x < 0) x = 0; if (x > ((INT32) MAXJSAMPLE*1024)) x = (INT32) MAXJSAMPLE*1024; *outptr1++ = x >> 10; x = y + 1815*u + 512; /* blue */ if (x < 0) x = 0; if (x > ((INT32) MAXJSAMPLE*1024)) x = (INT32) MAXJSAMPLE*1024; *outptr2++ = x >> 10; } } } /* * Color conversion for no colorspace change: just copy the data. */ METHODDEF void null_convert (cinfo, num_rows, input_data, output_data) decompress_info_ptr cinfo; int num_rows; JSAMPIMAGE input_data; JSAMPIMAGE output_data; { short ci; for (ci = 0; ci < cinfo->num_components; ci++) { jcopy_sample_rows(input_data[ci], 0, output_data[ci], 0, num_rows, cinfo->image_width); } } /* * Color conversion for grayscale: just copy the data. * This also works for YCbCr/YIQ -> grayscale conversion, in which * we just copy the Y (luminance) component and ignore chrominance. */ METHODDEF void grayscale_convert (cinfo, num_rows, input_data, output_data) decompress_info_ptr cinfo; int num_rows; JSAMPIMAGE input_data; JSAMPIMAGE output_data; { jcopy_sample_rows(input_data[0], 0, output_data[0], 0, num_rows, cinfo->image_width); } /* * Finish up at the end of the file. */ METHODDEF void colorout_term (cinfo) decompress_info_ptr cinfo; { /* no work needed */ } /* * The method selection routine for output colorspace conversion. */ GLOBAL void jseldcolor (cinfo) decompress_info_ptr cinfo; { /* Make sure num_components agrees with jpeg_color_space */ switch (cinfo->jpeg_color_space) { case CS_GRAYSCALE: if (cinfo->num_components != 1) ERREXIT(cinfo->emethods, "Bogus JPEG colorspace"); break; case CS_RGB: case CS_YIQ: case CS_YCbCr: if (cinfo->num_components != 3) ERREXIT(cinfo->emethods, "Bogus JPEG colorspace"); break; case CS_CMYK: if (cinfo->num_components != 4) ERREXIT(cinfo->emethods, "Bogus JPEG colorspace"); break; default: ERREXIT(cinfo->emethods, "Unsupported JPEG colorspace"); break; } /* Set color_out_comps and conversion method based on requested space */ switch (cinfo->out_color_space) { case CS_GRAYSCALE: cinfo->color_out_comps = 1; if (cinfo->jpeg_color_space == CS_GRAYSCALE || cinfo->jpeg_color_space == CS_YCbCr || cinfo->jpeg_color_space == CS_YIQ) cinfo->methods->color_convert = grayscale_convert; else ERREXIT(cinfo->emethods, "Unsupported color conversion request"); break; case CS_RGB: cinfo->color_out_comps = 3; if (cinfo->jpeg_color_space == CS_YCbCr) cinfo->methods->color_convert = ycc_rgb_convert; else if (cinfo->jpeg_color_space == CS_RGB) cinfo->methods->color_convert = null_convert; else ERREXIT(cinfo->emethods, "Unsupported color conversion request"); break; case CS_CMYK: cinfo->color_out_comps = 4; if (cinfo->jpeg_color_space == CS_CMYK) cinfo->methods->color_convert = null_convert; else ERREXIT(cinfo->emethods, "Unsupported color conversion request"); break; default: ERREXIT(cinfo->emethods, "Unsupported output colorspace"); break; } cinfo->final_out_comps = cinfo->color_out_comps; cinfo->methods->colorout_init = colorout_init; cinfo->methods->colorout_term = colorout_term; } /* ########################################################################## */ /* * jdmcu.c * */ /* * Quantization descaling and zigzag reordering */ /* ZAG[i] is the natural-order position of the i'th element of zigzag order. */ static short ZAG[DCTSIZE2] = { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 }; LOCAL void qdescale_zig (input, outputptr, quanttbl) JBLOCK input; JBLOCKROW outputptr; QUANT_TBL_PTR quanttbl; { short i; for (i = 0; i < DCTSIZE2; i++) { (*outputptr)[ZAG[i]] = (*input++) * (*quanttbl++); } } /* * Fetch one MCU row from entropy_decode, build coefficient array. * This version is used for noninterleaved (single-component) scans. */ METHODDEF void disassemble_noninterleaved_MCU (cinfo, image_data) decompress_info_ptr cinfo; JBLOCKIMAGE image_data; { JBLOCK MCU_data[1]; long mcuindex; jpeg_component_info * compptr; QUANT_TBL_PTR quant_ptr; /* this is pretty easy since there is one component and one block per MCU */ compptr = cinfo->cur_comp_info[0]; quant_ptr = cinfo->quant_tbl_ptrs[compptr->quant_tbl_no]; for (mcuindex = 0; mcuindex < cinfo->MCUs_per_row; mcuindex++) { /* Fetch the coefficient data */ (*cinfo->methods->entropy_decode) (cinfo, MCU_data); /* Descale, reorder, and distribute it into the image array */ qdescale_zig(MCU_data[0], image_data[0][0] + mcuindex, quant_ptr); } } /* * Fetch one MCU row from entropy_decode, build coefficient array. * This version is used for interleaved (multi-component) scans. */ METHODDEF void disassemble_interleaved_MCU (cinfo, image_data) decompress_info_ptr cinfo; JBLOCKIMAGE image_data; { JBLOCK MCU_data[MAX_BLOCKS_IN_MCU]; long mcuindex; short blkn, ci, xpos, ypos; jpeg_component_info * compptr; QUANT_TBL_PTR quant_ptr; JBLOCKROW image_ptr; for (mcuindex = 0; mcuindex < cinfo->MCUs_per_row; mcuindex++) { /* Fetch the coefficient data */ (*cinfo->methods->entropy_decode) (cinfo, MCU_data); /* Descale, reorder, and distribute it into the image array */ blkn = 0; for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; quant_ptr = cinfo->quant_tbl_ptrs[compptr->quant_tbl_no]; for (ypos = 0; ypos < compptr->MCU_height; ypos++) { image_ptr = image_data[ci][ypos] + (mcuindex * compptr->MCU_width); for (xpos = 0; xpos < compptr->MCU_width; xpos++) { qdescale_zig(MCU_data[blkn], image_ptr, quant_ptr); image_ptr++; blkn++; } } } } } /* * Initialize for processing a scan. */ METHODDEF void disassemble_init (cinfo) decompress_info_ptr cinfo; { /* no work for now */ } /* * Clean up after a scan. */ METHODDEF void disassemble_term (cinfo) decompress_info_ptr cinfo; { /* no work for now */ } /* * The method selection routine for MCU disassembly. */ GLOBAL void jseldmcu (cinfo) decompress_info_ptr cinfo; { if (cinfo->comps_in_scan == 1) cinfo->methods->disassemble_MCU = disassemble_noninterleaved_MCU; else cinfo->methods->disassemble_MCU = disassemble_interleaved_MCU; cinfo->methods->disassemble_init = disassemble_init; cinfo->methods->disassemble_term = disassemble_term; } /* ########################################################################## */ /* * jdsample.c * */ /* * Initialize for un-subsampling a scan. */ METHODDEF void unsubsample_init (cinfo) decompress_info_ptr cinfo; { /* no work for now */ } /* * Un-subsample pixel values of a single component. * This version only handles integral sampling ratios. */ METHODDEF void unsubsample (cinfo, which_component, input_cols, input_rows, output_cols, output_rows, above, input_data, below, output_data) decompress_info_ptr cinfo; int which_component; long input_cols; int input_rows; long output_cols; int output_rows; JSAMPARRAY above; JSAMPARRAY input_data; JSAMPARRAY below; JSAMPARRAY output_data; { jpeg_component_info * compptr = cinfo->cur_comp_info[which_component]; short h_expand, v_expand, h, v; int inrow, outrow; long incol; JSAMPROW inptr, outptr; JSAMPLE invalue; /* TEMP FOR DEBUGGING PIPELINE CONTROLLER */ if (input_rows != compptr->v_samp_factor || output_rows != cinfo->max_v_samp_factor || (input_cols % compptr->h_samp_factor) != 0 || (output_cols % cinfo->max_h_samp_factor) != 0 || output_cols*compptr->h_samp_factor != input_cols*cinfo->max_h_samp_factor) ERREXIT(cinfo->emethods, "Bogus unsubsample parameters"); h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor; v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor; outrow = 0; for (inrow = 0; inrow < input_rows; inrow++) { for (v = 0; v < v_expand; v++) { inptr = input_data[inrow]; outptr = output_data[outrow++]; for (incol = 0; incol < input_cols; incol++) { invalue = GETJSAMPLE(*inptr++); for (h = 0; h < h_expand; h++) { *outptr++ = invalue; } } } } } /* * Un-subsample pixel values of a single component. * This version handles the special case of a full-size component. */ METHODDEF void fullsize_unsubsample (cinfo, which_component, input_cols, input_rows, output_cols, output_rows, above, input_data, below, output_data) decompress_info_ptr cinfo; int which_component; long input_cols; int input_rows; long output_cols; int output_rows; JSAMPARRAY above; JSAMPARRAY input_data; JSAMPARRAY below; JSAMPARRAY output_data; { if (input_cols != output_cols || input_rows != output_rows) /* DEBUG */ ERREXIT(cinfo->emethods, "Pipeline controller messed up"); jcopy_sample_rows(input_data, 0, output_data, 0, output_rows, output_cols); } /* * Clean up after a scan. */ METHODDEF void unsubsample_term (cinfo) decompress_info_ptr cinfo; { /* no work for now */ } /* * The method selection routine for unsubsampling. * Note that we must select a routine for each component. */ GLOBAL void jselunsubsample (cinfo) decompress_info_ptr cinfo; { short ci; jpeg_component_info * compptr; if (cinfo->CCIR601_sampling) ERREXIT(cinfo->emethods, "CCIR601 subsampling not implemented yet"); for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; if (compptr->h_samp_factor == cinfo->max_h_samp_factor && compptr->v_samp_factor == cinfo->max_v_samp_factor) cinfo->methods->unsubsample[ci] = fullsize_unsubsample; else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 && (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) cinfo->methods->unsubsample[ci] = unsubsample; else ERREXIT(cinfo->emethods, "Fractional subsampling not implemented yet"); } cinfo->methods->unsubsample_init = unsubsample_init; cinfo->methods->unsubsample_term = unsubsample_term; } /* ########################################################################## */ /* * jrevdct.c * */ /* The poop on this scaling stuff is as follows: * * Most of the numbers (after multiplication by the constants) are * (logically) shifted left by LG2_DCT_SCALE. This is undone by UNFIXH * before assignment to the output array. Note that we want an additional * division by 2 on the output (required by the equations). * * If right shifts are unsigned, then there is a potential problem. * However, shifting right by 16 and then assigning to a short * (assuming short = 16 bits) will keep the sign right!! * * For other shifts, * * ((x + (1 << 30)) >> shft) - (1 << (30 - shft)) * * gives a nice right shift with sign (assuming no overflow). However, all the * scaling is such that this isn't a problem. (Is this true?) */ #define ONE 1L /* remove L if long > 32 bits */ #ifdef RIGHT_SHIFT_IS_UNSIGNED #define LG2_DCT_SCALE 15 #define RIGHT_SHIFT(_x,_shft) ((((_x) + (ONE << 30)) >> (_shft)) - (ONE << (30 - (_shft)))) #else #define LG2_DCT_SCALE 16 #define RIGHT_SHIFT(_x,_shft) ((_x) >> (_shft)) #endif #define DCT_SCALE (ONE << LG2_DCT_SCALE) #define LG2_OVERSCALE 2 #define OVERSCALE (ONE << LG2_OVERSCALE) #define FIX(x) ((INT32) ((x) * DCT_SCALE + 0.5)) #define FIXO(x) ((INT32) ((x) * DCT_SCALE / OVERSCALE + 0.5)) #define UNFIX(x) RIGHT_SHIFT((x) + (ONE << (LG2_DCT_SCALE-1)), LG2_DCT_SCALE) #define UNFIXH(x) RIGHT_SHIFT((x) + (ONE << LG2_DCT_SCALE), LG2_DCT_SCALE+1) #define UNFIXO(x) RIGHT_SHIFT((x) + (ONE << (LG2_DCT_SCALE-1-LG2_OVERSCALE)), LG2_DCT_SCALE-LG2_OVERSCALE) #define OVERSH(x) ((x) << LG2_OVERSCALE) #define SIN_1_4 FIX(0.7071067811856476) #define COS_1_4 SIN_1_4 #define SIN_1_8 FIX(0.3826834323650898) #define COS_1_8 FIX(0.9238795325112870) #define SIN_3_8 COS_1_8 #define COS_3_8 SIN_1_8 #define SIN_1_16 FIX(0.1950903220161282) #define COS_1_16 FIX(0.9807852804032300) #define SIN_7_16 COS_1_16 #define COS_7_16 SIN_1_16 #define SIN_3_16 FIX(0.5555702330196022) #define COS_3_16 FIX(0.8314696123025450) #define SIN_5_16 COS_3_16 #define COS_5_16 SIN_3_16 #define OSIN_1_4 FIXO(0.707106781185647) #define OCOS_1_4 OSIN_1_4 #define OSIN_1_8 FIXO(0.3826834323650898) #define OCOS_1_8 FIXO(0.9238795325112870) #define OSIN_3_8 OCOS_1_8 #define OCOS_3_8 OSIN_1_8 #define OSIN_1_16 FIXO(0.1950903220161282) #define OCOS_1_16 FIXO(0.9807852804032300) #define OSIN_7_16 OCOS_1_16 #define OCOS_7_16 OSIN_1_16 #define OSIN_3_16 FIXO(0.5555702330196022) #define OCOS_3_16 FIXO(0.8314696123025450) #define OSIN_5_16 OCOS_3_16 #define OCOS_5_16 OSIN_3_16 /* INLINE SYSVR3 + gcc -traditional trips on this */ LOCAL void fast_idct_8 (in, stride) DCTELEM *in; int stride; { /* tmp1x are new values of tmpx -- flashy register colourers * should be able to do this lot very well */ INT32 tmp10, tmp11, tmp12, tmp13; INT32 tmp20, tmp21, tmp22, tmp23; INT32 tmp30, tmp31; INT32 tmp40, tmp41, tmp42, tmp43; INT32 tmp50, tmp51, tmp52, tmp53; INT32 in0, in1, in2, in3, in4, in5, in6, in7; in0 = in[ 0]; in1 = in[stride ]; in2 = in[stride*2]; in3 = in[stride*3]; in4 = in[stride*4]; in5 = in[stride*5]; in6 = in[stride*6]; in7 = in[stride*7]; tmp10 = (in0 + in4) * COS_1_4; tmp11 = (in0 - in4) * COS_1_4; tmp12 = in2 * SIN_1_8 - in6 * COS_1_8; tmp13 = in6 * SIN_1_8 + in2 * COS_1_8; tmp20 = tmp10 + tmp13; tmp21 = tmp11 + tmp12; tmp22 = tmp11 - tmp12; tmp23 = tmp10 - tmp13; tmp30 = UNFIXO((in3 + in5) * COS_1_4); tmp31 = UNFIXO((in3 - in5) * COS_1_4); tmp40 = OVERSH(in1) + tmp30; tmp41 = OVERSH(in7) + tmp31; tmp42 = OVERSH(in1) - tmp30; tmp43 = OVERSH(in7) - tmp31; tmp50 = tmp40 * OCOS_1_16 + tmp41 * OSIN_1_16; tmp51 = tmp40 * OSIN_1_16 - tmp41 * OCOS_1_16; tmp52 = tmp42 * OCOS_5_16 + tmp43 * OSIN_5_16; tmp53 = tmp42 * OSIN_5_16 - tmp43 * OCOS_5_16; in[ 0] = UNFIXH(tmp20 + tmp50); in[stride ] = UNFIXH(tmp21 + tmp53); in[stride*2] = UNFIXH(tmp22 + tmp52); in[stride*3] = UNFIXH(tmp23 + tmp51); in[stride*4] = UNFIXH(tmp23 - tmp51); in[stride*5] = UNFIXH(tmp22 - tmp52); in[stride*6] = UNFIXH(tmp21 - tmp53); in[stride*7] = UNFIXH(tmp20 - tmp50); } /* * Perform the inverse DCT on one block of coefficients. * * Note that this code is specialized to the case DCTSIZE = 8. */ GLOBAL void j_rev_dct (data) DCTBLOCK data; { int i; for (i = 0; i < DCTSIZE; i++) fast_idct_8(data+i*DCTSIZE, 1); for (i = 0; i < DCTSIZE; i++) fast_idct_8(data+i, DCTSIZE); } /* ########################################################################## */ /* * jutils.c */ GLOBAL void jcopy_sample_rows (input_array, source_row, output_array, dest_row, num_rows, num_cols) JSAMPARRAY input_array; int source_row; JSAMPARRAY output_array; int dest_row; int num_rows; long num_cols; /* Copy some rows of samples from one place to another. * num_rows rows are copied from input_array[source_row++] * to output_array[dest_row++]; these areas should not overlap. * The source and destination arrays must be at least as wide as num_cols. */ { register JSAMPROW inptr, outptr; register size_t count = num_cols * SIZEOF(JSAMPLE); register int row; input_array += source_row; output_array += dest_row; for (row = num_rows; row > 0; row--) { inptr = *input_array++; outptr = *output_array++; memcpy((void *)outptr, (void *)inptr, count); } } /* ########################################################################## */ /* * jvirtmem.c * */ /* * Some important notes: * The array alloc/dealloc routines are not merely a convenience; * on 80x86 machines the bottom-level pointers in an array are FAR * and thus may not be allocatable by alloc_small. * * Also, it's not a good idea to try to merge the sarray and barray * routines, even though they are textually almost the same, because * samples are usually stored as bytes while coefficients are shorts. * Thus, in machines where byte pointers have a different representation * from word pointers, the resulting machine code could not be the same. */ static external_methods_ptr methods; /* saved for access to error_exit */ LOCAL void out_of_memory (which) int which; /* Report an out-of-memory error and stop execution */ { ERREXIT1(methods, "Insufficient memory (case %d)", which); } METHODDEF void * alloc_small (sizeofobject) size_t sizeofobject; /* Allocate a "small" (all-in-memory) object */ { void * result; result = lmalloc(sizeofobject); if (result == NULL) out_of_memory(1); return result; } METHODDEF void free_small (ptr) void *ptr; /* Free a "small" (all-in-memory) object */ { lfree(ptr); } METHODDEF JSAMPARRAY alloc_small_sarray (samplesperrow, numrows) long samplesperrow; long numrows; /* Allocate a "small" (all-in-memory) 2-D sample array */ { JSAMPARRAY result; long i; /* Get space for row pointers; this is always "near" on 80x86 */ result = (JSAMPARRAY) alloc_small((size_t) (numrows * SIZEOF(JSAMPROW))); /* Get the rows themselves; on 80x86 these are "far" */ for (i = 0; i < numrows; i++) { result[i] = (JSAMPROW) lmalloc((size_t) (samplesperrow * SIZEOF(JSAMPLE))); if (result[i] == NULL) out_of_memory(3); } return result; } METHODDEF void free_small_sarray (ptr, numrows) JSAMPARRAY ptr; long numrows; /* Free a "small" (all-in-memory) 2-D sample array */ { long i; /* Free the rows themselves; on 80x86 these are "far" */ for (i = 0; i < numrows; i++) { lfree((void *) ptr[i]); } /* Free space for row pointers; this is always "near" on 80x86 */ free_small((void *) ptr); } METHODDEF JBLOCKARRAY alloc_small_barray (blocksperrow, numrows) long blocksperrow; long numrows; /* Allocate a "small" (all-in-memory) 2-D coefficient-block array */ { JBLOCKARRAY result; long i; /* Get space for row pointers; this is always "near" on 80x86 */ result = (JBLOCKARRAY) alloc_small((size_t) (numrows * SIZEOF(JBLOCKROW))); /* Get the rows themselves; on 80x86 these are "far" */ for (i = 0; i < numrows; i++) { result[i] = (JBLOCKROW) lmalloc((size_t) (blocksperrow * SIZEOF(JBLOCK))); if (result[i] == NULL) out_of_memory(4); } return result; } METHODDEF void free_small_barray (ptr, numrows) JBLOCKARRAY ptr; long numrows; /* Free a "small" (all-in-memory) 2-D coefficient-block array */ { long i; /* Free the rows themselves; on 80x86 these are "far" */ for (i = 0; i < numrows; i++) { lfree((void *) ptr[i]); } /* Free space for row pointers; this is always "near" on 80x86 */ free_small((void *) ptr); } /* The control blocks for virtual arrays. * These are pretty minimal in this implementation. * Note: in this implementation we could realize big arrays * at request time and make alloc_big_arrays a no-op; * however, doing it separately keeps callers honest. */ struct big_sarray_control { JSAMPARRAY mem_buffer; /* memory buffer (the whole thing, here) */ long rows_in_mem; /* Height of memory buffer */ long samplesperrow; /* Width of memory buffer */ long unitheight; /* # of rows accessed by access_big_sarray() */ big_sarray_ptr next; /* list link for unrealized arrays */ }; struct big_barray_control { JBLOCKARRAY mem_buffer; /* memory buffer (the whole thing, here) */ long rows_in_mem; /* Height of memory buffer */ long blocksperrow; /* Width of memory buffer */ long unitheight; /* # of rows accessed by access_big_barray() */ big_barray_ptr next; /* list link for unrealized arrays */ }; /* Headers of lists of control blocks for unrealized big arrays */ static big_sarray_ptr unalloced_sarrays; static big_barray_ptr unalloced_barrays; METHODDEF big_sarray_ptr request_big_sarray (samplesperrow, numrows, unitheight) long samplesperrow; long numrows; long unitheight; /* Request a "big" (virtual-memory) 2-D sample array */ { big_sarray_ptr result; /* get control block */ result = (big_sarray_ptr) alloc_small(SIZEOF(struct big_sarray_control)); result->mem_buffer = NULL; /* lets access routine spot premature access */ result->rows_in_mem = numrows; result->samplesperrow = samplesperrow; result->unitheight = unitheight; result->next = unalloced_sarrays; /* add to list of unallocated arrays */ unalloced_sarrays = result; return result; } METHODDEF big_barray_ptr request_big_barray (blocksperrow, numrows, unitheight) long blocksperrow; long numrows; long unitheight; /* Request a "big" (virtual-memory) 2-D coefficient-block array */ { big_barray_ptr result; /* get control block */ result = (big_barray_ptr) alloc_small(SIZEOF(struct big_barray_control)); result->mem_buffer = NULL; /* lets access routine spot premature access */ result->rows_in_mem = numrows; result->blocksperrow = blocksperrow; result->unitheight = unitheight; result->next = unalloced_barrays; /* add to list of unallocated arrays */ unalloced_barrays = result; return result; } METHODDEF void alloc_big_arrays (extra_small_samples, extra_small_blocks, extra_medium_space) long extra_small_samples; long extra_small_blocks; long extra_medium_space; /* Allocate the in-memory buffers for any unrealized "big" arrays */ /* 'extra' values are upper bounds for total future small-array requests */ /* and far-heap requests */ { /* In this implementation we just malloc the whole arrays */ /* and expect the system's virtual memory to worry about swapping them */ big_sarray_ptr sptr; big_barray_ptr bptr; for (sptr = unalloced_sarrays; sptr != NULL; sptr = sptr->next) { sptr->mem_buffer = alloc_small_sarray(sptr->samplesperrow, sptr->rows_in_mem); } for (bptr = unalloced_barrays; bptr != NULL; bptr = bptr->next) { bptr->mem_buffer = alloc_small_barray(bptr->blocksperrow, bptr->rows_in_mem); } unalloced_sarrays = NULL; /* reset for possible future cycles */ unalloced_barrays = NULL; } METHODDEF JSAMPARRAY access_big_sarray (ptr, start_row, writable) big_sarray_ptr ptr; long start_row; boolean writable; /* Access the part of a "big" sample array starting at start_row */ /* and extending for ptr->unitheight rows. writable is true if */ /* caller intends to modify the accessed area. */ { /* debugging check */ if (start_row < 0 || start_row+ptr->unitheight > ptr->rows_in_mem || ptr->mem_buffer == NULL) ERREXIT(methods, "Bogus access_big_sarray request"); return ptr->mem_buffer + start_row; } METHODDEF JBLOCKARRAY access_big_barray (ptr, start_row, writable) big_barray_ptr ptr; long start_row; boolean writable; /* Access the part of a "big" coefficient-block array starting at start_row */ /* and extending for ptr->unitheight rows. writable is true if */ /* caller intends to modify the accessed area. */ { /* debugging check */ if (start_row < 0 || start_row+ptr->unitheight > ptr->rows_in_mem || ptr->mem_buffer == NULL) ERREXIT(methods, "Bogus access_big_barray request"); return ptr->mem_buffer + start_row; } METHODDEF void free_big_sarray (ptr) big_sarray_ptr ptr; /* Free a "big" (virtual-memory) 2-D sample array */ { free_small_sarray(ptr->mem_buffer, ptr->rows_in_mem); free_small((void *) ptr); /* free the control block too */ } METHODDEF void free_big_barray (ptr) big_barray_ptr ptr; /* Free a "big" (virtual-memory) 2-D coefficient-block array */ { free_small_barray(ptr->mem_buffer, ptr->rows_in_mem); free_small((void *) ptr); /* free the control block too */ } /* * The method selection routine for virtual memory systems. * The system-dependent setup routine should call this routine * to install the necessary method pointers in the supplied struct. */ GLOBAL void jselvirtmem (emethods) external_methods_ptr emethods; { methods = emethods; /* save struct addr for error exit access */ emethods->alloc_small = alloc_small; emethods->free_small = free_small; emethods->alloc_small_sarray = alloc_small_sarray; emethods->free_small_sarray = free_small_sarray; emethods->alloc_small_barray = alloc_small_barray; emethods->free_small_barray = free_small_barray; emethods->request_big_sarray = request_big_sarray; emethods->request_big_barray = request_big_barray; emethods->alloc_big_arrays = alloc_big_arrays; emethods->access_big_sarray = access_big_sarray; emethods->access_big_barray = access_big_barray; emethods->free_big_sarray = free_big_sarray; emethods->free_big_barray = free_big_barray; unalloced_sarrays = NULL; /* make sure list headers are empty */ unalloced_barrays = NULL; } /* ########################################################################## */ /* * jerror.c * */ METHODDEF void trace_message (msgtext) char *msgtext; { fprintf(stderr, msgtext, methods->message_parm[0], methods->message_parm[1], methods->message_parm[2], methods->message_parm[3], methods->message_parm[4], methods->message_parm[5], methods->message_parm[6], methods->message_parm[7]); fprintf(stderr, "\n"); } METHODDEF void error_exit (msgtext) char *msgtext; { trace_message(msgtext); cleanup(-1); } /* * The method selection routine for simple error handling. * The system-dependent setup routine should call this routine * to install the necessary method pointers in the supplied struct. */ GLOBAL void jselerror (emethods) external_methods_ptr emethods; { methods = emethods; /* save struct addr for msg parm access */ emethods->error_exit = error_exit; emethods->trace_message = trace_message; emethods->trace_level = 0; /* default = no tracing */ } /* ########################################################################## */ kit/image/jpeg.h010064400237450000000000000740240642466042700133470ustar nishidawheel/* * Copyright (C) 1991, Thomas G. Lane. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying jpeg.c file. * */ /* * xloadimage modifications by Graeme Gill, 18/11/91 * */ #include #define SIZEOF(object) ((size_t) sizeof(object)) /* Assume compiler supports both these - GWG*/ #define HAVE_UNSIGNED_CHAR #define HAVE_UNSIGNED_SHORT #ifdef __GNUC__ /* GNU C has inline... */ #define INLINE inline #else /* ...but I don't think anyone else does. */ #define INLINE #endif typedef int boolean; #define FALSE 0 /* values of boolean */ #define TRUE 1 #define JPEG_BUF_SIZE 4096 /* bytes */ /* These symbols determine the JPEG functionality supported. */ /* * These defines indicate whether to include various optional functions. * Undefining some of these symbols will produce a smaller but less capable * program file. Note that you can leave certain source files out of the * compilation/linking process if you've #undef'd the corresponding symbols. * (You may HAVE to do that if your compiler doesn't like null source files.) */ /* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ #undef ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ #define MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ #define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ #define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing during decoding? */ /* these defines indicate which JPEG file formats are allowed */ #define JFIF_SUPPORTED /* JFIF or "raw JPEG" files */ #define EIGHT_BIT_SAMPLES #ifdef EIGHT_BIT_SAMPLES /* JSAMPLE should be the smallest type that will hold the values 0..255. * You can use a signed char by having GETJSAMPLE mask it with 0xFF. * If you have only signed chars, and you are more worried about speed than * memory usage, it might be a win to make JSAMPLE be short. */ #ifdef HAVE_UNSIGNED_CHAR typedef unsigned char JSAMPLE; #define GETJSAMPLE(value) (value) #else /* not HAVE_UNSIGNED_CHAR */ #ifdef CHAR_IS_UNSIGNED typedef char JSAMPLE; #define GETJSAMPLE(value) (value) #else /* not CHAR_IS_UNSIGNED */ typedef char JSAMPLE; #define GETJSAMPLE(value) ((value) & 0xFF) #endif /* CHAR_IS_UNSIGNED */ #endif /* HAVE_UNSIGNED_CHAR */ #define MAXJSAMPLE 255 #define CENTERJSAMPLE 128 #endif /* EIGHT_BIT_SAMPLES */ /* Here we define the representation of a DCT frequency coefficient. * This should be a signed 16-bit value; "short" is usually right. * It's important that this be exactly 16 bits, no more and no less; * more will cost you a BIG hit of memory, less will give wrong answers. */ typedef short JCOEF; /* The remaining typedefs are used for various table entries and so forth. * They must be at least as wide as specified; but making them too big * won't cost a huge amount of memory, so we don't provide special * extraction code like we did for JSAMPLE. (In other words, these * typedefs live at a different point on the speed/space tradeoff curve.) */ /* UINT8 must hold at least the values 0..255. */ #ifdef HAVE_UNSIGNED_CHAR typedef unsigned char UINT8; #else /* not HAVE_UNSIGNED_CHAR */ #ifdef CHAR_IS_UNSIGNED typedef char UINT8; #else /* not CHAR_IS_UNSIGNED */ typedef short UINT8; #endif /* CHAR_IS_UNSIGNED */ #endif /* HAVE_UNSIGNED_CHAR */ /* UINT16 must hold at least the values 0..65535. */ #ifdef HAVE_UNSIGNED_SHORT typedef unsigned short UINT16; #else /* not HAVE_UNSIGNED_SHORT */ typedef unsigned int UINT16; #endif /* HAVE_UNSIGNED_SHORT */ /* INT16 must hold at least the values -32768..32767. */ typedef short INT16; /* INT32 must hold signed 32-bit values; if your machine happens */ /* to have 64-bit longs, you might want to change this. */ typedef long INT32; /* These defines are used in all function definitions and extern declarations. * You could modify them if you need to change function linkage conventions, * as is shown below for use with C++. Another application would be to make * all functions global for use with code profilers that require it. * NOTE: the C++ test does the right thing if you are reading this include * file in a C++ application to link to JPEG code that's been compiled with a * regular C compiler. I'm not sure it works if you try to compile the JPEG * code with C++. */ #define METHODDEF static /* a function called through method pointers */ #define LOCAL static /* a function used only in its module */ #define GLOBAL /* a function referenced thru EXTERNs */ #define EXTERN /* a reference to a GLOBAL function */ /* Forward references to lists of method pointers */ typedef struct external_methods_struct * external_methods_ptr; typedef struct compress_methods_struct * compress_methods_ptr; typedef struct decompress_methods_struct * decompress_methods_ptr; /* Data structures for images containing either samples or coefficients. */ /* Note that the topmost (leftmost) index is always color component. */ /* On 80x86 machines, the image arrays are too big for near pointers, */ /* but the pointer arrays can fit in near memory. */ typedef JSAMPLE *JSAMPROW; /* ptr to one image row of pixel samples. */ typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ #define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ #define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ typedef JBLOCK *JBLOCKROW; /* pointer to one row of coefficient blocks */ typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ typedef JCOEF *JCOEFPTR; /* useful in a couple of places */ /* The input and output data of the DCT transform subroutines are of * the following type, which need not be the same as JCOEF. * For example, on a machine with fast floating point, it might make sense * to recode the DCT routines to use floating point; then DCTELEM would be * 'float' or 'double'. */ typedef JCOEF DCTELEM; typedef DCTELEM DCTBLOCK[DCTSIZE2]; /* Types for JPEG compression parameters and working tables. */ typedef enum { /* defines known color spaces */ CS_UNKNOWN, /* error/unspecified */ CS_GRAYSCALE, /* monochrome (only 1 component) */ CS_RGB, /* red/green/blue */ CS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ CS_YIQ, /* Y/I/Q */ CS_CMYK /* C/M/Y/K */ } COLOR_SPACE; typedef struct { /* Basic info about one component */ /* These values are fixed over the whole image */ /* For compression, they must be supplied by the user interface; */ /* for decompression, they are read from the SOF marker. */ short component_id; /* identifier for this component (0..255) */ short component_index; /* its index in SOF or cinfo->comp_info[] */ short h_samp_factor; /* horizontal sampling factor (1..4) */ short v_samp_factor; /* vertical sampling factor (1..4) */ short quant_tbl_no; /* quantization table selector (0..3) */ /* These values may vary between scans */ /* For compression, they must be supplied by the user interface; */ /* for decompression, they are read from the SOS marker. */ short dc_tbl_no; /* DC entropy table selector (0..3) */ short ac_tbl_no; /* AC entropy table selector (0..3) */ /* These values are computed during compression or decompression startup */ long true_comp_width; /* component's image width in samples */ long true_comp_height; /* component's image height in samples */ /* the above are the logical dimensions of the subsampled image */ /* These values are computed before starting a scan of the component */ short MCU_width; /* number of blocks per MCU, horizontally */ short MCU_height; /* number of blocks per MCU, vertically */ short MCU_blocks; /* MCU_width * MCU_height */ long subsampled_width; /* image width in samples, after expansion */ long subsampled_height; /* image height in samples, after expansion */ /* the above are the true_comp_xxx values rounded up to multiples of */ /* the MCU dimensions; these are the working dimensions of the array */ /* as it is passed through the DCT or IDCT step. NOTE: these values */ /* differ depending on whether the component is interleaved or not!! */ } jpeg_component_info; /* DCT coefficient quantization tables. * For 8-bit precision, 'INT16' should be good enough for quantization values; * for more precision, we go for the full 16 bits. 'INT16' provides a useful * speedup on many machines (multiplication & division of JCOEFs by * quantization values is a significant chunk of the runtime). * Note: the values in a QUANT_TBL are always given in zigzag order. */ typedef INT16 QUANT_VAL; /* element of a quantization table */ typedef QUANT_VAL QUANT_TBL[DCTSIZE2]; /* A quantization table */ typedef QUANT_VAL * QUANT_TBL_PTR; /* pointer to same */ typedef struct { /* A Huffman coding table */ /* These two fields directly represent the contents of a JPEG DHT marker */ UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ /* length k bits; bits[0] is unused */ UINT8 huffval[256]; /* The symbols, in order of incr code length */ /* This field is used only during compression. It's initialized FALSE when * the table is created, and set TRUE when it's been output to the file. */ boolean sent_table; /* TRUE when table has been output */ /* The remaining fields are computed from the above to allow more efficient * coding and decoding. These fields should be considered private to the * Huffman compression & decompression modules. */ UINT16 ehufco[256]; /* code for each symbol */ char ehufsi[256]; /* length of code for each symbol */ UINT16 mincode[17]; /* smallest code of length k */ INT32 maxcode[17]; /* largest code of length k (-1 if none) */ short valptr[17]; /* huffval[] index of 1st symbol of length k */ } HUFF_TBL; #define NUM_QUANT_TBLS 4 /* quantization tables are numbered 0..3 */ #define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ #define NUM_ARITH_TBLS 16 /* arith-coding tables are numbered 0..15 */ #define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ #define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ #define MAX_BLOCKS_IN_MCU 10 /* JPEG limit on # of blocks in an MCU */ /* Working data for decompression */ struct decompress_info_struct { /* * These fields shall be established by the user interface before * calling jpeg_decompress. Note that the UI must supply the storage for * the main methods struct, though it sets only a few of the methods there. */ char *filename; unsigned int verbose; ZFILE * input_file; /* tells input routines where to read JPEG */ Image *image; /* xloadimage image being returned */ int rows_put; /* Number of rows copied to image */ decompress_methods_ptr methods; /* Points to list of methods to use */ external_methods_ptr emethods; /* Points to list of methods to use */ /* these can be set at d_ui_method_selection time: */ COLOR_SPACE out_color_space; /* colorspace of output */ boolean do_block_smoothing; /* T = apply cross-block smoothing */ boolean do_pixel_smoothing; /* T = apply post-subsampling smoothing */ /* * These fields are used for efficient buffering of data between read_jpeg_data * and the entropy decoding object. By using a shared buffer, we avoid copying * data and eliminate the need for an "unget" operation at the end of a scan. * The actual source of the data is known only to read_jpeg_data; see the * JGETC macro, below. * Note: the user interface is expected to allocate the input_buffer and * initialize bytes_in_buffer to 0. Also, for JFIF/raw-JPEG input, the UI * actually supplies the read_jpeg_data method. */ char * input_buffer; /* start of buffer (private to input code) */ char * next_input_byte; /* => next byte to read from buffer */ int bytes_in_buffer; /* # of bytes remaining in buffer */ boolean eof_found; /* EOF found */ /* * These fields are set by read_file_header or read_scan_header */ long image_width; /* overall image width */ long image_height; /* overall image height */ short data_precision; /* bits of precision in image data */ COLOR_SPACE jpeg_color_space; /* colorspace of JPEG file */ /* These three values are not used by the JPEG code, merely copied */ /* from the JFIF APP0 marker (if any). */ UINT8 density_unit; /* JFIF code for pixel size units */ UINT16 X_density; /* Horizontal pixel density */ UINT16 Y_density; /* Vertical pixel density */ short num_components; /* # of color components in JPEG image */ jpeg_component_info * comp_info; /* comp_info[i] describes component that appears i'th in SOF */ QUANT_TBL_PTR quant_tbl_ptrs[NUM_QUANT_TBLS]; /* ptrs to coefficient quantization tables, or NULL if not defined */ HUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; HUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; /* ptrs to Huffman coding tables, or NULL if not defined */ UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ boolean CCIR601_sampling; /* TRUE=first samples are cosited */ UINT16 restart_interval;/* MDUs per restart interval, or 0 for no restart */ /* * These fields are computed during jpeg_decompress startup */ short max_h_samp_factor; /* largest h_samp_factor */ short max_v_samp_factor; /* largest v_samp_factor */ short color_out_comps; /* # of color components output by color_convert */ /* (need not match num_components) */ short final_out_comps; /* # of color components in output image */ /* * These fields are valid during any one scan */ short comps_in_scan; /* # of JPEG components input this time */ jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; /* *cur_comp_info[i] describes component that appears i'th in SOS */ long MCUs_per_row; /* # of MCUs across the image */ long MCU_rows_in_scan; /* # of MCU rows in the image */ short blocks_in_MCU; /* # of DCT blocks per MCU */ short MCU_membership[MAX_BLOCKS_IN_MCU]; /* MCU_membership[i] is index in cur_comp_info of component owning */ /* i'th block in an MCU */ /* these fields are private data for the entropy encoder */ JCOEF last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each comp */ JCOEF last_dc_diff[MAX_COMPS_IN_SCAN]; /* last DC diff for each comp */ UINT16 restarts_to_go; /* MDUs left in this restart interval */ short next_restart_num; /* # of next RSTn marker (0..7) */ }; typedef struct decompress_info_struct * decompress_info_ptr; /* Macros for reading data from the decompression input buffer */ #ifdef CHAR_IS_UNSIGNED #define JGETC(cinfo) ( !(cinfo)->eof_found ? (--(cinfo)->bytes_in_buffer < 0 ? \ (*(cinfo)->methods->read_jpeg_data) (cinfo) : \ (int) *(cinfo)->next_input_byte++ ) : EOF) #else #define JGETC(cinfo) ( !(cinfo)->eof_found ? (--(cinfo)->bytes_in_buffer < 0 ? \ (*(cinfo)->methods->read_jpeg_data) (cinfo) : \ (int) (*(cinfo)->next_input_byte++) & 0xFF ) : EOF) #endif #define JUNGETC(ch,cinfo) ((cinfo)->bytes_in_buffer++, \ *(--((cinfo)->next_input_byte)) = (ch)) #define MIN_UNGET 2 /* may always do at least 2 JUNGETCs */ /* A virtual image has a control block whose contents are private to the * memory manager module (and may differ between managers). The rest of the * code only refers to virtual images by these pointer types. */ typedef struct big_sarray_control * big_sarray_ptr; typedef struct big_barray_control * big_barray_ptr; /* Method types that need typedefs */ #define METHOD(type,methodname,arglist) type (*methodname) () typedef METHOD(void, MCU_output_method_ptr, (compress_info_ptr cinfo, JBLOCK *MCU_data)); typedef METHOD(void, MCU_output_caller_ptr, (compress_info_ptr cinfo, MCU_output_method_ptr output_method)); typedef METHOD(void, subsample_ptr, (compress_info_ptr cinfo, int which_component, long input_cols, int input_rows, long output_cols, int output_rows, JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, JSAMPARRAY output_data)); typedef METHOD(void, unsubsample_ptr, (decompress_info_ptr cinfo, int which_component, long input_cols, int input_rows, long output_cols, int output_rows, JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, JSAMPARRAY output_data)); typedef METHOD(void, quantize_method_ptr, (decompress_info_ptr cinfo, int num_rows, JSAMPIMAGE input_data, JSAMPARRAY output_workspace)); typedef METHOD(void, quantize_caller_ptr, (decompress_info_ptr cinfo, quantize_method_ptr quantize_method)); /* These structs contain function pointers for the various JPEG methods. */ /* Routines to be provided by the surrounding application, rather than the * portable JPEG code proper. These are the same for compression and * decompression. */ struct external_methods_struct { /* User interface: error exit and trace message routines */ /* NOTE: the string msgtext parameters will eventually be replaced */ /* by an enumerated-type code so that non-English error messages */ /* can be substituted easily. This will not be done until all the */ /* code is in place, so that we know what messages are needed. */ METHOD(void, error_exit, (char *msgtext)); METHOD(void, trace_message, (char *msgtext)); /* Working data for error/trace facility */ /* See macros below for the usage of these variables */ int trace_level; /* level of detail of tracing messages */ /* Use level 0 for unsuppressable messages (nonfatal errors) */ /* Use levels 1, 2, 3 for successively more detailed trace options */ int message_parm[8]; /* store numeric parms for messages here */ /* Memory management */ /* NB: alloc routines never return NULL. They exit to */ /* error_exit if not successful. */ METHOD(void *, alloc_small, (size_t sizeofobject)); METHOD(void, free_small, (void *ptr)); #define alloc_medium alloc_small #define free_medium free_small METHOD(JSAMPARRAY, alloc_small_sarray, (long samplesperrow, long numrows)); METHOD(void, free_small_sarray, (JSAMPARRAY ptr, long numrows)); METHOD(JBLOCKARRAY, alloc_small_barray, (long blocksperrow, long numrows)); METHOD(void, free_small_barray, (JBLOCKARRAY ptr, long numrows)); METHOD(big_sarray_ptr, request_big_sarray, (long samplesperrow, long numrows, long unitheight)); METHOD(big_barray_ptr, request_big_barray, (long blocksperrow, long numrows, long unitheight)); METHOD(void, alloc_big_arrays, (long extra_small_samples, long extra_small_blocks, long extra_medium_space)); METHOD(JSAMPARRAY, access_big_sarray, (big_sarray_ptr ptr, long start_row, boolean writable)); METHOD(JBLOCKARRAY, access_big_barray, (big_barray_ptr ptr, long start_row, boolean writable)); METHOD(void, free_big_sarray, (big_sarray_ptr ptr)); METHOD(void, free_big_barray, (big_barray_ptr ptr)); }; /* Macros to simplify using the error and trace message stuff */ /* The first parameter is generally cinfo->emethods */ #define ERREXIT(emeth,msg) ((*(emeth)->error_exit) (msg)) #define ERREXIT1(emeth,msg,p1) ((emeth)->message_parm[0] = (p1), \ (*(emeth)->error_exit) (msg)) #define ERREXIT2(emeth,msg,p1,p2) ((emeth)->message_parm[0] = (p1), \ (emeth)->message_parm[1] = (p2), \ (*(emeth)->error_exit) (msg)) #define ERREXIT3(emeth,msg,p1,p2,p3) ((emeth)->message_parm[0] = (p1), \ (emeth)->message_parm[1] = (p2), \ (emeth)->message_parm[2] = (p3), \ (*(emeth)->error_exit) (msg)) #define ERREXIT4(emeth,msg,p1,p2,p3,p4) ((emeth)->message_parm[0] = (p1), \ (emeth)->message_parm[1] = (p2), \ (emeth)->message_parm[2] = (p3), \ (emeth)->message_parm[3] = (p4), \ (*(emeth)->error_exit) (msg)) #define TRACEMS(emeth,lvl,msg) \ ( (emeth)->trace_level >= (lvl) ? \ ((*(emeth)->trace_message) (msg), 0) : 0) #define TRACEMS1(emeth,lvl,msg,p1) \ ( (emeth)->trace_level >= (lvl) ? \ ((emeth)->message_parm[0] = (p1), \ (*(emeth)->trace_message) (msg), 0) : 0) #define TRACEMS2(emeth,lvl,msg,p1,p2) \ ( (emeth)->trace_level >= (lvl) ? \ ((emeth)->message_parm[0] = (p1), \ (emeth)->message_parm[1] = (p2), \ (*(emeth)->trace_message) (msg), 0) : 0) #define TRACEMS3(emeth,lvl,msg,p1,p2,p3) \ ( (emeth)->trace_level >= (lvl) ? \ ((emeth)->message_parm[0] = (p1), \ (emeth)->message_parm[1] = (p2), \ (emeth)->message_parm[2] = (p3), \ (*(emeth)->trace_message) (msg), 0) : 0) #define TRACEMS4(emeth,lvl,msg,p1,p2,p3,p4) \ ( (emeth)->trace_level >= (lvl) ? \ ((emeth)->message_parm[0] = (p1), \ (emeth)->message_parm[1] = (p2), \ (emeth)->message_parm[2] = (p3), \ (emeth)->message_parm[3] = (p4), \ (*(emeth)->trace_message) (msg), 0) : 0) #define TRACEMS8(emeth,lvl,msg,p1,p2,p3,p4,p5,p6,p7,p8) \ ( (emeth)->trace_level >= (lvl) ? \ ((emeth)->message_parm[0] = (p1), \ (emeth)->message_parm[1] = (p2), \ (emeth)->message_parm[2] = (p3), \ (emeth)->message_parm[3] = (p4), \ (emeth)->message_parm[4] = (p5), \ (emeth)->message_parm[5] = (p6), \ (emeth)->message_parm[6] = (p7), \ (emeth)->message_parm[7] = (p8), \ (*(emeth)->trace_message) (msg), 0) : 0) /* Methods used during JPEG compression. */ struct compress_methods_struct { /* Hook for user interface to get control after input_init */ METHOD(void, c_ui_method_selection, (compress_info_ptr cinfo)); /* Input image reading & conversion to standard form */ METHOD(void, input_init, (compress_info_ptr cinfo)); METHOD(void, get_input_row, (compress_info_ptr cinfo, JSAMPARRAY pixel_row)); METHOD(void, input_term, (compress_info_ptr cinfo)); /* Gamma and color space conversion */ METHOD(void, colorin_init, (compress_info_ptr cinfo)); METHOD(void, get_sample_rows, (compress_info_ptr cinfo, int rows_to_read, JSAMPIMAGE image_data)); METHOD(void, colorin_term, (compress_info_ptr cinfo)); /* Expand picture data at edges */ METHOD(void, edge_expand, (compress_info_ptr cinfo, long input_cols, int input_rows, long output_cols, int output_rows, JSAMPIMAGE image_data)); /* Subsample pixel values of a single component */ /* There can be a different subsample method for each component */ METHOD(void, subsample_init, (compress_info_ptr cinfo)); subsample_ptr subsample[MAX_COMPS_IN_SCAN]; METHOD(void, subsample_term, (compress_info_ptr cinfo)); /* Extract samples in MCU order, process & hand off to output_method */ /* The input is always exactly N MCU rows worth of data */ METHOD(void, extract_init, (compress_info_ptr cinfo)); METHOD(void, extract_MCUs, (compress_info_ptr cinfo, JSAMPIMAGE image_data, int num_mcu_rows, MCU_output_method_ptr output_method)); METHOD(void, extract_term, (compress_info_ptr cinfo)); /* Entropy encoding parameter optimization */ METHOD(void, entropy_optimize, (compress_info_ptr cinfo, MCU_output_caller_ptr source_method)); /* Entropy encoding */ METHOD(void, entropy_encoder_init, (compress_info_ptr cinfo)); METHOD(void, entropy_encode, (compress_info_ptr cinfo, JBLOCK *MCU_data)); METHOD(void, entropy_encoder_term, (compress_info_ptr cinfo)); /* JPEG file header construction */ METHOD(void, write_file_header, (compress_info_ptr cinfo)); METHOD(void, write_scan_header, (compress_info_ptr cinfo)); METHOD(void, write_jpeg_data, (compress_info_ptr cinfo, char *dataptr, int datacount)); METHOD(void, write_scan_trailer, (compress_info_ptr cinfo)); METHOD(void, write_file_trailer, (compress_info_ptr cinfo)); /* Pipeline control */ METHOD(void, c_pipeline_controller, (compress_info_ptr cinfo)); METHOD(void, entropy_output, (compress_info_ptr cinfo, char *dataptr, int datacount)); /* Overall control */ METHOD(void, c_per_scan_method_selection, (compress_info_ptr cinfo)); }; /* Methods used during JPEG decompression. */ struct decompress_methods_struct { /* Hook for user interface to get control after reading file header */ METHOD(void, d_ui_method_selection, (decompress_info_ptr cinfo)); /* JPEG file scanning */ /* Note: user interface supplies read_jpeg_data for JFIF/raw-JPEG * reading. For file formats that require random access (eg, TIFF) * the JPEG file header module will override the UI read_jpeg_data. */ METHOD(boolean, read_file_header, (decompress_info_ptr cinfo)); METHOD(boolean, read_scan_header, (decompress_info_ptr cinfo)); METHOD(int, read_jpeg_data, (decompress_info_ptr cinfo)); METHOD(void, read_scan_trailer, (decompress_info_ptr cinfo)); METHOD(void, read_file_trailer, (decompress_info_ptr cinfo)); /* Entropy decoding */ METHOD(void, entropy_decoder_init, (decompress_info_ptr cinfo)); METHOD(void, entropy_decode, (decompress_info_ptr cinfo, JBLOCK *MCU_data)); METHOD(void, entropy_decoder_term, (decompress_info_ptr cinfo)); /* MCU disassembly: fetch MCUs from entropy_decode, build coef array */ METHOD(void, disassemble_init, (decompress_info_ptr cinfo)); METHOD(void, disassemble_MCU, (decompress_info_ptr cinfo, JBLOCKIMAGE image_data)); METHOD(void, disassemble_term, (decompress_info_ptr cinfo)); /* Cross-block smoothing */ METHOD(void, smooth_coefficients, (decompress_info_ptr cinfo, jpeg_component_info *compptr, JBLOCKROW above, JBLOCKROW currow, JBLOCKROW below, JBLOCKROW output)); /* Un-subsample pixel values of a single component */ /* There can be a different unsubsample method for each component */ METHOD(void, unsubsample_init, (decompress_info_ptr cinfo)); unsubsample_ptr unsubsample[MAX_COMPS_IN_SCAN]; METHOD(void, unsubsample_term, (decompress_info_ptr cinfo)); /* Gamma and color space conversion */ METHOD(void, colorout_init, (decompress_info_ptr cinfo)); METHOD(void, color_convert, (decompress_info_ptr cinfo, int num_rows, JSAMPIMAGE input_data, JSAMPIMAGE output_data)); METHOD(void, colorout_term, (decompress_info_ptr cinfo)); /* Output image writing */ METHOD(void, output_init, (decompress_info_ptr cinfo)); METHOD(void, put_pixel_rows, (decompress_info_ptr cinfo, int num_rows, JSAMPIMAGE pixel_data)); METHOD(void, output_term, (decompress_info_ptr cinfo)); /* Pipeline control */ METHOD(void, d_pipeline_controller, (decompress_info_ptr cinfo)); /* Overall control */ METHOD(void, d_per_scan_method_selection, (decompress_info_ptr cinfo)); }; /* External declarations for routines that aren't called via method ptrs. */ /* Note: use "j" as first char of names to minimize namespace pollution. */ /* The PP macro hides prototype parameters from compilers that can't cope. */ #define PP(arglist) () /* main entry for compression */ EXTERN void jpeg_compress PP((compress_info_ptr cinfo)); /* default parameter setup for compression */ EXTERN void j_default_compression PP((compress_info_ptr cinfo, int quality)); EXTERN void j_monochrome_default PP((compress_info_ptr cinfo)); EXTERN void j_set_quality PP((compress_info_ptr cinfo, int quality, boolean force_baseline)); EXTERN void j_free_defaults PP((compress_info_ptr cinfo)); /* main entry for decompression */ EXTERN boolean jpeg_decompress PP((decompress_info_ptr cinfo)); /* forward DCT */ EXTERN void j_fwd_dct PP((DCTBLOCK data)); /* inverse DCT */ EXTERN void j_rev_dct PP((DCTBLOCK data)); /* utility routines in jutils.c */ EXTERN void jcopy_sample_rows PP((JSAMPARRAY input_array, int source_row, JSAMPARRAY output_array, int dest_row, int num_rows, long num_cols)); /* method selection routines for compression modules */ EXTERN void jselcpipeline PP((compress_info_ptr cinfo)); /* jcpipe.c */ EXTERN void jselchuffman PP((compress_info_ptr cinfo)); /* jchuff.c */ EXTERN void jselcarithmetic PP((compress_info_ptr cinfo)); /* jcarith.c */ EXTERN void jselexpand PP((compress_info_ptr cinfo)); /* jcexpand.c */ EXTERN void jselsubsample PP((compress_info_ptr cinfo)); /* jcsample.c */ EXTERN void jselcmcu PP((compress_info_ptr cinfo)); /* jcmcu.c */ EXTERN void jselccolor PP((compress_info_ptr cinfo)); /* jccolor.c */ /* The user interface should call one of these to select input format: */ EXTERN void jselrgif PP((compress_info_ptr cinfo)); /* jrdgif.c */ EXTERN void jselrxli PP((compress_info_ptr cinfo)); /* jrdxli.c */ /* and one of these to select output header format: */ EXTERN void jselwjfif PP((compress_info_ptr cinfo)); /* jwrjfif.c */ /* method selection routines for decompression modules */ EXTERN void jseldpipeline PP((decompress_info_ptr cinfo)); /* jdpipe.c */ EXTERN void jseldhuffman PP((decompress_info_ptr cinfo)); /* jdhuff.c */ EXTERN void jseldarithmetic PP((decompress_info_ptr cinfo)); /* jdarith.c */ EXTERN void jseldmcu PP((decompress_info_ptr cinfo)); /* jdmcu.c */ EXTERN void jselbsmooth PP((decompress_info_ptr cinfo)); /* jbsmooth.c */ EXTERN void jselunsubsample PP((decompress_info_ptr cinfo)); /* jdsample.c */ EXTERN void jseldcolor PP((decompress_info_ptr cinfo)); /* jdcolor.c */ /* The user interface should call one of these to select input format: */ EXTERN void jselrjfif PP((decompress_info_ptr cinfo)); /* jrdjfif.c */ /* and one of these to select output image format: */ EXTERN void jselwgif PP((decompress_info_ptr cinfo)); /* jwrgif.c */ EXTERN void jselwxli PP((decompress_info_ptr cinfo)); /* jwrxli.c */ /* method selection routines for system-dependent modules */ EXTERN void jselerror PP((external_methods_ptr emethods)); /* jerror.c */ EXTERN void jselvirtmem PP((external_methods_ptr emethods)); /* jvirtmem.c */ /* Miscellaneous useful macros */ #define MAX(a,b) ((a) > (b) ? (a) : (b)) #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define RST0 0xD0 /* RST0 marker code */ /* Macro replacements for jutils.c functions */ #define jround_up(a, b) (((a) + (b)-1) - (((a) + (b)-1) % (b))) #define jcopy_block_row(input_row, output_row, num_blocks) \ (bcopy((void *) (input_row), (void *) (output_row), \ (size_t) ((num_blocks) * (DCTSIZE2 * SIZEOF(JCOEF))))) #define jzero_far(target, bytestozero) \ bzero((void *) (target), (size_t)(bytestozero)); kit/image/mac.c010064400237450000000000000117150647077534700131640ustar nishidawheel/* * mac.c: * * adapted from code by Patrick Naughton (naughton@sun.soe.clarkson.edu) * * macin.c * Mark Majhor * August 1990 * * routines for reading MAC files * * Copyright 1990 Mark Majhor (see the included file * "mrmcpyrght.h" for complete copyright information) */ /* Edit History 04/15/91 2 nazgul Check for end of file instead of using -1 as a runlength! */ # include # include # include # include "image.h" # include "mac.h" /**** ** ** local variables ** ****/ static BYTE file_open = 0; /* status flags */ static BYTE image_open = 0; static ZFILE *ins; /* input stream */ /**** ** ** global variables ** ****/ static int macin_img_width; /* image width */ static int macin_img_height; /* image height */ static int macin_img_depth; /* image depth */ static int macin_img_planes; /* image planes */ static int macin_img_BPL; /* image bytes per line */ /* * open MAC image in the input stream; returns MACIN_SUCCESS if * successful. (might also return various MACIN_ERR codes.) */ /* ARGSUSED */ static int macin_open_image(s) ZFILE *s; { BYTE mhdr[MAC_HDR_LEN]; char *hp; /* header pointer */ /* make sure there isn't already a file open */ if (file_open) return(MACIN_ERR_FAO); /* remember that we've got this file open */ file_open = 1; ins = s; /* * the mac paint files that came with xmac had an extra * 128 byte header on the front, with a image name in it. * true mac paint images don't seem to have this extra * header. The following code tries to figure out what * type the image is and read the right amount of file * header (512 or 640 bytes). */ /* read in the mac file header */ hp = (char *) mhdr; if (zread(ins, (byte *)hp, ADD_HDR_LEN) != ADD_HDR_LEN) return MACIN_ERR_EOF; if (mhdr[0] != MAC_MAGIC) return MACIN_ERR_BAD_SD; /* Get image name (if available) */ if (mhdr[1] != 0) { /* if name header */ if (zread(ins, (byte *)hp, MAC_HDR_LEN) != MAC_HDR_LEN) return MACIN_ERR_EOF; } else /* else read rest of header */ if (zread(ins, (byte *)hp, MAC_HDR_LEN - ADD_HDR_LEN) != MAC_HDR_LEN - ADD_HDR_LEN) return MACIN_ERR_EOF; /* Now set relevant values */ macin_img_width = BYTES_LINE * 8; macin_img_height = MAX_LINES; macin_img_depth = 1; /* always monochrome */ macin_img_planes = 1; /* always 1 */ macin_img_BPL = BYTES_LINE; return MACIN_SUCCESS; } /* * close an open MAC file */ static int macin_close_file() { /* make sure there's a file open */ if (!file_open) return MACIN_ERR_NFO; /* mark file (and image) as closed */ file_open = 0; image_open = 0; /* done! */ return MACIN_SUCCESS; } #if 0 /* * semi-graceful fatal error mechanism */ static macin_fatal(msg) char *msg; { fprintf(stderr, "Error reading MacPaint file: %s\n", msg); exit(0); } #endif /* * these are the routines added for interfacing to xloadimage */ /* * tell someone what the image we're loading is. this could be a little more * descriptive but I don't care */ static void tellAboutImage(name) char *name; { fprintf(stderr, "%s is a %dx%d MacPaint image\n", name, macin_img_width, macin_img_height); } Image *macLoad(fullname, name, verbose) char *fullname, *name; unsigned int verbose; { ZFILE *zf; Image *image; BYTE *pixptr, ch; int eof; register int scanLine; register unsigned int i, j, k; if (! (zf = zopen(fullname))) return(NULL); if (macin_open_image(zf) != MACIN_SUCCESS) { /* read image header */ macin_close_file(); zclose(zf); return(NULL); } image = newBitImage(macin_img_width, macin_img_height); pixptr = &(image->data[0]); scanLine = 0; k = 0; while (scanLine < macin_img_height) { if ((eof = zgetc(zf)) == -1) break; ch = (BYTE) eof; /* Count byte */ i = (unsigned int) ch; if (ch < 0x80) { /* Unpack next (I+1) chars as is */ for (j = 0; j <= i; j++) { if (scanLine < macin_img_height) { if ((eof = zgetc(zf)) == -1) break; *pixptr++ = (BYTE) eof; k++; if (!(k %= BYTES_LINE)) { scanLine++; } } } } else { /* Repeat next char (2's comp I) times */ if ((eof = zgetc(zf)) == -1) break; ch = (BYTE) eof; for (j = 0; j <= 256 - i; j++) { if (scanLine < macin_img_height) { *pixptr++ = (BYTE) ch; k++; if (!(k %= BYTES_LINE)) { scanLine++; } } } } } if (scanLine < macin_img_height) { zclose(zf); return NULL; } macin_close_file(); if (verbose) tellAboutImage(name); zclose(zf); image->title = dupString(name); return(image); } int macIdent(fullname, name) char *fullname, *name; { ZFILE *zf; unsigned int ret; if (! (zf = zopen(fullname))) return(0); if (macin_open_image(zf) == MACIN_SUCCESS) { tellAboutImage(name); ret = 1; } else ret = 0; macin_close_file(); zclose(zf); return(ret); } kit/image/kljcpyrght.h010064400237450000000000000021440642466042600145740ustar nishidawheel#ifndef _KLJ_COPYRIGHT_ /**** Copyright 1989, 1990 Kirk L. Johnson Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The author makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****/ #ifndef __SABER__ static char *KLJCopyright = "Copyright 1989, 1990 Kirk L. Johnson"; #endif #define _KLJ_COPYRIGHT_ #endif kit/image/mac.h010064400237450000000000000023120642466042700131510ustar nishidawheel/**************************************************************** * mac.h: * * adapted from code by Patrick Naughton (naughton@sun.soe.clarkson.edu) * * macin.h * Mark Majhor * August 1990 * * routines for reading MAC files * * Copyright 1990 Mark Majhor (see the included file * "mrmcpyrght.h" for complete copyright information) * ****************************************************************/ # define MAC_MAGIC 0x0 typedef unsigned char BYTE; /* 8 bits unsigned */ /* * macin return codes */ #define MACIN_SUCCESS 0 /* success */ #define MACIN_ERR_BAD_SD -1 /* bad screen descriptor */ #define MACIN_ERR_BAD_SIG -2 /* bad signature */ #define MACIN_ERR_EOD -3 /* unexpected end of raster data */ #define MACIN_ERR_EOF -4 /* unexpected end of input stream */ #define MACIN_ERR_FAO -5 /* file already open */ #define MACIN_ERR_IAO -6 /* image already open */ #define MACIN_ERR_NFO -7 /* no file open */ #define MACIN_ERR_NIO -8 /* no image open */ static int macin_open_image(); static int macin_close_file(); #if 0 static int macin_fatal(); #endif #define MAC_HDR_LEN 512 #define ADD_HDR_LEN 128 #define MAX_LINES 720 #define BYTES_LINE 72 kit/image/mc_tables.c010064400237450000000000000046610642466043000143400ustar nishidawheel/* * From McIDAS Reference Manual * Introduction - pg 21 * Table 1, UD-14 9/88, * * Given the "SS Code" (word three of the area directory) * return a string describing the sensor source. * */ char * mc_sensor(sscode) int sscode ; { switch (sscode) { case 0 : return("Non-Image Derived Data") ; case 1 : return("Test patterns") ; case 2 : return("Graphics") ; case 3 : return("Miscellaneous") ; case 4 : return("PDUS Meteosat Visible") ; case 5 : return("PDUS Meteosat Infrared") ; case 6 : return("PDUS Meteosat Water Vapor") ; case 7 : return("Radar") ; case 8 : return("Miscellaneous Aircraft Data (MAMS)") ; case 12 : return("GMS Visible") ; case 13 : return("GMS Infrared") ; case 14 : return("ATS 6 Visible") ; case 15 : return("ATS 6 Infrared") ; case 16 : return("SMS-1 Visible") ; case 17 : return("SMS-1 Infrared") ; case 18 : return("SMS-2 Visible") ; case 19 : return("SMS-2 Infrared") ; case 20 : return("GOES-1 Visible") ; case 21 : return("GOES-1 Infrared") ; case 22 : return("GOES-2 Visible") ; case 23 : return("GOES-2 Infrared") ; case 24 : return("GOES-3 Visible") ; case 25 : return("GOES-3 Infrared") ; case 26 : return("GOES-4 Visible (VAS)") ; case 27 : return("GOES-4 Infrared and Water Vapor (VAS)") ; case 28 : return("GOES-5 Visible (VAS)") ; case 29 : return("GOES-5 Infrared and Water Vapor (VAS)") ; case 30 : return("GOES-6 Visible") ; case 31 : return("GOES-6 Infrared") ; case 32 : return("GOES-Visible, Block 1 Auxiliary Data") ; case 33 : return("GOES-7 Infrared") ; case 34 : case 36 : case 37 : case 38 : case 39 : case 40 : return("NOAA Series Satellites") ; case 41 : return("TIROS-N") ; case 42 : return("NOAA-6") ; case 43 : return("NOAA-7") ; case 44 : return("NOAA-8") ; case 45 : return("NOAA-9") ; case 46 : return("Venus") ; case 47 : return("Voyager 1") ; case 48 : return("Voyager 2") ; case 50 : return("Hubble St.") ; case 60 : return("NOAA-10") ; case 61 : return("NOAA-11") ; case 70 : return("GOES-I (IMAGER)") ; case 71 : return("GOES-I (SOUNDER)") ; case 72 : return("GOES-J (IMAGER)") ; case 73 : return("GOES-J (SOUNDER)") ; case 74 : return("GOES-K (IMAGER)") ; case 75 : return("GOES-K (SOUNDER)") ; case 76 : return("GOES-L (IMAGER)") ; case 77 : return("GOES-L (SOUNDER)") ; case 78 : return("GOES-M (IMAGER)") ; case 79 : return("GOES-M (SOUNDER)") ; case 80 : return("ERBE") ; case 90 : return("RAW METEOSAT") ; } return("Unknown") ; } kit/image/mcidas.c010064400237450000000000000055130664163775700136650ustar nishidawheel/* mcidas.c: * * McIDAS areafile support. contributed by Glenn P. Davis * (davis@unidata.ucar.edu). */ #include "xloadimage.h" #include "mcidas.h" char *mc_sensor(); /* * convert from little endian to big endian four byte object */ static unsigned long vhtonl(lend) unsigned long lend ; { unsigned long bend ; unsigned char *lp, *bp ; lp = ((unsigned char *)&lend) + 3 ; bp = (unsigned char *) &bend ; *bp++ = *lp-- ; *bp++ = *lp-- ; *bp++ = *lp-- ; *bp = *lp ; return(bend) ; } /* ARGSUSED */ int mcidasIdent(fullname, name) char *fullname, *name; { ZFILE *zf; struct area_dir dir ; int r; if (! (zf= zopen(fullname))) { perror("mcidasIdent"); return(0); } switch (zread(zf, (byte *)&dir, sizeof(struct area_dir))) { case -1: perror("mcidasIdent"); r= 0; break; case sizeof(struct area_dir): if (dir.type != 4 && dir.type != 67108864) { r= 0; break; } r= 1; break; default: r= 0; break; } zclose(zf); return(r); } Image *mcidasLoad(fullname, name, verbose) char *fullname, *name; unsigned int verbose; { ZFILE *zf; struct area_dir dir; struct navigation nav; Image *image; unsigned int y; int doswap = 0 ; if (! (zf= zopen(fullname))) { perror("mcidasLoad"); return(NULL); } switch (zread(zf, (byte *)&dir, sizeof(struct area_dir))) { case -1: perror("mcidasLoad"); zclose(zf); cleanup(-1); case sizeof(struct area_dir): if (dir.type != 4) { if(dir.type != 67108864) { zclose(zf); return(NULL) ; } else { doswap = 1 ; } } break; default: zclose(zf); return(NULL); } if(doswap) { unsigned long *begin ; unsigned long *ulp ; begin = (unsigned long *)&dir ; for(ulp = begin ; ulp < &begin[AREA_COMMENTS] ; ulp++) *ulp = vhtonl(*ulp) ; for(ulp = &begin[AREA_CALKEY] ; ulp < &begin[AREA_STYPE] ; ulp++) *ulp = vhtonl(*ulp) ; } if (verbose) (void)fprintf(stderr, "%s %d %d (%d, %d) (%d, %d)\n", mc_sensor(dir.satid), (int) dir.idate, (int) dir.itime, (int) dir.lcor, (int) dir.ecor, (int) dir.lres, (int) dir.eres) ; znocache(zf); /* skip the nav */ if( zread(zf, (byte *)&nav, sizeof(struct navigation)) != sizeof(struct navigation)) { zclose(zf); return(NULL) ; } /* get an image to put the data in */ image= newRGBImage(dir.esiz, dir.lsiz, 8 * dir.bands); /* set up the colormap, linear grey scale */ for (y= 0; y < 255; y++) { *(image->rgb.red + y)= *(image->rgb.green + y)= *(image->rgb.blue + y)= y * 257 ; } image->rgb.used= 255 ; zread(zf, image->data, dir.esiz * dir.lsiz) ; zclose(zf); image->title= dupString(name); return(image); } kit/image/mcidas.h010064400237450000000000000041230642466043000136450ustar nishidawheel/* mcidas.h */ /* Argh, looks like the numbers are in vax byte order */ #define TYPELEN 4 /* Short strings used as identifiers */ #define COMMENTLEN 32 /* longer strings */ /* * McIdas AREA DIRECTORY, based on documentation dated 5/87 by R. Dengal */ struct area_dir { /* 1 */ unsigned long status ; /* 2 */ unsigned long type ; /* 3 */ unsigned long satid ; /* 4 */ unsigned long ndate ; /* YYDDD */ /* 5 */ unsigned long ntime ; /* HHMMSS */ /* 6 */ unsigned long lcor ; /* 7 */ unsigned long ecor ; /* 8 */ unsigned long zcor ; /* 9 */ unsigned long lsiz ; /* 10 */ unsigned long esiz ; /* 11 */ unsigned long zsiz ; /* 12 */ unsigned long lres ; /* 13 */ unsigned long eres ; /* 14 */ unsigned long bands ; /* 15 */ unsigned long yzprefix ; /* 16 */ unsigned long projnum ; /* 17 */ unsigned long cdate ; /* 18 */ unsigned long ctime ; /* 19 */ unsigned long filtmap ; /* 20 */ unsigned long imageid ; /* 21 */ unsigned long resvid[4] ; #define AREA_COMMENTS 24 /* 25 */ char comments[COMMENTLEN] ; #define AREA_CALKEY 32 /* 33 */ unsigned long calkey ; /* 34 */ unsigned long navkey ; /* 35 */ unsigned long navkey2 ; /* 36 */ unsigned long lprefix ; /* 37 */ unsigned long pdl[8] ; /* 45 */ unsigned long band8 ; /* 46 */ unsigned long idate ; /* 47 */ unsigned long itime ; /* 48 */ unsigned long startscan ; /* 49 */ unsigned long doclen ; /* 50 */ unsigned long callen ; /* 51 */ unsigned long levlen ; #define AREA_STYPE 51 /* 52 */ char stype[TYPELEN] ; /* 53 */ char ctype[TYPELEN] ; /* 54 */ unsigned long reserved[11] ; } ; /* * McIdas NAVIGATION CODICIL, based on documentation dated 5/87 by D. Santek * Only type 'GOES' used here currently */ struct navigation { /* 1 */ char type[TYPELEN] ; #define NAV_DATA 1 /* 2 */ unsigned long iddate ; /* 3 */ unsigned long itime ; /* 4 */ unsigned long fill[37] ; /* expand this later, if needed */ #define NAV_RESERVED 40 /* 41 */ unsigned long reserved[80] ; /* 121 */ char memo[COMMENTLEN] ; } ; struct mc_area { struct area_dir *dir ; struct navigation *nav ; unsigned char *image ; unsigned char *priv ; /* conveninence pointer */ } ; kit/image/misc.c010064400237450000000000000223661075451246500133510ustar nishidawheel/* misc.c: * * miscellaneous funcs * * jim frost 10.05.89 * * Copyright 1989, 1990, 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "xloadimage.h" #include "patchlevel" #include #include extern int _Xdebug; extern Display *display; extern int screen; static char *signalName(sig) int sig; { static char buf[32]; switch (sig) { case SIGSEGV: return("SEGV"); case SIGBUS: return("BUS"); case SIGFPE: return("FPE"); case SIGILL: return("ILL"); default: sprintf(buf, "Signal %d", sig); return(buf); } } void memoryExhausted() { fprintf(stderr, "Memory has been exhausted; operation cannot continue (sorry).\n"); if (_Xdebug) abort(); else cleanup(-1); } void internalError(sig) int sig; { static int handling_error= 0; int a, b; Screen *local_screen; switch(handling_error++) { case 0: fprintf(stderr, "\ An internal error (%s) has occurred. If you would like to file a bug\n\ report, please send email to %s\n\ with a description of how you triggered the bug, the output of xloadimage\n\ before the failure, and the following information:\n\n", signalName(sig), AUTHOR_EMAIL); fprintf(stderr, "Xloadimage Version %s.%s\n", VERSION, PATCHLEVEL); if (display) { local_screen= ScreenOfDisplay(display, screen); fprintf(stderr, "Server: %s Version %d\n", ServerVendor(display), VendorRelease(display)); fprintf(stderr, "Depths and visuals supported:\n"); for (a= 0; a < local_screen->ndepths; a++) { fprintf(stderr, "%2d:", local_screen->depths[a].depth); for (b= 0; b < local_screen->depths[a].nvisuals; b++) fprintf(stderr, " %s", nameOfVisualClass(local_screen->depths[a].visuals[b].class)); fprintf(stderr, "\n"); } } else fprintf(stderr, "[No information on server; error occurred before connection]\n"); break; case 1: fprintf(stderr, "\ An internal error has occurred within the internal error handler. No more\n\ information about the error is available, sorry.\n"); break; } if (_Xdebug) /* dump core if -debug is on */ abort(); cleanup(-1); } void version() { fprintf(stderr, "Xloadimage version %s patchlevel %s by Jim Frost.\n", VERSION, PATCHLEVEL); fprintf(stderr, "Please send email to %s for\npraise or bug reports.\n", AUTHOR_EMAIL); } void usage(name) char *name; { version(); fprintf(stderr, "\nUsage: %s [global options] {[image options] image_name ...}\n\n", tail(name)); fprintf(stderr, "\ Type `%s -help [option ...]' for information on a particular option, or\n\ `%s -help' to enter the interactive help facility.\n", tail(name), tail(name)); cleanup(-1); } char *tail(path) char *path; { int s; char *t; t= path; for (s= 0; *(path + s) != '\0'; s++) if (*(path + s) == '/') t= path + s + 1; return(t); } Image *processImage(disp, scrn, image, options, verbose) Display *disp; int scrn; Image *image; ImageOptions *options; unsigned int verbose; { Image *tmpimage; XColor xcolor; unsigned int compressed= 0; void gammacorrect(); goodImage(image, "processImage"); /* clip the image if requested */ if ((options->clipx != 0) || (options->clipy != 0) || (options->clipw != 0) || (options->cliph != 0)) { if (!options->clipw) options->clipw= image->width; if (!options->cliph) options->cliph= image->height; tmpimage= clip(image, options->clipx, options->clipy, (options->clipw ? options->clipw : image->width), (options->cliph ? options->cliph : image->height), verbose); freeImage(image); image= tmpimage; } if (options->rotate) { tmpimage = rotate(image, options->rotate, verbose); freeImage(image); image = tmpimage; } if (options->xzoom || options->yzoom) { /* zoom image */ if (!options->colors && RGBP(image) && /* if the image is to */ ((!options->xzoom && (options->yzoom > 100)) || /* be blown up, */ (!options->yzoom && (options->xzoom > 100)) || /* compress before */ (options->xzoom + options->yzoom > 200))) { /* doing it */ compress_colormap(image, verbose); compressed= 1; } tmpimage= zoom(image, options->xzoom, options->yzoom, verbose); freeImage(image); image= tmpimage; } if (options->gray) /* convert image to grayscale */ gray(image, verbose); if (options->normalize) { /* normalize image */ tmpimage= normalize(image, verbose); if (tmpimage != image) { freeImage(image); image= tmpimage; } } if (options->bright) /* alter image brightness */ brighten(image, options->bright, verbose); if (options->gamma != 1.0) /* do display gamma compensation */ gammacorrect(image, options->gamma, verbose); /* forcibly reduce colormap */ if (options->colors && RGBP(image) && (options->colors < image->rgb.used)) { tmpimage= reduce(image, options->colors, verbose); if (tmpimage != image) { freeImage(image); image= tmpimage; } image->rgb.size= options->colors; /* lie */ compressed= 1; } if (options->dither && (image->depth > 1)) { /* image is to be dithered */ if (options->dither == 1) tmpimage= dither(image, verbose); else tmpimage= halftone(image, verbose); freeImage(image); image= tmpimage; } else if (!compressed) /* make sure colormap is minimized */ compress_colormap(image, verbose); if (options->smooth > 0) { /* image is to be smoothed */ tmpimage= smooth(image, options->smooth, verbose); if (tmpimage != image) { freeImage(image); image= tmpimage; } } /* set foreground and background colors of mono image */ xcolor.flags= DoRed | DoGreen | DoBlue; if ((image->depth == 1) && options->fg) { XParseColor(disp, DefaultColormap(disp, scrn), options->fg, &xcolor); *(image->rgb.red + 1)= xcolor.red; *(image->rgb.green + 1)= xcolor.green; *(image->rgb.blue + 1)= xcolor.blue; } if ((image->depth == 1) && options->bg) { XParseColor(disp, DefaultColormap(disp, scrn), options->bg, &xcolor); *image->rgb.red= xcolor.red; *image->rgb.green= xcolor.green; *image->rgb.blue= xcolor.blue; } return(image); } /* simple error handler. this provides us with some kind of error recovery. */ int errorHandler(disp, error) Display *disp; XErrorEvent *error; { char errortext[BUFSIZ]; XGetErrorText(disp, error->error_code, errortext, BUFSIZ); fprintf(stderr, "xloadimage: X Error: %s on 0x%lx\n", errortext, error->resourceid); if (_Xdebug) /* if -debug mode is enabled, dump a core when we hit this */ abort(); else return(0); } /* strstr - public-domain implementation of standard C library function last edit: 02-Sep-1990 D A Gwyn This is an original implementation based on an idea by D M Sunday, essentially the "quick search" algorithm described in CACM V33 N8. Unlike Sunday's implementation, this one does not wander past the ends of the strings (which can cause malfunctions under certain circumstances), nor does it require the length of the searched text to be determined in advance. There are numerous other subtle improvements too. The code is intended to be fully portable, but in environments that do not conform to the C standard, you should check the sections below marked "configure as required". There are also a few compilation options, as follows: */ #ifndef UCHAR_MAX #define UCHAR_MAX 255 #endif typedef unsigned char cuc; /* char variety used in algorithm */ #define EOS '\0' /* C string terminator */ char * /* returns -> leftmost occurrence, or null pointer if not present */ vstrstr( s1, s2 ) char *s1; /* -> string to be searched */ char *s2; /* -> search-pattern string */ { register cuc *t; /* -> text character being tested */ register cuc *p; /* -> pattern char being tested */ register cuc *tx; /* -> possible start of match */ register unsigned int m; /* length of pattern */ register cuc *top; /* -> high water mark in text */ unsigned int shift[UCHAR_MAX + 1]; /* pattern shift table */ if ( s1 == NULL || s2 == NULL ) return NULL; /* certainly, no match is found! */ /* Precompute shift intervals based on the pattern; the length of the pattern is determined as a side effect: */ memset(&shift[1], 0, 255); /* Note: shift[0] is undefined at this point (fixed later). */ for ( m = 1, p = (cuc *)s2; *p != EOS; ++m, ++p ) shift[(cuc)*p] = m; { register unsigned char c; c = UCHAR_MAX; do shift[c] = m - shift[c]; while ( --c > 0 ); /* Note: shift[0] is still undefined at this point. */ } shift[0] = --m; /* shift[EOS]; important details! */ /* Try to find the pattern in the text string: */ for ( top = tx = (cuc *)s1; ; tx += shift[*(top = t)] ) { for ( t = tx, p = (cuc *)s2; ; ++t, ++p ) { if ( *p == EOS ) /* entire pattern matched */ return (char *)tx; if ( *p != *t ) break; } if ( t < top ) /* idea due to ado@elsie.nci.nih.gov */ t = top; /* already scanned this far for EOS */ do { if ( *t == EOS ) return NULL; /* no match */ } while ( ++t - tx != m ); /* < */ } } kit/image/mit.cpyrght010064400237450000000000000024450642466042700144420ustar nishidawheel#ifndef _MIT_COPYRIGHT_ /* * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef __SABER__ static char *MitCopyright= "Copyright 1989 Massachusetts Institute of Technology"; #endif #define _MIT_COPYRIGHT_ #endif kit/image/new.c010064400237450000000000000111051011524341000131520ustar nishidawheel/* new.c: * * functions to allocate and deallocate structures and structure data * * jim frost 09.29.89 * * Copyright 1989, 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "image.h" #ifdef __APPLE__ #include #else #include #endif extern int _Xdebug; extern void memoryExhausted(void); /* this table is useful for quick conversions between depth and ncolors */ unsigned long DepthToColorsTable[] = { /* 0 */ 1UL, /* 1 */ 2UL, /* 2 */ 4UL, /* 3 */ 8UL, /* 4 */ 16UL, /* 5 */ 32UL, /* 6 */ 64UL, /* 7 */ 128UL, /* 8 */ 256UL, /* 9 */ 512UL, /* 10 */ 1024UL, /* 11 */ 2048UL, /* 12 */ 4096UL, /* 13 */ 8192UL, /* 14 */ 16384UL, /* 15 */ 32768UL, /* 16 */ 65536UL, /* 17 */ 131072UL, /* 18 */ 262144UL, /* 19 */ 524288UL, /* 20 */ 1048576UL, /* 21 */ 2097152UL, /* 22 */ 4194304UL, /* 23 */ 8388608UL, /* 24 */ 16777216UL, /* 25 */ 33554432UL, /* 26 */ 67108864UL, /* 27 */ 134217728UL, /* 28 */ 268435456UL, /* 29 */ 536870912UL, /* 30 */ 1073741824UL, /* 31 */ 2147483648UL, /* 32 */ 2147483648UL /* bigger than unsigned int; this is good enough */ }; unsigned long colorsToDepth(ncolors) unsigned long ncolors; { unsigned long a; for (a= 0; (a < 32) && (DepthToColorsTable[a] < ncolors); a++) /* EMPTY */ ; return(a); } char *dupString(s) char *s; { char *d; if (!s) return(NULL); d= (char *)lmalloc(strlen(s) + 1); strcpy(d, s); return(d); } void newRGBMapData(rgb, size) RGBMap *rgb; unsigned int size; { rgb->used= 0; rgb->size= size; rgb->compressed= 0; rgb->red= (Intensity *)lmalloc(sizeof(Intensity) * size); rgb->green= (Intensity *)lmalloc(sizeof(Intensity) * size); rgb->blue= (Intensity *)lmalloc(sizeof(Intensity) * size); } void freeRGBMapData(rgb) RGBMap *rgb; { lfree((byte *)rgb->red); lfree((byte *)rgb->green); lfree((byte *)rgb->blue); } Image *newBitImage(width, height) unsigned int width, height; { Image *image; unsigned int linelen; image= (Image *)lmalloc(sizeof(Image)); image->type= IBITMAP; image->title= NULL; newRGBMapData(&(image->rgb), (unsigned int)2); *(image->rgb.red)= *(image->rgb.green)= *(image->rgb.blue)= 65535; *(image->rgb.red + 1)= *(image->rgb.green + 1)= *(image->rgb.blue + 1)= 0; image->rgb.used= 2; image->width= width; image->height= height; image->depth= 1; linelen= (width / 8) + (width % 8 ? 1 : 0); /* thanx johnh@amcc.com */ image->data= (unsigned char *)lcalloc(linelen * height); image->trans = -1; return(image); } Image *newRGBImage(width, height, depth) unsigned int width, height, depth; { Image *image; unsigned int pixlen, numcolors; pixlen= (depth / 8) + (depth % 8 ? 1 : 0); if (pixlen == 0) /* special case for `zero' depth image, which is */ pixlen= 1; /* sometimes interpreted as `one color' */ numcolors = depthToColors(depth); image= (Image *)lmalloc(sizeof(Image)); image->type= IRGB; image->title= NULL; newRGBMapData(&(image->rgb), numcolors); image->width= width; image->height= height; image->depth= depth; image->pixlen= pixlen; image->data= (unsigned char *)lmalloc(width * height * pixlen); image->trans = -1; return(image); } Image *newTrueImage(width, height) unsigned int width, height; { Image *image; image= (Image *)lmalloc(sizeof(Image)); image->type= ITRUE; image->title= NULL; image->rgb.used= image->rgb.size= 0; image->width= width; image->height= height; image->depth= 24; image->pixlen= 3; image->data= (unsigned char *)lmalloc(width * height * 3); image->trans = -1; return(image); } void freeImageData(image) Image *image; { if (image->title) { lfree((byte *)image->title); image->title= NULL; } if (!TRUEP(image)) freeRGBMapData(&(image->rgb)); lfree(image->data); } void freeImage(image) Image *image; { freeImageData(image); lfree((byte *)image); } byte *lmalloc(size) unsigned int size; { byte *area; if (size == 0) { size= 1; if (_Xdebug) fprintf(stderr, "lcalloc given zero size!\n"); } if (!(area= (byte *)malloc(size))) { memoryExhausted(); /* NOTREACHED */ } return(area); } byte *lcalloc(size) unsigned int size; { byte *area; if (size == 0) { size= 1; if (_Xdebug) fprintf(stderr, "lcalloc given zero size!\n"); } if (!(area= (byte *)calloc(1, size))) { memoryExhausted(); /* NOTREACHED */ } return(area); } void lfree(area) byte *area; { free(area); } kit/image/options.h010064400237450000000000000022660642466042600141130ustar nishidawheel/* options.h: * * optionNumber() definitions * * jim frost 10.03.89 * * Copyright 1989 Jim Frost. See included file "copyright.h" for complete * copyright information. */ /* enum with the options in it. If you add one to this you also have to * add its information to Options[] in options.c before it becomes available. */ typedef enum option_id { /* global options */ OPT_NOTOPT= 0, OPT_BADOPT, OPT_SHORTOPT, BORDER, DBUG, DEFAULT, DELAY, DISPLAY, FIT, FORK, FULLSCREEN, GEOMETRY, HELP, IDENTIFY, INSTALL, LIST, ONROOT, PATH, PIXMAP, PRIVATE, QUIET, SUPPORTED, VERBOSE, VER_NUM, VIEW, VISUAL, WINDOWID, /* local options */ AT, BACKGROUND, BRIGHT, CENTER, CLIP, COLORS, DITHER, FOREGROUND, GAMMA, GOTO, GRAY, HALFTONE, IDELAY, INVERT, MERGE, NAME, NEWOPTIONS, NORMALIZE, ROTATE, SMOOTH, XZOOM, YZOOM, ZOOM } OptionId; typedef struct option_array { char *name; /* name of the option minus preceeding '-' */ OptionId option_id; /* OptionId of this option */ char *args; /* arguments this option uses or NULL if none */ char *description; /* description of this option */ } OptionArray; OptionId optionNumber(); /* options.c */ kit/image/patchlevel010064400237450000000000000003100642466042700143060ustar nishidawheel/* this defines the version and patchlevel of this version of xloadimage */ #define VERSION "3" #define PATCHLEVEL "03" #define AUTHOR_EMAIL "jimf@centerline.com or ..!uunet!centerline!jimf" kit/image/path.c010064400237450000000000000147421010174522300133330ustar nishidawheel/* path.c: * * functions that deal with the image path * * jim frost 10.03.89 * * Copyright 1989, 1990, 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "xloadimage.h" #include #include #include #ifndef VMS #include #endif #include #if 1 /* SYSV */ #include #endif #ifdef __APPLE__ #include #endif /* SUPPRESS 530 */ /* SUPPRESS 560 */ extern int errno; /*static*/ unsigned int NumPaths= 0; static unsigned int NumExts= 0; /*static*/ char *Paths[BUFSIZ]; static char *Exts[BUFSIZ]; static char *PathToken= "path="; static char *ExtToken= "extension="; #define VOIDSECTION 0 #define PATHSECTION 1 #define EXTSECTION 2 static void readPathsAndExts(name) char *name; { FILE *f; char tokenbuf[BUFSIZ]; char buf[BUFSIZ]; unsigned int secnum; unsigned int linenum; unsigned int a, b, l; int c; if (! (f= fopen(name, "r"))) return; secnum= VOIDSECTION; linenum= 0; while (fscanf(f, "%s", tokenbuf) > 0) { linenum++; l= strlen(tokenbuf); for (a= 0, b= 0; a < l; a++, b++) { if (tokenbuf[a] == '\\') tokenbuf[b]= tokenbuf[++a]; else if (b != a) tokenbuf[b]= tokenbuf[a]; if (tokenbuf[a] == '#') { tokenbuf[b]= '\0'; while (((c= fgetc(f)) != '\n') && (c != EOF)) ; break; } } if (!strncmp(tokenbuf, PathToken, strlen(PathToken))) { secnum= PATHSECTION; if (sscanf(tokenbuf + strlen(PathToken), "%s", buf) != 1) continue; } else if (!strncmp(tokenbuf, ExtToken, strlen(ExtToken))) { secnum= EXTSECTION; if (sscanf(tokenbuf + strlen(ExtToken), "%s", buf) != 1) continue; } else strcpy(buf, tokenbuf); if (buf[0] == '\0') continue; switch (secnum) { case VOIDSECTION: fprintf(stderr, "%s: %d: Syntax error\n", name, linenum); /* ala BASIC */ fclose(f); return; case PATHSECTION: if (NumPaths < BUFSIZ - 1) Paths[NumPaths++]= expandPath(buf); else { fprintf(stderr, "%s: %d: Path table overflow\n", name, linenum); fclose(f); return; } break; case EXTSECTION: if (NumExts < BUFSIZ - 1) Exts[NumExts++]= dupString(buf); else { fprintf(stderr, "%s: %d: Extension table overflow\n", name, linenum); fclose(f); } break; } } } void loadPathsAndExts() { static int havepaths= 0; #ifndef VMS struct passwd *pw; #endif char buf[BUFSIZ]; if (havepaths) return; havepaths= 1; #ifdef VMS sprintf(buf, "/sys$scratch/.xloadimagerc"); #else /* !VMS */ if (! (pw= (struct passwd *)getpwuid(getuid()))) { fprintf(stderr, "Can't find your password file entry?!?\n"); return; } sprintf(buf, "%s/.xloadimagerc", pw->pw_dir); #endif /* !VMS */ if (! access(buf, R_OK)) { readPathsAndExts(buf); return; /* don't read system file if user has one */ } #ifdef SYSPATHFILE readPathsAndExts(SYSPATHFILE); #endif } static int fileIsOk(fullname, sbuf) char *fullname; struct stat *sbuf; { if ((sbuf->st_mode & S_IFMT) == S_IFDIR) /* is a directory */ return(0); return(access(fullname, R_OK)); /* we can read it */ } /* find an image with paths and extensions from defaults files. returns * -1 if access denied or not found, 0 if ok. */ int findImage(name, fullname) char *name, *fullname; { unsigned int p, e; struct stat sbuf; strcpy(fullname, name); if (!strcmp(name, "stdin")) /* stdin is special name */ return(0); /* look for name and name with compress extension */ if (! stat(fullname, &sbuf)) return(fileIsOk(fullname, &sbuf)); #ifndef NO_COMPRESS strcat(fullname, ".Z"); if (! stat(fullname, &sbuf)) return(fileIsOk(fullname, &sbuf)); #endif for (p= 0; p < NumPaths; p++) { sprintf(fullname, "%s/%s", Paths[p], name); if (! stat(fullname, &sbuf)) return(fileIsOk(fullname, &sbuf)); #ifndef NO_COMPRESS strcat(fullname, ".Z"); if (! stat(fullname, &sbuf)) #endif return(fileIsOk(fullname, &sbuf)); for (e= 0; e < NumExts; e++) { sprintf(fullname, "%s/%s%s", Paths[p], name, Exts[e]); if (! stat(fullname, &sbuf)) return(fileIsOk(fullname, &sbuf)); #ifndef NO_COMPRESS strcat(fullname, ".Z"); if (! stat(fullname, &sbuf)) return(fileIsOk(fullname, &sbuf)); #endif } } for (e= 0; e < NumExts; e++) { sprintf(fullname, "%s%s", name, Exts[e]); if (! stat(fullname, &sbuf)) return(fileIsOk(fullname, &sbuf)); #ifndef NO_COMPRESS strcat(fullname, ".Z"); if (! stat(fullname, &sbuf)) return(fileIsOk(fullname, &sbuf)); #endif } errno= ENOENT; /* file not found */ return(-1); } /* list images along our path */ void listImages() { unsigned int a; char buf[BUFSIZ]; if (!NumPaths) { fprintf(stderr, "No image path\n"); return; } for (a= 0; a < NumPaths; a++) { fprintf(stderr, "%s:\n", Paths[a]); fflush(stderr); sprintf(buf, "ls %s", Paths[a]); if (system(buf) < 0) { perror("ls"); return; } } return; } void showPath() { int a; if (!NumPaths && !NumExts) { fprintf(stderr, "No image paths or extensions\n"); return; } if (NumPaths) { fprintf(stderr, "Image path:"); for (a= 0; a < NumPaths; a++) fprintf(stderr, " %s", Paths[a]); fprintf(stderr, "\n"); } if (NumExts) { fprintf(stderr, "Image extensions:"); for (a= 0; a < NumExts; a++) fprintf(stderr, " %s", Exts[a]); fprintf(stderr, "\n"); } } char *expandPath(p) char *p; { char buf1[BUFSIZ], buf2[BUFSIZ]; int b1, b2, var; char *ptr; char *getenv(); buf1[0] = '\0'; buf2[0] = '\0'; b1 = 0; b2 = 0; var = 0; while(*p) { if(isspace(*p)) break; if (*p == '$') var++; else if(*p == '~') { buf1[b1] = '\0'; strcat(buf1, getenv("HOME")); b1 = strlen(buf1); var = 0; } else if(*p == '/' || *p == '}') { if(var) { buf1[b1] = '\0'; buf2[b2] = '\0'; strcat(buf1, getenv(buf2)); b1 = strlen(buf1); buf2[0] = '\0'; b2 = 0; var = 0; } if(*p == '/') { buf1[b1] = *p; b1++; } } else if(var) { if(*p != '{') { buf2[b2] = *p; b2++; } } else { buf1[b1] = *p; b1++; } p++; } buf1[b1] = '\0'; if((b2 = strlen(buf1)) > 0) { ptr = (char *)lmalloc((unsigned) b2+1); strcpy(ptr, buf1); return(ptr); } else return(NULL); } kit/image/pbm.c010064400237450000000000000262300664163776200131760ustar nishidawheel/* pbm.c: * * portable bit map (pbm) format images * * jim frost 09.27.89 * * patched by W. David Higgins (wdh@mkt.csd.harris.com) to support * raw-format PBM files. * * patched by Ian MacPhedran (macphed@dvinci.usask.ca) to support * PGM and PPM files (03-July-1990) */ #include "image.h" #include "pbm.h" /* SUPPRESS 558 */ static int IntTable[256]; static unsigned int Initialized= 0; #define NOTINT -1 #define COMMENT -2 #define SPACE -3 #define NEWLINE -4 #define BADREAD 0 /* read error */ #define NOTPBM 1 /* not a pbm file */ #define PBMNORMAL 2 /* pbm normal type file */ #define PBMCOMPACT 3 /* pbm compacty type file */ #define PBMRAWBITS 4 /* pbm raw bits type file */ #define PGMNORMAL 5 /* pgm normal type file */ #define PGMRAWBITS 6 /* pgm raw bytes type file */ #define PPMNORMAL 7 /* ppm normal type file */ #define PPMRAWBITS 8 /* ppm raw bytes type file */ static void initializeTable() { unsigned int a; for (a= 0; a < 256; a++) IntTable[a]= NOTINT; IntTable['#']= COMMENT; IntTable['\n']= NEWLINE; IntTable['\r']= IntTable['\t']= IntTable[' ']= SPACE; IntTable['0']= 0; IntTable['1']= 1; IntTable['2']= 2; IntTable['3']= 3; IntTable['4']= 4; IntTable['5']= 5; IntTable['6']= 6; IntTable['7']= 7; IntTable['8']= 8; IntTable['9']= 9; Initialized= 1; } static int pbmReadChar(zf) ZFILE *zf; { int c; if ((c= zgetc(zf)) == EOF) { zclose(zf); return(-1); } if (IntTable[c] == COMMENT) do { if ((c= zgetc(zf)) == EOF) return(-1); } while (IntTable[c] != NEWLINE); return(c); } static int pbmReadInt(zf) ZFILE *zf; { int c, value; for (;;) { c= pbmReadChar(zf); if (c < 0) return(-1); if (IntTable[c] >= 0) break; }; value= IntTable[c]; for (;;) { c= pbmReadChar(zf); if (c < 0) return(-1); if (IntTable[c] < 0) return(value); value= (value * 10) + IntTable[c]; } } static int isPBM(zf, name, width, height, maxval, verbose) ZFILE *zf; char *name; unsigned int *width, *height, *maxval; unsigned int verbose; { byte buf[4]; if (! Initialized) initializeTable(); if (zread(zf, buf, 2) != 2) return(NOTPBM); if (memToVal((byte *)buf, 2) == memToVal((byte *)"P1", 2)) { if (((*width= pbmReadInt(zf)) < 0) || ((*height= pbmReadInt(zf)) < 0)) return(NOTPBM); *maxval = 1; if (verbose) fprintf(stderr, "%s is a %dx%d PBM image\n", name, *width, *height); return(PBMNORMAL); } if (memToVal((byte *)buf, 2) == memToVal((byte *)"P4", 2)) { if (((*width= pbmReadInt(zf)) < 0) || ((*height= pbmReadInt(zf)) < 0)) return(NOTPBM); *maxval = 1; if (verbose) fprintf(stderr, "%s is a %dx%d RawBits PBM image\n", name, *width, *height); return(PBMRAWBITS); } if (memToVal(buf, 2) == 0x2a17) { if (zread(zf, buf, 4) != 4) return(NOTPBM); *width= memToVal((byte *)buf, 2); *height= memToVal((byte *)(buf + 2), 2); *maxval = 1; if (verbose) fprintf(stderr, "%s is a %dx%d Compact PBM image\n", name, *width, *height); return(PBMCOMPACT); } if (memToVal(buf, 2) == memToVal((byte *)"P2", 2)) { if (((*width= pbmReadInt(zf)) < 0) || ((*height= pbmReadInt(zf)) < 0)) return(NOTPBM); *maxval = pbmReadInt(zf); if (verbose) fprintf(stderr, "%s is a %dx%d PGM image with %d levels\n", name, *width, *height, (*maxval+1)); return(PGMNORMAL); } if (memToVal(buf, 2) == memToVal((byte *)"P5", 2)) { if (((*width= pbmReadInt(zf)) < 0) || ((*height= pbmReadInt(zf)) < 0)) return(NOTPBM); *maxval = pbmReadInt(zf); if (verbose) fprintf(stderr, "%s is a %dx%d Raw PGM image with %d levels\n", name, *width, *height, (*maxval+1)); return(PGMRAWBITS); } if (memToVal(buf, 2) == memToVal((byte *)"P3", 2)) { if (((*width= pbmReadInt(zf)) < 0) || ((*height= pbmReadInt(zf)) < 0)) return(NOTPBM); *maxval = pbmReadInt(zf); if (verbose) fprintf(stderr, "%s is a %dx%d PPM image with %d levels\n", name, *width, *height, (*maxval+1)); return(PPMNORMAL); } if (memToVal(buf, 2) == memToVal((byte *)"P6", 2)) { if (((*width= pbmReadInt(zf)) < 0) || ((*height= pbmReadInt(zf)) < 0)) return(NOTPBM); *maxval = pbmReadInt(zf); if (verbose) fprintf(stderr, "%s is a %dx%d Raw PPM image with %d levels\n", name, *width, *height, (*maxval+1)); return(PPMRAWBITS); } return(NOTPBM); } int pbmIdent(fullname, name) char *fullname, *name; { ZFILE *zf; unsigned int width, height, maxval, ret; if (! (zf= zopen(fullname))) return(0); ret= isPBM(zf, name, &width, &height, &maxval, (unsigned int)1); zclose(zf); return(ret != NOTPBM); } Image *pbmLoad(fullname, name, verbose) char *fullname, *name; unsigned int verbose; { ZFILE *zf; Image *image=NULL; int pbm_type; unsigned int x, y; unsigned int width, height, maxval, depth; unsigned int linelen; byte srcmask, destmask; byte *destptr=NULL, *destline; int src=0, size; unsigned int numbytes, numread; int red=0, grn=0, blu=0; if (! (zf= zopen(fullname))) return(NULL); pbm_type= isPBM(zf, name, &width, &height, &maxval, verbose); if (pbm_type == NOTPBM) { zclose(zf); return(NULL); } znocache(zf); switch (pbm_type) { case PBMNORMAL: image= newBitImage(width, height); linelen= (width / 8) + (width % 8 ? 1 : 0); destline= image->data; for (y= 0; y < height; y++) { destptr= destline; destmask= 0x80; for (x= 0; x < width; x++) { do { if ((src= pbmReadChar(zf)) < 0) { fprintf(stderr, "%s: Short image\n", fullname); zclose(zf); cleanup(-1); } if (IntTable[src] == NOTINT) { fprintf(stderr, "%s: Bad image data\n", fullname); zclose(zf); cleanup(-1); } } while (IntTable[src] < 0); switch (IntTable[src]) { case 1: *destptr |= destmask; case 0: if (! (destmask >>= 1)) { destmask= 0x80; destptr++; } break; default: fprintf(stderr, "%s: Bad image data\n", fullname); zclose(zf); cleanup(-1); } } destline += linelen; } break; case PBMRAWBITS: image= newBitImage(width, height); destline= image->data; linelen= (width + 7) / 8; numbytes= linelen * height; srcmask= 0; /* force initial read */ numread= 0; for (y= 0; y < height; y++) { destptr= destline; destmask= 0x80; if (srcmask != 0x80) { srcmask= 0x80; if ((numread < numbytes) && ((src= zgetc(zf)) == EOF)) { fprintf(stderr, "%s: Short image\n", fullname); zclose(zf); cleanup(-1); } numread++; } for (x= 0; x < width; x++) { if (src & srcmask) *destptr |= destmask; if (! (destmask >>= 1)) { destmask= 0x80; destptr++; } if (! (srcmask >>= 1)) { srcmask= 0x80; if ((numread < numbytes) && ((src= zgetc(zf)) == EOF)) { fprintf(stderr, "%s: Short image\n", fullname); zclose(zf); cleanup(-1); } numread++; } } destline += linelen; } break; case PBMCOMPACT: image= newBitImage(width, height); destline= image->data; linelen= (width / 8) + (width % 8 ? 1 : 0); srcmask= 0x80; destmask= 0x80; if ((src= zgetc(zf)) == EOF) { fprintf(stderr, "%s: Short image\n", fullname); zclose(zf); cleanup(-1); } numread= 1; numbytes= width * height; numbytes= (numbytes / 8) + (numbytes % 8 ? 1 : 0); for (y= 0; y < height; y++) { destptr= destline; destmask= 0x80; for (x= 0; x < width; x++) { if (src & srcmask) *destptr |= destmask; if (! (destmask >>= 1)) { destmask= 0x80; destptr++; } if (! (srcmask >>= 1)) { srcmask= 0x80; if ((numread < numbytes) && ((src= zgetc(zf)) == EOF)) { fprintf(stderr, "%s: Short image\n", fullname); zclose(zf); cleanup(-1); } numread++; } } destline += linelen; } break; case PGMRAWBITS: depth= colorsToDepth(maxval); if (depth > 8) image = newTrueImage(width, height); else { image = newRGBImage(width, height, depth); for (y = 0; y <= maxval; y++) { /* As in sunraster.c, use simple ramp for grey scale */ *(image->rgb.red + y) = PM_SCALE(y, maxval, 0xffff); *(image->rgb.green + y) = PM_SCALE(y, maxval, 0xffff); *(image->rgb.blue + y) = PM_SCALE(y, maxval, 0xffff); } image->rgb.used = maxval+1; } size= height * width; switch (image->type) { case IRGB: /* read in the image in a chunk */ if (zread(zf, image->data, size) != size) { fprintf(stderr, "%s: Short image\n", fullname); zclose(zf); freeImage(image); return(NULL); } /* convert image values */ destptr = image->data; for (y = 0; y < size; y++) *(destptr++) = PM_SCALE(*destptr, maxval, 0xff); break; case ITRUE: for (y = 0; y < size; y++) { if ((src = zgetc(zf)) == EOF) { fprintf(stderr, "%s: Short image\n", fullname); zclose(zf); freeImage(image); return(NULL); } src = PM_SCALE(src, maxval, 0xff); *(destptr++) = src; /* red */ *(destptr++) = src; /* green */ *(destptr++) = src; /* blue */ } break; } break; case PGMNORMAL: depth= colorsToDepth(maxval); if (depth > 8) image= newTrueImage(width, height); else { image= newRGBImage(width, height, depth); for (y= 0; y <= maxval; y++) { /* As in sunraster.c, use simple ramp for grey scale */ *(image->rgb.red + y) = PM_SCALE(y, maxval, 0xffff); *(image->rgb.green + y) = PM_SCALE(y, maxval, 0xffff); *(image->rgb.blue + y) = PM_SCALE(y, maxval, 0xffff); } image->rgb.used = maxval+1; } destptr= image->data; size= height * width; for (y= 0; y < size; y++) { if ((src = pbmReadInt(zf)) < 0) { fprintf(stderr, "%s: Short image\n", fullname); zclose(zf); cleanup(-1); } else { src= PM_SCALE(src, maxval, 0xff); if (TRUEP(image)) { *(destptr++) = src; /* red */ *(destptr++) = src; /* green */ *(destptr++) = src; /* blue */ } else *(destptr++) = src; } } break; case PPMRAWBITS: /* this is nice because the bit format is exactly what we want except * for scaling. */ image= newTrueImage(width, height); size= height * width * 3; if (zread(zf, image->data, size) != size) { fprintf(stderr, "%s: Short image\n", fullname); zclose(zf); freeImage(image); return(NULL); } destptr= image->data; for (y= 0; y < size; y++) { *destptr= PM_SCALE(*destptr, maxval, 0xff); destptr++; } break; case PPMNORMAL: image= newTrueImage(width, height); size= height * width; destptr= image->data; for (y= 0; y < size; y++) { if (((red= pbmReadInt(zf)) == EOF) || ((grn= pbmReadInt(zf)) == EOF) || ((blu= pbmReadInt(zf)) == EOF)) { fprintf(stderr, "%s: Short image\n", fullname); zclose(zf); cleanup(-1); } *(destptr++)= PM_SCALE(red, maxval, 0xff); *(destptr++)= PM_SCALE(grn, maxval, 0xff); *(destptr++)= PM_SCALE(blu, maxval, 0xff); } break; } image->title= dupString(name); zclose(zf); return(image); } kit/image/pbm.h010064400237450000000000000003030642466042700131650ustar nishidawheel/* pbm.h: * * PBM header file * * jim frost 10.15.89 */ typedef struct { unsigned char width[2]; unsigned char height[2]; } PBMCompact; #define PM_SCALE(a, b, c) (long)((a) * (c))/(b) kit/image/pcx.c010064400237450000000000000255260664163776400132230ustar nishidawheel/* ** pcx.c - load a ZSoft PC Paintbrush (PCX) file for use inside xloadimage ** ** Tim Northrup ** Adapted from code by Jef Poskanzer (see Copyright below). ** ** Version 0.1 -- 4/25/91 -- Initial cut ** ** Copyright (c) 1991 Tim Northrup ** (see file "tgncpyrght.h" for complete copyright information) */ /* ** Copyright (C) 1988 by Jef Poskanzer. ** ** Permission to use, copy, modify, and distribute this software and its ** documentation for any purpose and without fee is hereby granted, provided ** that the above copyright notice appear in all copies and that both that ** copyright notice and this permission notice appear in supporting ** documentation. This software is provided "as is" without express or ** implied warranty. ** ** This program (pcxtopbm) is based on the pcx2rf program by: ** Mike Macgirvin ** Stanford Relativity Gyro Program GP-B ** Stanford, Calif. 94503 ** ARPA: mike@relgyro.stanford.edu */ #include #include "image.h" #include "tgncpyrght.h" #include "pcx.h" /* ** pcxIdent ** ** Identify passed file as a PC Paintbrush image or not ** ** Returns 1 if file is a PCX file, 0 otherwise */ unsigned int pcxIdent ( fullname, name ) char *fullname, *name; { ZFILE *zf; unsigned int ret; int xmin; int xmax; int ymin; int ymax; int colors; char *type; ret = 0; if (! (zf = zopen ( fullname ))) return ( 0 ); PCXH = (PCXHeader *) lmalloc ( PCXHsize ); if (zread ( zf, PCXH, PCXHsize ) == PCXHsize) { if ((PCXH->Zid == PCX_MAGIC) && (PCXH->Zver <= 5)) { xmin = Word ( PCXH->Zxminlo, PCXH->Zxminhi); xmax = Word ( PCXH->Zxmaxlo, PCXH->Zxmaxhi); ymin = Word ( PCXH->Zyminlo, PCXH->Zyminhi); ymax = Word ( PCXH->Zymaxlo, PCXH->Zymaxhi); xmax = xmax - xmin + 1; ymax = ymax - ymin + 1; colors = 1 << (PCXH->Zbpp * PCXH->Znplanes); type = " PC Paintbrush image\n"; if (colors == 2) fprintf(stderr, "%s is a %dx%d monochrome%s", name, xmax, ymax, type ); else fprintf(stderr, "%s is a %dx%d %d color%s", name, xmax, ymax, colors, type ); ret = 1; } } zclose ( zf ); lfree ( PCXH ); return ( ret ); } /* ** PCX_Load_Raster ** ** Load raster image data into passed image structure. Raster Data ** ** means : Every bit is a pixel (if depth is 1) or every byte is a ** ** pixel (if depth is 8). ** ** Returns no value (void function) */ static void PCX_Load_Raster ( zf, image, depth ) ZFILE *zf; Image *image; int depth; /* Assertion : depth is 1 or 8 */ { byte *ptr = &(image->data[0]); int row = 0; int by_this_row = 0; int by_per_row; int linelen; int corrector; int i, b, cnt; by_per_row = Word ( PCXH->Zbprlo, PCXH->Zbprhi); if (depth == 1) linelen = (image->width / 8) + (image->width % 8 ? 1 : 0); else linelen = image->width; corrector = by_per_row - linelen; /* bytes per row is always even, which means that there is an */ /* excess byte if an odd nr of bytes would be sufficient. */ /* As newBitImage allocated memory without this excess, we have */ /* to read one less. But as there are two cases of reading, */ /* inside and outside of a run, I correct it afterwards, when */ /* the line is complete. */ while ((b = zgetc(zf)) != EOF) { /* Are we done ? */ if ((b & 0xC0) == 0xC0) { /* have a rep. count */ cnt = b & 0x3F; /* mask rep. bits out */ b = zgetc ( zf ); /* get real bits */ if (b == EOF) { /* Shouldn't happen ! */ fprintf(stderr, "Unexpected EOF\n" ); return; } } else cnt = 1; /* no repeating this one*/ if (depth ==1) b = 255 - b; /* Have to invert */ for ( i = 0; i < cnt; i++ ) { /* store count times */ *ptr++ = (byte) b; if (++by_this_row == by_per_row) { row++; /* start of a new line */ by_this_row = 0; /* reset counter */ if (corrector) ptr--; /*evtlly correct pointer*/ if ( row >= image->height ) { #if 0 /* happens a lot on valid images - jimf 10.28.91 */ if (depth == 1) /* Color : Map follows */ fprintf(stderr, "Warning: excess data ignored\n"); #endif return; } } } } } /* ** PCX_Planes ** ** Load plane image data into passed image structure. Plane data ** ** means : There are N planes, each containing M bits of a pixel ** ** byte, where N * M is not greater than 8 and M divides 8. (The ** ** cases M = 1 or 8, N = 1 are covered by PCX_Load_Raster). ** ** Returns no value (void function) */ static void PCX_Planes ( zf, image, bpp, nr_pl ) ZFILE *zf; Image *image; int bpp, nr_pl; /* Assertion : */ /* bpp is 1, 2 or 4 only, dividing 8 without remainder anyways, */ /* bpp * nr_pl <= 8 */ { byte *ptr, *sptr; register byte *tptr; int row = 0; int by_this_row = 0; int by_per_row; int this_plane = 0; int shifter = 0; register int j; int i, b, cnt; ptr = &(image->data[0]); by_per_row = Word ( PCXH->Zbprlo, PCXH->Zbprhi); sptr = tptr = (byte *) lcalloc ( by_per_row*8 ); /* We can't correct as easy as above, because we handle several */ /* bit planes simultaneously, and we must not load beyond row */ /* limits. So we load into a temporary row and copy it into */ /* image structure when the row is completed. */ while ((b = zgetc(zf)) != EOF) { if ((b & 0xC0) == 0xC0) { /* Get count and data as above */ cnt = b & 0x3F; b = zgetc ( zf ); if (b == EOF) { fprintf(stderr, "Unexpected EOF\n" ); return; } } else cnt = 1; for ( i = 0; i < cnt; i++ ) { /* Load data into temp. */ switch (bpp) { case 1 : *tptr++ |= (byte) (((b & 0x80 ) >> 7) << shifter); *tptr++ |= (byte) (((b & 0x40 ) >> 6) << shifter); *tptr++ |= (byte) (((b & 0x20 ) >> 5) << shifter); *tptr++ |= (byte) (((b & 0x10 ) >> 4) << shifter); *tptr++ |= (byte) (((b & 0x08 ) >> 3) << shifter); *tptr++ |= (byte) (((b & 0x04 ) >> 2) << shifter); *tptr++ |= (byte) (((b & 0x02 ) >> 1) << shifter); *tptr++ |= (byte) ((b & 0x01 ) << shifter); /* This is not a loop for performance reasons. */ /* Can't write e.g. ">> 2 - shifter", because */ /* that expression would get negative. */ break; case 2 : *tptr++ |= (byte) (((b & 0xC0 ) >> 6) << shifter); *tptr++ |= (byte) (((b & 0x30 ) >> 4) << shifter); *tptr++ |= (byte) (((b & 0x0C ) >> 2) << shifter); *tptr++ |= (byte) ((b & 0x03 ) << shifter); break; case 4 : *tptr++ |= (byte) (((b & 0xF0) >> 4) << shifter); *tptr++ |= (byte) ((b & 0x0F) << shifter); break; default :; /* Can't happen if assertion holds */ } if (++by_this_row == by_per_row) { /* Row done ? */ by_this_row = 0; /* reset counter */ if (++this_plane == nr_pl) { /* was it last plane ? */ row++; /* inc counter */ tptr = sptr; /* get saved ptr */ this_plane = shifter = 0;/* reset plane Nr */ for (j = 0; j < image->width; j++) { *ptr++ = *tptr; /* store final data */ *tptr++ = 0; /* clear temp data */ } if ( row >= image->height ) return; /* Done with image ? */ } else /* Prepare next plane */ shifter = this_plane * bpp; tptr = sptr; /* Get saved ptr */ } } } } /* ** PCX_LoadImage ** ** Load PC Paintbrush file into the passed Image structure. ** ** Returns no value (void function) */ static void PCX_LoadImage ( zf ,image ) ZFILE *zf; Image *image; { switch (PCXH->Zbpp) { /* What kind of plane do we have ? */ case 1 : /* Bit planes */ if (PCXH->Znplanes == 1) /* Only one : Read it */ PCX_Load_Raster ( zf, image, 1 ); else PCX_Planes ( zf, image, 1, PCXH->Znplanes ); break; case 2 : /* Two or four bits per plane */ case 4 : /* are read plane by plane */ PCX_Planes ( zf, image, PCXH->Zbpp, PCXH->Znplanes ); break; case 8 : /* Byte planes */ if (PCXH->Znplanes == 1) /* Only one : Read it */ PCX_Load_Raster ( zf, image, 8 ); else { /* More not allowed */ fprintf(stderr, "Only 1 plane allowed if 8 bits per plane\n"); cleanup(-1); } break; default : /* Neither case found */ fprintf(stderr, "%d bits per plane not supported\n", PCXH->Zbpp ); cleanup(-1); } } /* ** pcxLoad ** ** Load PCX Paintbrush file into an Image structure. ** ** Returns pointer to allocated struct if successful, NULL otherwise */ Image *pcxLoad ( fullname, name, verbose ) char *fullname, *name; unsigned int verbose; { ZFILE *zf; unsigned int i; int xmin; int xmax; int ymin; int ymax; int colors; PCXcolor *cmap; int clen; Image *image; if ( ! (zf = zopen ( fullname ))) /* Open input file */ return ( (Image *) NULL); PCXH = (PCXHeader *) lmalloc ( PCXHsize ); if (zread ( zf, PCXH, PCXHsize ) != PCXHsize) { /* Read header */ zclose ( zf ); return ( (Image *) NULL ); } if ((PCXH->Zid != PCX_MAGIC) || (PCXH->Zver > 5)) { zclose ( zf ); /* Is it PCX, Version less 5 ? */ return ( (Image *) NULL ); } znocache(zf); /* don't need caching anymore */ xmin = Word ( PCXH->Zxminlo, PCXH->Zxminhi); /* Calculate sizes */ xmax = Word ( PCXH->Zxmaxlo, PCXH->Zxmaxhi); ymin = Word ( PCXH->Zyminlo, PCXH->Zyminhi); ymax = Word ( PCXH->Zymaxlo, PCXH->Zymaxhi); xmax = xmax - xmin + 1; ymax = ymax - ymin + 1; colors = 1 << (PCXH->Zbpp * PCXH->Znplanes); /* Calculate colors*/ if (verbose) { /* Print Information */ if (colors == 2) fprintf(stderr, "%s is a %dx%d monochrome PC Paintbrush image\n", name, xmax, ymax ); else fprintf(stderr, "%s is a %dx%d %d color PC Paintbrush image\n", name, xmax, ymax, colors ); } if (colors > 256) { fprintf(stderr, "No more than 256 colors allowed in PCX format\n" ); cleanup(-1); } if (PCXH->Zenc == 0) { fprintf(stderr, "Unencoded PCX format not yet supported. Please" ); fprintf(stderr, " email the uuencoded image\n to erueg@cfgauss." ); fprintf(stderr, "uni-math.gwdg.de\n" ); cleanup(-1); } if (colors == 2) /* Allocate appropriate pbm array */ image = newBitImage ( xmax, ymax ); else { image = newRGBImage ( xmax, ymax, 8 ); } PCX_LoadImage ( zf, image ); if (colors > 16) { /* Handle external colormap */ while ((i = zgetc(zf)) != PCX_MAPSTART); clen = colors * 3; cmap = (PCXcolor *) lmalloc ( clen ); if (zread ( zf, cmap, clen ) != clen) { fprintf(stderr, "EOF while reading colormap" ); cleanup(-1); } for ( i = 0; i < colors; i++) { *(image->rgb.red + i) = (cmap [i].Zred << 8); *(image->rgb.green + i) = (cmap [i].Zgreen << 8); *(image->rgb.blue + i) = (cmap [i].Zblue << 8); } image->rgb.used = colors; lfree ( cmap ); } else if (colors > 2) { /* Handle internal colormap */ for ( i = 0; i < colors; i++) { *(image->rgb.red + i) = (PCXH->Zcmap [i].Zred << 8); *(image->rgb.green + i) = (PCXH->Zcmap [i].Zgreen << 8); *(image->rgb.blue + i) = (PCXH->Zcmap [i].Zblue << 8); } image->rgb.used = colors; } zclose ( zf ); lfree ( PCXH ); image->title = dupString(name); return ( image ); } kit/image/pcx.h010064400237450000000000000026160642466042700132120ustar nishidawheel/* pcx.h: * * PCX header file * * Eckhard R"uggeberg 15.10.91 */ typedef struct { byte Zred; byte Zgreen; byte Zblue; } PCXcolor; typedef struct { byte Zid; /* Id byte : 0x0a = ZSoft Z */ byte Zver; /* Version : 0 = 2.5 2 = 2.8 w palette 3 = 2.8 w/o pal. 5 = 3.0 */ byte Zenc; /* Encoding : 0 = uncompressed, 1 = compressed */ byte Zbpp; /* Bits per pixel per plane, recommended only 1 or 8 */ byte Zxminlo; byte Zxminhi; /* left Border Pixel coord. */ byte Zyminlo; byte Zyminhi; /* upper Border Pixel coord. */ byte Zxmaxlo; byte Zxmaxhi; /* right Border Pixel coord. */ byte Zymaxlo; byte Zymaxhi; /* lower Border Pixel coord. */ short Zhres; /* horiz. resolution, ignored */ short Zvres; /* vert. resolution, ignored */ PCXcolor Zcmap [16]; /* Colormap for 16-color pict. */ byte Zreserved; byte Znplanes; /* # of planes, recommended 1,4 */ byte Zbprlo; byte Zbprhi; /* bytes per row (always even) */ short Zpalinfo; /* Palette info, ignored */ byte Zfiller[58]; /* reserved Filler = 0 */ } PCXHeader; static PCXHeader *PCXH; /* To avoid a parameter for all */ /* procedures */ #define Word(LO,HI) (HI << 8) + LO /* to swap bytes in a word */ #define PCX_MAGIC 0x0a /* first byte in a PCX file */ #define PCX_MAPSTART 0x0c /* Start of appended colormap */ #define PCXHsize 128 /* Size of PCX Header */ kit/image/png.c010064400237450000000000000143520726501365400131750ustar nishidawheel/* * Copyright (C) 1999 and 2000 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: png.c,v 1.6 2001/04/11 08:37:00 nishida Exp $ */ #ifdef USE_PNG #include #if 1 #define PNG_ALPHA_CHANNEL #endif #ifdef PNG_ALPHA_CHANNEL #include "../mgp.h" #else #include "image.h" #endif #define PNG_CHECK_BYTES 4 int pngIdent(char *fullname, char *name) {} Image * pngLoad(fullname, name, verbose) char *fullname, *name; unsigned int verbose; { FILE *fp; png_structp png_ptr; png_infop info_ptr; png_uint_32 width, height; png_bytep *row_pointers; int bitdepth, colortype, row, is_png, alpha_flag = 0; char header[PNG_CHECK_BYTES], *destptr; Image *image; #ifdef PNG_ALPHA_CHANNEL int alpha_red, alpha_green, alpha_blue, ialpha; int x, len; float alpha; char *p; XColor xcol; #endif if (!(fp = fopen(fullname, "rb"))) return NULL; if (fread(header, 1, sizeof(header), fp) != sizeof(header)) return NULL; is_png = !png_sig_cmp(header, 0, sizeof(header)); if (!is_png){ if (verbose) fprintf(stderr, "pngLoad: this is not png file\n"); return NULL; } png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL, NULL, NULL); if (!png_ptr) return NULL; info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); return NULL; } if (setjmp(png_ptr->jmpbuf)) { png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); return NULL; } png_init_io(png_ptr, fp); png_set_sig_bytes(png_ptr, sizeof(header)); png_read_info(png_ptr, info_ptr); png_get_IHDR(png_ptr, info_ptr, &width, &height, &bitdepth, &colortype, NULL, NULL, NULL); if (verbose){ fprintf(stderr, "pngLoad: [%s] width %d height %d depth %d color %d\n", fullname, width, height, bitdepth, colortype); } /* currently, the alpha channel is not supported.. */ #ifndef PNG_ALPHA_CHANNEL if (colortype & PNG_COLOR_MASK_ALPHA){ if (verbose) fprintf(stderr, "pngLoad: strip off alpha channel\n"); png_set_strip_alpha(png_ptr); } #endif /* strip the 16 bit pixels down to 8bit. */ if (bitdepth == 16){ png_set_strip_16(png_ptr); } if (colortype == PNG_COLOR_TYPE_GRAY || colortype == PNG_COLOR_TYPE_GRAY_ALPHA){ png_set_gray_to_rgb(png_ptr); png_read_update_info(png_ptr, info_ptr); } if (colortype == PNG_COLOR_TYPE_PALETTE && bitdepth <= 8){ if (verbose) fprintf(stderr, "pngLoad: palette to rgb\n"); png_set_palette_to_rgb(png_ptr); png_read_update_info(png_ptr, info_ptr); } if (colortype == PNG_COLOR_TYPE_GRAY && bitdepth < 8){ png_set_gray_1_2_4_to_8(png_ptr); } if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)){ if (verbose) fprintf(stderr, "pngLoad: add tRNS info to alpha channel\n"); png_set_tRNS_to_alpha(png_ptr); alpha_flag = 1; #ifndef PNG_ALPHA_CHANNEL png_set_strip_alpha(png_ptr); #endif } image = newTrueImage(width, height); row_pointers = (png_bytep *)malloc(sizeof(png_bytep) * height); for (row = 0; row < height; row++) { row_pointers[row] = (png_bytep)malloc(png_get_rowbytes(png_ptr, info_ptr)); } png_read_image(png_ptr, row_pointers); destptr = image->data; #ifndef PNG_ALPHA_CHANNEL for (row = 0; row < height; row++) { memcpy(destptr + width * row * 3, row_pointers[row], width * 3); } #else xcol.pixel = back_color[caching]; xcol.flags = DoRed|DoGreen|DoBlue; XQueryColor(display, colormap, &xcol); alpha_red = xcol.red >> 8; alpha_green = xcol.green >> 8; alpha_blue = xcol.blue >> 8; if (!(colortype & PNG_COLOR_MASK_ALPHA) && !alpha_flag){ for (row = 0; row < height; row++) { memcpy(destptr + width * row * 3, row_pointers[row], width * 3); } } else { /* alpha channel processing */ for (row = 0; row < height; row++) { len = png_get_rowbytes(png_ptr, info_ptr); p = destptr + width * row * 3; for (x = 0; x < len; x+= 4){ ialpha = (u_int)(row_pointers[row][x+3]); if (!ialpha) { /* this pixel is transparent */ *(p++) = alpha_red; *(p++) = alpha_green; *(p++) = alpha_blue; } else { if (ialpha == 255){ /* this pixel is opacity */ *(p++) = row_pointers[row][x]; *(p++) = row_pointers[row][x+1]; *(p++) = row_pointers[row][x+2]; } else { alpha = (u_int)(row_pointers[row][x+3]) / 255.0; *(p++) = row_pointers[row][x] * alpha + alpha_red * (1.0 - alpha); *(p++) = row_pointers[row][x+1] * alpha + alpha_green * (1.0 - alpha); *(p++) = row_pointers[row][x+2] * alpha + alpha_blue * (1.0 - alpha); } } } } } #endif for (row = 0; row < height; row++) free (row_pointers[row]); free(row_pointers); png_read_end(png_ptr, info_ptr); png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); return image; } #endif kit/image/reduce.c010064400237450000000000000401400664163776500136660ustar nishidawheel/* reduce.c: * * reduce an image's colormap usage to a set number of colors. this also * translates a true color image to a TLA-style image of `n' colors. * * this uses an algorithm by Paul Heckbert discussed in `Color Image * Quantization for Frame Buffer Display,' _Computer Graphics_ 16(3), * pp 297-307. this implementation is based on one discussed in * 'A Few Good Colors,' _Computer Language_, Aug. 1990, pp 32-41 by * Dave Pomerantz. * * this function cannot reduce to any number of colors larger than 32768. * * jim frost 04.18.91 * * Copyright 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "image.h" #include /* for qsort */ #define DIST(A, B) ((A) < (B) ? (B) - (A) : (A) - (B)) /* find the distance between two colors. we loose some accuracy here because * a triple squared short may not fit in a long. we use a table lookup * to help speed this up; it's an O(exp(n,2)) algorithm. */ unsigned int squareInit= 0; unsigned long squareTable[32768]; void initSquareTable() { unsigned long a; for (a= 0; a < 32768; a++) squareTable[a]= a * a; squareInit= 1; } unsigned long colorDistance(rgb, a, b) RGBMap *rgb; Pixel a, b; { return(squareTable[DIST(*(rgb->red + a), *(rgb->red + b)) >> 1] + squareTable[DIST(*(rgb->green + a), *(rgb->green + b)) >> 1] + squareTable[DIST(*(rgb->blue + a), *(rgb->blue + b)) >> 1]); } /* this converts a TLA-style pixel into a 15-bit true color pixel */ #define TLA_TO_15BIT(TABLE,PIXEL) \ ((((TABLE).red[PIXEL] & 0xf800) >> 1) | \ (((TABLE).green[PIXEL] & 0xf800) >> 6) | \ (((TABLE).blue[PIXEL] & 0xf800) >> 11)) /* this converts a 24-bit true color pixel into a 15-bit true color pixel */ #define TRUE_TO_15BIT(PIXEL) \ ((((PIXEL) & 0xf80000) >> 9) | \ (((PIXEL) & 0x00f800) >> 6) | \ (((PIXEL) & 0x0000f8) >> 3)) /* these macros extract color intensities from a 15-bit true color pixel */ #define RED_INTENSITY(P) (((P) & 0x7c00) >> 10) #define GREEN_INTENSITY(P) (((P) & 0x03e0) >> 5) #define BLUE_INTENSITY(P) ((P) & 0x001f) /* this structure defines a color area which is made up of an array of pixel * values and a count of the total number of image pixels represented by * the area. color areas are kept in a list sorted by the number of image * pixels they represent. */ struct color_area { unsigned short *pixels; /* array of pixel values in this area */ unsigned short num_pixels; /* size of above array */ int (*sort_func)(); /* predicate func to sort with before * splitting */ unsigned long pixel_count; /* # of image pixels we represent */ struct color_area *prev, *next; }; /* predicate functions for qsort */ static int sortRGB(p1, p2) unsigned short *p1, *p2; { unsigned int red1, green1, blue1, red2, green2, blue2; red1= RED_INTENSITY(*p1); green1= GREEN_INTENSITY(*p1); blue1= BLUE_INTENSITY(*p1); red2= RED_INTENSITY(*p2); green2= GREEN_INTENSITY(*p2); blue2= BLUE_INTENSITY(*p2); if (red1 == red2) if (green1 == green2) if (blue1 < blue2) return(-1); else return(1); else if (green1 < green2) return(-1); else return(1); else if (red1 < red2) return(-1); else return(1); } static int sortRBG(p1, p2) unsigned short *p1, *p2; { unsigned int red1, green1, blue1, red2, green2, blue2; red1= RED_INTENSITY(*p1); green1= GREEN_INTENSITY(*p1); blue1= BLUE_INTENSITY(*p1); red2= RED_INTENSITY(*p2); green2= GREEN_INTENSITY(*p2); blue2= BLUE_INTENSITY(*p2); if (red1 == red2) if (blue1 == blue2) if (green1 < green2) return(-1); else return(1); else if (blue1 < blue2) return(-1); else return(1); else if (red1 < red2) return(-1); else return(1); } static int sortGRB(p1, p2) unsigned short *p1, *p2; { unsigned int red1, green1, blue1, red2, green2, blue2; red1= RED_INTENSITY(*p1); green1= GREEN_INTENSITY(*p1); blue1= BLUE_INTENSITY(*p1); red2= RED_INTENSITY(*p2); green2= GREEN_INTENSITY(*p2); blue2= BLUE_INTENSITY(*p2); if (green1 == green2) if (red1 == red2) if (blue1 < blue2) return(-1); else return(1); else if (red1 < red2) return(-1); else return(1); else if (green1 < green2) return(-1); else return(1); } static int sortGBR(p1, p2) unsigned short *p1, *p2; { unsigned int red1, green1, blue1, red2, green2, blue2; red1= RED_INTENSITY(*p1); green1= GREEN_INTENSITY(*p1); blue1= BLUE_INTENSITY(*p1); red2= RED_INTENSITY(*p2); green2= GREEN_INTENSITY(*p2); blue2= BLUE_INTENSITY(*p2); if (green1 == green2) if (blue1 == blue2) if (red1 < red2) return(-1); else return(1); else if (blue1 < blue2) return(-1); else return(1); else if (green1 < green2) return(-1); else return(1); } static int sortBRG(p1, p2) unsigned short *p1, *p2; { unsigned int red1, green1, blue1, red2, green2, blue2; red1= RED_INTENSITY(*p1); green1= GREEN_INTENSITY(*p1); blue1= BLUE_INTENSITY(*p1); red2= RED_INTENSITY(*p2); green2= GREEN_INTENSITY(*p2); blue2= BLUE_INTENSITY(*p2); if (blue1 == blue2) if (red1 == red2) if (green1 < green2) return(-1); else return(1); else if (red1 < red2) return(-1); else return(1); else if (blue1 < blue2) return(-1); else return(1); } static int sortBGR(p1, p2) unsigned short *p1, *p2; { unsigned int red1, green1, blue1, red2, green2, blue2; red1= RED_INTENSITY(*p1); green1= GREEN_INTENSITY(*p1); blue1= BLUE_INTENSITY(*p1); red2= RED_INTENSITY(*p2); green2= GREEN_INTENSITY(*p2); blue2= BLUE_INTENSITY(*p2); if (blue1 == blue2) if (green1 == green2) if (red1 < red2) return(-1); else return(1); else if (green1 < green2) return(-1); else return(1); else if (blue1 < blue2) return(-1); else return(1); } /* this does calculations on a color area following a split and inserts * the color area in the list of color areas. */ static void insertColorArea(pixel_counts, rlargest, rsmallest, area) unsigned long *pixel_counts; struct color_area **rlargest, **rsmallest, *area; { int a; unsigned int red, green, blue; unsigned int min_red, min_green, min_blue; unsigned int max_red, max_green, max_blue= 0; struct color_area *largest, *smallest, *tmp_area; min_red= min_green= min_blue= 31; max_red= max_green= max_blue= 0; /* update pixel count for this area and find RGB intensity widths */ area->pixel_count= 0; for (a= 0; a < area->num_pixels; a++) { area->pixel_count += pixel_counts[area->pixels[a]]; red= RED_INTENSITY(area->pixels[a]); green= GREEN_INTENSITY(area->pixels[a]); blue= BLUE_INTENSITY(area->pixels[a]); if (red < min_red) min_red= red; if (red > max_red) max_red= red; if (green < min_green) min_green= green; if (green > max_green) max_green= green; if (blue < min_blue) min_blue= blue; if (blue > max_blue) max_blue= blue; } /* calculate widths and determine which predicate function to use based * on the result */ red= max_red - min_red; green= max_green - min_green; blue= max_blue - min_blue; if (red > green) if (green > blue) area->sort_func= sortRGB; else if (red > blue) area->sort_func= sortRBG; else area->sort_func= sortBRG; else if (green > blue) if (red > blue) area->sort_func= sortGRB; else area->sort_func= sortGBR; else area->sort_func= sortBGR; /* insert color area in color area list sorted by number of pixels that * the area represents */ largest= *rlargest; smallest= *rsmallest; if (!largest) { largest= smallest= area; area->prev= area->next= (struct color_area *)NULL; } /* if we only have one element, our pixel count is immaterial so we get * stuck on the end of the list. */ else if (area->num_pixels < 2) { smallest->next= area; area->prev= smallest; area->next= (struct color_area *)NULL; smallest= area; } /* insert node into list */ else { for (tmp_area= largest; tmp_area; tmp_area= tmp_area->next) if ((area->pixel_count > tmp_area->pixel_count) || (tmp_area->num_pixels < 2)) { area->prev= tmp_area->prev; area->next= tmp_area; tmp_area->prev= area; if (area->prev) area->prev->next= area; else largest= area; break; } if (!tmp_area) { area->prev= smallest; area->next= (struct color_area *)NULL; smallest->next= area; smallest= area; } } *rlargest= largest; *rsmallest= smallest; } Image *reduce(image, n, verbose) Image *image; unsigned int n, verbose; { unsigned long pixel_counts[32768]; /* pixel occurrance histogram */ unsigned short pixel_array[32768]; unsigned long count, midpoint; int x, y, num_pixels, allocated, depth; byte *pixel, *dpixel; struct color_area *areas, *largest_area, *smallest_area; struct color_area *new_area, *old_area; Image *new_image; char buf[BUFSIZ]; goodImage(image, "reduce"); if (n > 32768) /* max # of colors we can handle */ n= 32768; /* create a histogram of particular pixel occurrances */ memset(pixel_counts, 0, 32768 * sizeof(unsigned long)); switch (image->type) { case IBITMAP: return(image); case IRGB: if (image->rgb.used <= n) return(image); /* xxx kazu right? */ if (verbose) { fprintf(stderr, " Reducing RGB image color usage to %d colors...", n); fflush(stderr); } pixel= image->data; for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { pixel_counts[TLA_TO_15BIT(image->rgb, memToVal(pixel, image->pixlen))]++; pixel += image->pixlen; } break; case ITRUE: if (image->pixlen != 3) { fprintf(stderr, "reduce: true color image has strange pixel length?\n"); return(image); } if (verbose) { fprintf(stderr, " Converting true color image to RGB image with %d colors...", n); fflush(stderr); } pixel= image->data; for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { pixel_counts[TRUE_TO_15BIT(memToVal(pixel, 3))]++; pixel += 3; } break; default: return(image); /* not something we can reduce, thank you anyway */ } /* create array of 15-bit pixel values that actually occur in the image */ num_pixels= 0; for (x= 0; x < 32768; x++) if (pixel_counts[x] > 0) pixel_array[num_pixels++]= (short)x; if (verbose) { fprintf(stderr, "image uses %d colors...", num_pixels); fflush(stderr); } /* create color area array and initialize first element */ areas= (struct color_area *)lmalloc(n * sizeof(struct color_area)); areas[0].pixels= pixel_array; areas[0].num_pixels= num_pixels; largest_area= smallest_area= (struct color_area *)NULL; insertColorArea(pixel_counts, &largest_area, &smallest_area, areas); allocated= 1; /* keep splitting the color area until we have as many color areas as we * need */ while (allocated < n) { /* if our largest area can't be broken down, we can't even get the * number of colors they asked us to */ if (largest_area->num_pixels < 2) break; /* find midpoint of largest area and do split */ qsort(largest_area->pixels, largest_area->num_pixels, sizeof(short), largest_area->sort_func); count= 0; midpoint= largest_area->pixel_count / 2; for (x= 0; x < largest_area->num_pixels; x++) { count += pixel_counts[largest_area->pixels[x]]; if (count > midpoint) break; } if (x == 0) /* degenerate case; divide in half */ x= 1; new_area= areas + allocated; new_area->pixels= largest_area->pixels + x; new_area->num_pixels= largest_area->num_pixels - x; largest_area->num_pixels= x; old_area= largest_area; largest_area= largest_area->next; if (largest_area) largest_area->prev= (struct color_area *)NULL; else smallest_area= (struct color_area *)NULL; /* recalculate for each area of split and insert in the area list */ insertColorArea(pixel_counts, &largest_area, &smallest_area, old_area); insertColorArea(pixel_counts, &largest_area, &smallest_area, new_area); allocated++; } /* get destination image */ depth= colorsToDepth(n); new_image= newRGBImage(image->width, image->height, depth); if (image->title) { sprintf(buf, "%s (%d colors)", image->title, n); new_image->title= dupString(buf); } /* calculate RGB table from each color area. this should really calculate * a new color by weighting the intensities by the number of pixels, but * it's a pain to scale so this just averages all the intensities. it * works pretty well regardless. */ for (x= 0; x < allocated; x++) { long red, green, blue, count, pixel; red= green= blue= 0; count= areas[x].pixel_count; for (y= 0; y < areas[x].num_pixels; y++) { pixel= areas[x].pixels[y]; red += RED_INTENSITY(pixel); green += GREEN_INTENSITY(pixel); blue += BLUE_INTENSITY(pixel); pixel_counts[pixel]= x; } red /= areas[x].num_pixels; green /= areas[x].num_pixels; blue /= areas[x].num_pixels; new_image->rgb.red[x]= (unsigned short)(red << 11); new_image->rgb.green[x]= (unsigned short)(green << 11); new_image->rgb.blue[x]= (unsigned short)(blue << 11); }; new_image->rgb.used= allocated; new_image->rgb.compressed= 1; lfree(areas); /* copy old image into new image */ pixel= image->data; dpixel= new_image->data; switch(image->type) { case IRGB: for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { valToMem(pixel_counts[TLA_TO_15BIT(image->rgb, memToVal(pixel, image->pixlen))], dpixel, new_image->pixlen); pixel += image->pixlen; dpixel += new_image->pixlen; } if (image->trans >= 0) new_image->trans = pixel_counts[TLA_TO_15BIT(image->rgb, image->trans)]; break; case ITRUE: for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { valToMem(pixel_counts[TRUE_TO_15BIT(memToVal(pixel, 3))], dpixel, new_image->pixlen); pixel += 3; dpixel += new_image->pixlen; } if (image->trans >= 0) new_image->trans = pixel_counts[TRUE_TO_15BIT(image->trans)]; break; } if (verbose) fprintf(stderr, "done\n"); return(new_image); } /* expand an image into a true color image */ Image *expand(image) Image *image; { Image *new_image; int x, y; Pixel spixval, dpixval; byte *spixel, *dpixel, *line; unsigned int linelen; byte mask; goodImage(image, "expand"); if TRUEP(image) return(image); new_image= newTrueImage(image->width, image->height); new_image->title= dupString(image->title); switch (image->type) { case IBITMAP: line= image->data; dpixel= new_image->data; linelen= (image->width / 8) + (image->width % 8 ? 1 : 0); spixval = RGB_TO_TRUE(image->rgb.red[0], image->rgb.green[0], image->rgb.blue[0]); dpixval = RGB_TO_TRUE(image->rgb.red[1], image->rgb.green[1], image->rgb.blue[1]); for (y= 0; y < image->height; y++) { spixel= line; mask= 0x80; for (x= 0; x < image->width; x++) { valToMem((mask & *spixel ? dpixval : spixval), dpixel, 3); mask >>= 1; if (!mask) { mask= 0x80; spixel++; } dpixel += new_image->pixlen; } line += linelen; } if (image->trans >= 0) new_image->trans = image->trans ? dpixval : spixval; break; case IRGB: spixel= image->data; dpixel= new_image->data; for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { spixval= memToVal(spixel, image->pixlen); valToMem(RGB_TO_TRUE(image->rgb.red[spixval], image->rgb.green[spixval], image->rgb.blue[spixval]), dpixel, new_image->pixlen); spixel += image->pixlen; dpixel += new_image->pixlen; } if (image->trans >= 0) new_image->trans = RGB_TO_TRUE(image->rgb.red[image->trans], image->rgb.green[image->trans], image->rgb.blue[image->trans]); break; } return(new_image); } kit/image/rle.c010064400237450000000000000266210664163776600132120ustar nishidawheel/* * rle - read in a Utah RLE Toolkit type image. * * Author: Graeme Gill * Date: 30/5/90 * * Bugs - doesn't free up memory used by rle functions. * */ #undef DEBUG #ifdef DEBUG # define debug(xx) fprintf(stderr,xx) #else # define debug(xx) #endif #define MIN(a,b) ( (a)<(b) ? (a) : (b)) #include #include #include #include "image.h" #include "rle.h" void dithermap(); /* input file stuff */ static int ptype; /* picture type : */ #define BW_NM 0 /* black and white, no map */ #define BW_M 1 /* black and white, and a map */ #define SC_M 2 /* single colour channel and colour map */ #define C_NM 3 /* full colour, no maps */ #define C_M 4 /* full colour with colour maps */ static rle_pixel **fmaps; /* file colour maps from buildmap() */ static unsigned char **scan; /* buffer for input data */ static int x_min; /* copy of picture x_min */ static int y_min; /* copy of picture y_min */ /* option stuff (Not functional) */ static float disp_gam = 1.0; /* default display gamma correction factor */ static int iflag=0; /* user suplied image gamma */ static float img_gam = 1.0; /* image gamma */ static int bwflag = 0; /* black and white flag */ static int gammamap[256]; static int background[3] = {0,0,0}; /* our background colour */ /* stuff for dithering colour pictures */ int colmap[216][3]; /* for dither map */ int magic[16][16]; int modN[256]; int divN[256]; #define DMAP(v,x,y) (modN[v]>magic[x][y] ? divN[v] + 1 : divN[v]) /* run the black and white through its map */ static void bw_m_line(dp,number) int number; register unsigned char *dp; { register unsigned char *r; register int i; for(i=number,r= &scan[0][0];i>0;i--,r++,dp++) { *dp = fmaps[0][*r]; } } /* convert a colour line with map to 8 bits per pixel */ static void c_m_line(dp,number,line) int number,line; register unsigned char *dp; { register unsigned char *r, *g, *b; register int i, col, row; if(!bwflag) { for ( row = line % dith_size, col = x_min % dith_size, i = number, r = &scan[0][0] ,g= &scan[1][0], b= &scan[2][0]; i > 0; i--, r++, g++, b++, dp++, col = ((col + 1) % dith_size) ) { *dp = DMAP(fmaps[0][*r], col, row) + DMAP(fmaps[1][*g], col, row) * 6 + DMAP(fmaps[2][*b], col, row) * 36; } } else { int red,green,blue; for (i = number, r= &scan[0][0], g= &scan[1][0] ,b= &scan[2][0]; i>0;i--,r++,g++,b++,dp++) { red = fmaps[0][*r];green=fmaps[1][*g];blue = fmaps[2][*b]; *dp = 0.35* red + 0.55* green + 0.1* blue; } } } int rleIdent(fullname, name) char *fullname, *name; { ZFILE *rlefile; int x_len,y_len; int rv; debug("rleIdent called\n"); rlefile = zopen(fullname); if(!rlefile) { perror("rleIdent: Unable to open file"); return(0); } debug("rleIdent: Opened file ok\n"); sv_globals.svfb_fd = rlefile; rv = rle_get_setup(&sv_globals); debug("rleIdent: got setup ok\n"); zclose(rlefile); debug("rleIdent: closed file ok\n"); switch(rv) { case -1: return 0; /* Not rle format */ case 0: /* now figure out the picture type */ switch(sv_globals.sv_ncolors) { case 0: perror("rleIdent: no colour channels to display"); return(0); case 1: x_len = sv_globals.sv_xmax - sv_globals.sv_xmin + 1; y_len = sv_globals.sv_ymax - sv_globals.sv_ymin + 1; fprintf(stderr, "%s is a %dx%d", name, x_len, y_len); switch(sv_globals.sv_ncmap) { case 0: /* black and white, no map */ fprintf(stderr, " 8 bit grey scale RLE image with no map\n"); break; case 1: /* black and white with a map */ fprintf(stderr, " 8 bit grey scale RLE image with map\n"); break; case 3: /* single channel encoded colour with decoding map */ fprintf(stderr, " 8 bit color RLE image with color map\n"); break; default: perror(" 8 bit RLE image with an illegal color map\n"); return 0; } break; case 3: x_len = sv_globals.sv_xmax - sv_globals.sv_xmin + 1; y_len = sv_globals.sv_ymax - sv_globals.sv_ymin + 1; fprintf(stderr, "%s is a %dx%d", name, x_len, y_len); switch(sv_globals.sv_ncmap) { case 0: fprintf(stderr, " 24 bit color RLE image with no map\n"); break; case 3: fprintf(stderr, " 24 bit color RLE image with colour map\n"); break; default: fprintf(stderr, " 24 bit color RLE image with an illegal color map\n"); return 0; } break; default: x_len = sv_globals.sv_xmax - sv_globals.sv_xmin + 1; y_len = sv_globals.sv_ymax - sv_globals.sv_ymin + 1; fprintf(stderr, "%s is a %dx%d", name, x_len, y_len); fprintf(stderr, " RLE image with an illegal number of color planes\n"); return 0; } return 1; default: /* Some sort of error */ /* perror("rleIdent");*/ return 0; } } Image *rleLoad(fullname,name,verbose) char *fullname,*name; unsigned int verbose; { int x_len, y_len; int i,j; ZFILE *rlefile; int ncol; /* number of colors */ int depth; unsigned char *bufp; Image *image; unsigned char *buf; dith_levels = 256; /* aim for 128 levels of each colour */ debug("rleLoad called\n"); rlefile = zopen(fullname); if(!rlefile) { perror("rleLoad: Cannot open input file"); return(NULL); } sv_globals.svfb_fd = rlefile; debug("rleLoad: About to call get_setup\n"); if(rle_get_setup( &sv_globals )) { zclose(rlefile); return(NULL); } debug("rleLoad: get_setup called ok\n"); if(iflag == 1) /* -i flag */ img_gam = 1.0/img_gam; /* convert to display gamma */ /* If no image gamma on command line, check comments in file */ if (!iflag) { char * v; if ( (v = rle_getcom( "image_gamma", &sv_globals )) != NULL ) { img_gam = atof( v ); /* Protect against bogus information */ if ( img_gam == 0.0 ) img_gam = 1.0; else img_gam = 1.0 / img_gam; /* convert to display gamma */ } else if ( (v = rle_getcom( "display_gamma", &sv_globals )) != NULL ) { img_gam = atof( v ); /* Protect */ if ( img_gam == 0.0 ) img_gam = 1.0; } } x_len = sv_globals.sv_xmax - sv_globals.sv_xmin + 1; y_len = sv_globals.sv_ymax - sv_globals.sv_ymin + 1; x_min = sv_globals.sv_xmin; y_min = sv_globals.sv_ymin; /* fix this so that we don't waste space */ sv_globals.sv_xmax -= sv_globals.sv_xmin; sv_globals.sv_xmin = 0; /* turn off the alpha channel (don't waste time and space)*/ sv_globals.sv_alpha = 0; SV_CLR_BIT(sv_globals,SV_ALPHA); /* for now, force background clear */ if(sv_globals.sv_background ==1) /* danger setting */ { debug("Forcing clear of background\n"); sv_globals.sv_background = 2; if(sv_globals.sv_bg_color==0) /* if none allocated */ sv_globals.sv_bg_color = background; /* use this one */ } /* now figure out the picture type */ switch(sv_globals.sv_ncolors) { case 0: perror("rleLoad: no colour channels to display"); zclose(rlefile); return(NULL); case 1: switch(sv_globals.sv_ncmap) { case 0: ptype = BW_NM; /* black and white, no map */ break; case 1: ptype = BW_M; /* black and white with a map */ break; case 3: ptype = SC_M; /* single channel encoded colour with decoding map */ break; default: zclose(rlefile); perror("rleLoad: Illegal number of maps for one colour channel"); return(NULL); } break; case 3: switch(sv_globals.sv_ncmap) { case 0: ptype = C_NM; /* colour, no map */ break; case 3: ptype = C_M; /* colour with maps */ break; default: perror("rleLoad: Illegal number of maps for colour picture"); zclose(rlefile); return(NULL); } break; default: perror("rleLoad: Illegal number of colour channels"); zclose(rlefile); return(NULL); } if(verbose) { fprintf(stderr, "%s is a %dx%d",name,x_len,y_len); switch(ptype) { case BW_NM: fprintf(stderr, " 8 bit grey scale RLE image with no map"); break; case BW_M: fprintf(stderr, " 8 bit grey scale RLE image with map"); break; case SC_M: fprintf(stderr, " 8 bit RLE image with colour map"); break; case C_NM: fprintf(stderr, " 24 bit RLE image with no map (will dither to 8 bits)"); break; case C_M: fprintf(stderr, " 24 bit RLE image with color map (will dither to 8 bits)"); break; } fprintf(stderr, ", with gamma of %4.2f\n",img_gam); } znocache(rlefile); if(ptype==SC_M) { /* don't mess with the image, but change their colour map a bit if needed */ disp_gam /= img_gam; /* amount to change their map */ img_gam = 1.0; /* not to the image coming in */ } /* get hold of the colour maps, and set to undo their images gamma */ fmaps = buildmap(&sv_globals,sv_globals.sv_ncolors,img_gam); /* now we had better sort out the picture data */ debug("done colour map\n"); /* rle stufff */ /* Get space for a full colour scan line */ scan = (unsigned char **) lmalloc( (sv_globals.sv_ncolors + sv_globals.sv_alpha) * sizeof( unsigned char * ) ); for ( i = 0; i < sv_globals.sv_ncolors + sv_globals.sv_alpha; i++ ) scan[i] = (unsigned char *)lmalloc(x_len); if ( sv_globals.sv_alpha ) scan++; debug("got space for get_row\n"); depth = 8; /* We always supply 8bit images */ image = newRGBImage(x_len,y_len,depth); image->title = dupString(name); debug("got image structure\n"); buf = image->data; /* If we are going to dither - then create the dither matrix. */ if(!bwflag && ptype!=SC_M && ptype != BW_NM && ptype != BW_M) { dith_np2 = 1; /* allow non-power of 2 dither map size */ dithermap( 6, disp_gam, colmap, divN, modN, magic ); } debug("About to read image in\n"); bufp = buf + (y_len-1) * x_len; for(j=y_len;j>0;j--,bufp -= x_len) { rle_getrow(&sv_globals,scan); switch(ptype) { case SC_M: memcpy(bufp,&scan[0][0],x_len); break; case BW_NM: case BW_M: bw_m_line(bufp,x_len); break; case C_NM: case C_M: c_m_line(bufp,x_len,j); break; } } debug("Image Read in\n"); /* Deal with colour maps */ /* set up our gamma correction */ make_gamma(disp_gam,gammamap); /* we'll need it */ debug("Creating color map\n"); /* now load an appropriate colour map */ if(!bwflag && ptype==SC_M) { /* use their maps & correct their gamma */ ncol = 1<rgb.red + i) = gammamap[fmaps[0][i]]<<8; *(image->rgb.green + i) = gammamap[fmaps[1][i]]<<8; *(image->rgb.blue + i) = gammamap[fmaps[2][i]]<<8; } } else if(bwflag || ptype == BW_NM || ptype == BW_M) { /* load a black and white map (gamma corrected for this display)*/ ncol = 256; /* don't know whats been used */ for(i=0;irgb.red + i) = *(image->rgb.green + i) = *(image->rgb.blue + i) = gammamap[i]<<8; } } else { /* must be colour, so use dither map (gamma corrected for this display)*/ ncol = 6*6*6; /* Dither map has already been created above */ for(i = 0; i < ncol; i++) { *(image->rgb.red + i) = colmap[i][0]<<8; *(image->rgb.green + i) = colmap[i][1]<<8; *(image->rgb.blue + i) = colmap[i][2]<<8; } } image->rgb.used = ncol; zclose(rlefile); debug("finished\n"); return(image); } kit/image/rle.h010064400237450000000000000126700664163776700132170ustar nishidawheel /* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. */ /* * svfb_global.h - externally visible variables for svfb. * * Author: Todd W. Fuqua * Computer Science Dept. * University of Utah * Date: Sun Jul 29 1984 * Copyright (c) 1984 Todd W. Fuqua * * Added optimised dither square size globals * 88/07/13 Graeme W. Gill * * Added extern declarations. Carlos Puchol, 12/27/98. */ enum sv_dispatch { RUN_DISPATCH }; /* some compilers have problems converting unsigned bytes to float */ #define BYTEBUG /* On BIGENDIAN machines swap the bytes. Everything but vax's and * pdp-11's (not sure if it's pdp11 or PDP11 ??) * are considered BIGENDIAN machines. */ #define SWAB(val) (val= memToValLSB((byte *)&val, sizeof(val))) /* fix up some bezerklysims */ #ifndef bzero # define bzero(xx,yy) memset((char *)(xx),0,(int)(yy)) #endif #ifndef bcopy # define bcopy(xx,yy,zz) memcpy((char *)(yy),(char *)(xx),(int)(zz)) #endif /* **************************************************************** * TAG( rle_pixel rle_map ) * * Typedef for 8-bit (or less) pixel data. * * Typedef for 16-bit color map data. */ typedef unsigned char rle_pixel; typedef unsigned short rle_map; /* * Defines for traditional channel numbers */ #define SV_RED 0 /* red channel traditionally here */ #define SV_GREEN 1 /* green channel traditionally here */ #define SV_BLUE 2 /* blue channel traditionally here */ #define SV_ALPHA -1 /* Alpha channel here */ /* * Return values from rle_get_setup */ #define RLE_SUCCESS 0 #define RLE_NOT_RLE -1 #define RLE_NO_SPACE -2 #define RLE_EMPTY -3 #define RLE_EOF -4 /* * TAG( sv_globals ) * * Definition of "globals" structure used by RLE routines */ extern struct sv_globals { enum sv_dispatch sv_dispatch; /* type of file to create */ int sv_ncolors, /* number of color channels */ * sv_bg_color, /* pointer to bg color vector */ sv_alpha, /* if !0, save alpha channel */ sv_background, /* (background) 0->just save pixels, */ /* 1->overlay, 2->clear to bg first */ sv_xmin, /* lower X bound (left) */ sv_xmax, /* upper X bound (right) */ sv_ymin, /* lower Y bound (bottom) */ sv_ymax, /* upper Y bound (top) */ sv_ncmap, /* number of color channels in color map */ /* map only saved if != 0 */ sv_cmaplen; /* log2 of color map length */ rle_map * sv_cmap; /* pointer to color map array */ char ** sv_comments; /* pointer to array of pointers to comments */ ZFILE * svfb_fd; /* output file */ /* * Bit map of channels to read/save. Indexed by (channel mod 256). * Alpha channel sets bit 255. * * Indexing (0 <= c <= 255): * sv_bits[c/8] & (1 << (c%8)) */ #define SV_SET_BIT(glob,bit) \ ((glob).sv_bits[((bit)&0xff)/8] |= (1<<((bit)&0x7))) #define SV_CLR_BIT(glob,bit) \ ((glob).sv_bits[((bit)&0xff)/8] &= ~(1<<((bit)&0x7))) #define SV_BIT(glob,bit) \ ((glob).sv_bits[((bit)&0xff)/8] & (1<<((bit)&0x7))) char sv_bits[256/8]; /* * Local storage for rle_getrow & sv_putrow. * rle_getrow has * scan_y int current Y scanline * vert_skip int number of lines to skip * sv_putrow has * nblank int number of blank lines * brun short(*)[2] Array of background runs. * fileptr long Position in output file. */ union { struct { int scan_y, vert_skip; char is_eof, /* Set when EOF or EofOp encountered */ is_seek; /* If true, can seek input file */ } get; struct { int nblank; short (*brun)[2]; long fileptr; } put; } sv_private; } sv_globals; /* * buildmap - build a more usable colormap from data in globals struct. */ extern rle_pixel ** buildmap(); /* ( globals, minmap, gamma ) * struct sv_globals * globals; * int minmap; * double gamma; */ /* * rle_getcom - get a specific comment from the image comments. */ extern char * rle_getcom(); /* ( name, globals ) * char * name; * struct sv_globals * globals; */ /* * rle_putcom - put (or replace) a comment into the image comments. */ extern char * rle_putcom(); /* ( value, globals ) * char * value; * struct sv_globals * globals; */ /* * rle_delcom - delete a specific comment from the image comments. */ extern char * rle_delcom(); /* ( name, globals ) * char * name; * struct sv_globals * globals; */ /* * dither globals */ extern int dith_levels; /* target effective number of levels, default = 128 */ extern int dith_np2; /* set non-zero to use non-power_of_2 matrix size */ extern int dith_size; /* effective size of the dither matrix chosen */ extern int rle_get_setup(struct sv_globals *); extern int rle_getrow(struct sv_globals *, rle_pixel **); extern void make_gamma(double gamma, int gammamap[]); kit/image/rlelib.c010064400237450000000000001356341062310344500136570ustar nishidawheel/* * Utah RLE Toolkit library routines. * * Read image support only. * * Cobbled from Utah RLE include and library source files. * * By Graeme Gill * 30/5/90 * */ #include #include #if 0 #include #endif #include #include "image.h" /* need ZFILE definition */ #include "rle.h" /* SUPPRESS 530y */ /* SUPPRESS 558 */ /* SUPPRESS 590 */ #define zeof(zfp) feof((zfp)->stream) #define zclearerr(zfp) clearerr((zfp)->stream) /* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. */ /* * Runsv.h - Definitions for Run Length Encoding. * * Author: Spencer W. Thomas * Computer Science Dept. * University of Utah * Date: Mon Aug 9 1982 * Copyright (c) 1982 Spencer W. Thomas */ #ifndef XTNDRUNSV #define XTNDRUNSV /* * Opcode definitions */ #define LONG 0x40 #define RSkipLinesOp 1 #define RSetColorOp 2 #define RSkipPixelsOp 3 #define RByteDataOp 5 #define RRunDataOp 6 #define REOFOp 7 #define H_CLEARFIRST 0x1 /* clear framebuffer flag */ #define H_NO_BACKGROUND 0x2 /* if set, no bg color supplied */ #define H_ALPHA 0x4 /* if set, alpha channel (-1) present */ #define H_COMMENT 0x8 /* if set, comments present */ struct XtndRsetup { short h_xpos, h_ypos, h_xlen, h_ylen; char h_flags, h_ncolors, h_pixelbits, h_ncmap, h_cmaplen; }; #define SETUPSIZE ((4*2)+5) /* "Old" RLE format magic numbers */ #define RMAGIC ('R' << 8) /* top half of magic number */ #define WMAGIC ('W' << 8) /* black&white rle image */ #define XtndRMAGIC ((short)0xcc52) /* RLE file magic number */ #endif /* XTNDRUNSV */ /* "svfb.h" */ /* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. */ /* * svfb.h - Definitions and a few global variables for svfb. * * Author: Spencer W. Thomas * Computer Science Dept. * University of Utah * Date: Mon Aug 9 1982 * Copyright (c) 1982 Spencer W. Thomas */ /* **************************************************************** * Dispatch table for different output types. */ typedef void sv_fn(); struct sv_dispatch_tab { char *magic; /* magic type flags */ sv_fn *setup, /* startup function */ *skipBlankLines, *setColor, *skipPixels, *newScanLine, *putdat, /* put a set of differing pixels */ *putrn, /* put a run all the same */ *blockHook, /* hook called at start of new */ /* output block */ *putEof; /* write EOF marker (if possible) */ }; struct sv_dispatch_tab sv_DTable[]; /* * These definitions presume the existence of a variable called * "fileptr", declared "long * fileptr". *fileptr should be * initialized to 0 before calling Setup(). * A pointer "globals" declared "struct sv_globals * globals" is also * presumed to exist. */ #define sv_magic (sv_DTable[(int)globals->sv_dispatch].magic) #define Setup() (*sv_DTable[(int)globals->sv_dispatch].setup)(globals) #define SkipBlankLines(n) (*sv_DTable[(int)globals->sv_dispatch].skipBlankLines)(n, globals) #define SetColor(c) (*sv_DTable[(int)globals->sv_dispatch].setColor)(c, globals) #define SkipPixels(n, l, r) (*sv_DTable[(int)globals->sv_dispatch].skipPixels)(n,l,r, globals) #define NewScanLine(flag) (*sv_DTable[(int)globals->sv_dispatch].newScanLine)(flag, globals) #define putdata(buf, len) (*sv_DTable[(int)globals->sv_dispatch].putdat)(buf, len, globals) #define putrun(val, len, f) (*sv_DTable[(int)globals->sv_dispatch].putrn)(val,len,f, globals) #define BlockHook() (*sv_DTable[(int)globals->sv_dispatch].blockHook)(globals) #define PutEof() (*sv_DTable[(int)globals->sv_dispatch].putEof)(globals) /* * States for run detection */ #define DATA 0 #define RUN2 1 #define RUN3 2 #define RUN4 3 #define INRUN -1 /* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. * * Modified at BRL 16-May-88 by Mike Muuss to avoid Alliant STDC desire * to have all "void" functions so declared. */ /* * svfb_global.c - Global variable initialization for svfb routines. * * Author: Spencer W. Thomas * Computer Science Dept. * University of Utah * Date: Thu Apr 25 1985 * Copyright (c) 1985,1986 Spencer W. Thomas */ void RunSetup(), RunSkipBlankLines(), RunSetColor(), RunSkipPixels(), RunNewScanLine(), Runputdata(), Runputrun(), RunputEof(); void DefaultBlockHook(); void NullputEof(); struct sv_dispatch_tab sv_DTable[] = { { " OB", RunSetup, RunSkipBlankLines, RunSetColor, RunSkipPixels, RunNewScanLine, Runputdata, Runputrun, DefaultBlockHook, RunputEof }, }; static int sv_bg_color[3] = { 0, 0, 0 }; struct sv_globals sv_globals = { RUN_DISPATCH, /* dispatch value */ 3, /* 3 colors */ sv_bg_color, /* background color */ 0, /* (alpha) if 1, save alpha channel */ 2, /* (background) 0->just save pixels, */ /* 1->overlay, 2->clear to bg first */ 0, 511, /* (xmin, xmax) X bounds to save */ 0, 479, /* (ymin, ymax) Y bounds to save */ 0, /* ncmap (if != 0, save color map) */ 8, /* cmaplen (log2 of length of color map) */ NULL, /* pointer to color map */ NULL, /* pointer to comment strings */ NULL, /* output file */ { 7 } /* RGB channels only */ /* Can't initialize the union */ }; /* ARGSUSED */ void NullputEof(globals) struct sv_globals * globals; { /* do nothing */ } /* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. * * Modified at BRL 16-May-88 by Mike Muuss to avoid Alliant STDC desire * to have all "void" functions so declared. */ /* * Runsv.c - General purpose Run Length Encoding for svfb. * * Author: Spencer W. Thomas * Computer Science Dept. * University of Utah * Date: Mon Aug 9 1982 * Copyright (c) 1982,1986 Spencer W. Thomas */ /* THIS IS WAY OUT OF DATE. See rle.5. * The output file format is: * * Word 0: A "magic" number. The top byte of the word contains * the letter 'R' or the letter 'W'. 'W' indicates that * only black and white information was saved. The bottom * byte is one of the following: * ' ': Means a straight "box" save, -S flag was given. * 'B': Image saved with background color, clear screen to * background before restoring image. * 'O': Image saved in overlay mode. * * Words 1-6: The structure * { short xpos, * Lower left corner * ypos, * xsize, * Size of saved box * ysize; * char rgb[3]; * Background color * char map; * flag for map presence * } * * If the map flag is non-zero, then the color map will follow as * 3*256 16 bit words, first the red map, then the green map, and * finally the blue map. * * Following the setup information is the Run Length Encoded image. * Each instruction consists of a 4-bit opcode, a 12-bit datum and * possibly one or more following words (all words are 16 bits). The * instruction opcodes are: * * SkipLines (1): The bottom 10 bits are an unsigned number to be added to * current Y position. * * SetColor (2): The datum indicates which color is to be loaded with * the data described by the following ByteData and * RunData instructions. 0->red, 1->green, 2->blue. The * operation also resets the X position to the initial * X (i.e. a carriage return operation is performed). * * SkipPixels (3): The bottom 10 bits are an unsigned number to be * added to the current X position. * * ByteData (5): The datum is one less than the number of bytes of * color data following. If the number of bytes is * odd, a filler byte will be appended to the end of * the byte string to make an integral number of 16-bit * words. The bytes are in PDP-11 order. The X * position is incremented to follow the last byte of * data. * * RunData (6): The datum is one less than the run length. The * following word contains (in its lower 8 bits) the * color of the run. The X position is incremented to * follow the last byte in the run. */ #define UPPER 255 /* anything bigger ain't a byte */ /* Predefine LITTLE_ENDIAN for vax and pdp11 machines */ #if defined(vax) || defined(pdp11) #define LITTLE_ENDIAN #endif /* * Macros to make writing instructions with correct byte order easier. */ union { short s; char c[2]; } arg; #ifdef LITTLE_ENDIAN #define put16(a) arg.s=a,putc(arg.c[0],sv_fd), putc(arg.c[1],sv_fd) #else #define put16(a) arg.s=a,putc(arg.c[1],sv_fd), putc(arg.c[0],sv_fd) #endif /* short instructions */ #define mk_short_1(oper,a1) /* one argument short */ \ putc(oper,sv_fd), putc((char)a1,sv_fd) #define mk_short_2(oper,a1,a2) /* two argument short */ \ putc(oper,sv_fd), putc((char)a1,sv_fd), put16(a2) /* long instructions */ #define mk_long_1(oper,a1) /* one argument long */ \ putc((char)(LONG|oper),sv_fd), putc('\0', sv_fd), put16(a1) #define mk_long_2(oper,a1,a2) /* two argument long */ \ putc((char)(LONG|oper),sv_fd), putc('\0', sv_fd), \ put16(a1), put16(a2) /* choose between long and short format instructions */ /* NOTE: these macros can only be used where a STATEMENT is legal */ #define mk_inst_1(oper,a1) /* one argument inst */ \ if (a1>UPPER) (mk_long_1(oper,a1)); else (mk_short_1(oper,a1)) #define mk_inst_2(oper,a1,a2) /* two argument inst */ \ if (a1>UPPER) (mk_long_2(oper,a1,a2)); else (mk_short_2(oper,a1,a2)) /* * Opcode definitions */ #define RSkipLines(n) mk_inst_1(RSkipLinesOp,(n)) #define RSetColor(c) mk_short_1(RSetColorOp,(c)) /* has side effect of performing */ /* "carriage return" action */ #define RSkipPixels(n) mk_inst_1(RSkipPixelsOp,(n)) #define RNewLine RSkipLines(1) #define RByteData(n) mk_inst_1(RByteDataOp,n) /* followed by ((n+1)/2)*2 bytes */ /* of data. If n is odd, last */ /* byte will be ignored */ /* "cursor" is left at pixel */ /* following last pixel written */ #define RRunData(n,c) mk_inst_2(RRunDataOp,(n),(c)) /* next word contains color data */ /* "cursor" is left at pixel after */ /* end of run */ #define REOF mk_inst_1(REOFOp,0) /* Really opcode only */ /***************************************************************** * TAG(RunSetup) * Put out initial setup data for RLE svfb files. */ void RunSetup(globals) register struct sv_globals * globals; { } /***************************************************************** * TAG(RunSkipBlankLines) * Skip one or more blank lines in the RLE file. */ void RunSkipBlankLines(nblank, globals) register struct sv_globals * globals; { } /***************************************************************** * TAG(RunSetColor) * Select a color and do carriage return. * color: 0 = Red, 1 = Green, 2 = Blue. */ void RunSetColor(c, globals) register struct sv_globals * globals; { } /***************************************************************** * TAG(RunSkipPixels) * Skip a run of background. */ /* ARGSUSED */ void RunSkipPixels(nskip, last, wasrun, globals) register struct sv_globals * globals; { } /***************************************************************** * TAG(RunNewScanLine) * Perform a newline action. Since CR is implied by the Set Color * operation, only generate code if the newline flag is true. */ void RunNewScanLine(flag, globals) register struct sv_globals * globals; { } /***************************************************************** * TAG(Runputdata) * Put one or more pixels of byte data into the output file. */ void Runputdata(buf, n, globals) rle_pixel * buf; register struct sv_globals * globals; { } /***************************************************************** * TAG(Runputrun) * Output a single color run. */ /* ARGSUSED */ void Runputrun(color, n, last, globals) register struct sv_globals * globals; { } /***************************************************************** * TAG(RunputEof) * Output an EOF opcode */ void RunputEof(globals) register struct sv_globals * globals; { } /*ARGSUSED*/ void DefaultBlockHook(globals) struct sv_globals * globals; { } /* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. */ /* * buildmap.c - Build a color map from the RLE file color map. * * Author: Spencer W. Thomas * Computer Science Dept. * University of Utah * Date: Sat Jan 24 1987 * Copyright (c) 1987, University of Utah */ /***************************************************************** * TAG(buildmap) * * Returns a color map that can easily be used to map the pixel values in * an RLE file. Map is built from the color map in the input file. * Inputs: * globals: sv_globals structure containing color map. * minmap: Minimum number of channels in output map. * gamma: Adjust color map for this image gamma value * (1.0 means no adjustment). * Outputs: * Returns an array of pointers to arrays of rle_pixels. The array * of pointers contains max(sv_ncolors, sv_ncmap) elements, each * array of pixels contains 2^sv_cmaplen elements. The pixel arrays * should be considered read-only. * Assumptions: * [None] * Algorithm: * Ensure that there are at least sv_ncolors rows in the map, and * that each has at least 256 elements in it (largest map that can * be addressed by an rle_pixel). */ rle_pixel ** buildmap(globals, minmap, gamma) struct sv_globals *globals; int minmap; double gamma; { rle_pixel ** cmap, * gammap; register int i, j; int maplen, cmaplen, ncmap, nmap; if (globals->sv_ncmap == 0) /* make identity map */ { nmap = (minmap < globals->sv_ncolors) ? globals->sv_ncolors : minmap; cmap = (rle_pixel **)lmalloc(nmap * sizeof(rle_pixel *)); cmap[0] = (rle_pixel *)lmalloc(256 * sizeof(rle_pixel)); for (i = 0; i < 256; i++) cmap[0][i] = i; for (i = 1; i < nmap; i++) cmap[i] = cmap[0]; maplen = 256; ncmap = 1; /* number of unique rows */ } else /* make map from globals */ { /* Map is at least 256 long */ cmaplen = (1 << globals->sv_cmaplen); if (cmaplen < 256) maplen = 256; else maplen = cmaplen; if (globals->sv_ncmap == 1) /* make "b&w" map */ { nmap = (minmap < globals->sv_ncolors) ? globals->sv_ncolors : minmap; cmap = (rle_pixel **)lmalloc(nmap * sizeof(rle_pixel *)); cmap[0] = (rle_pixel *)lmalloc(maplen * sizeof(rle_pixel)); for (i = 0; i < maplen; i++) if (i < cmaplen) cmap[0][i] = globals->sv_cmap[i] >> 8; else cmap[0][i] = i; for (i = 1; i < nmap; i++) cmap[i] = cmap[0]; ncmap = 1; } else if (globals->sv_ncolors <= globals->sv_ncmap) { nmap = (minmap < globals->sv_ncmap) ? globals->sv_ncmap : minmap; cmap = (rle_pixel **)lmalloc(nmap * sizeof(rle_pixel *)); for (j = 0; j < globals->sv_ncmap; j++) { cmap[j] = (rle_pixel *)lmalloc(maplen * sizeof(rle_pixel)); for (i = 0; i < maplen; i++) if (i < cmaplen) cmap[j][i] = globals->sv_cmap[j*cmaplen + i] >> 8; else cmap[j][i] = i; } for (i = j, j--; i < nmap; i++) cmap[i] = cmap[j]; ncmap = globals->sv_ncmap; } else /* ncolors > ncmap */ { nmap = (minmap < globals->sv_ncolors) ? globals->sv_ncolors : minmap; cmap = (rle_pixel **)lmalloc(nmap * sizeof(rle_pixel *)); for (j = 0; j < globals->sv_ncmap; j++) { cmap[j] = (rle_pixel *)lmalloc(maplen * sizeof(rle_pixel)); for (i = 0; i < maplen; i++) if (i < cmaplen) cmap[j][i] = globals->sv_cmap[j*cmaplen + i] >> 8; else cmap[j][i] = i; } for(i = j, j--; i < nmap; i++) cmap[i] = cmap[j]; ncmap = globals->sv_ncmap; } } /* Gamma compensate if requested */ if (gamma != 1.0) { gammap = (rle_pixel *)lmalloc(256 * sizeof(rle_pixel)); for (i = 0; i < 256; i++) { #ifdef BYTEBUG int byteb1; byteb1 = (int)(0.5 + 255.0 * pow(i / 255.0, gamma)); gammap[i] = byteb1; #else gammap[i] = (int)(0.5 + 255.0 * pow(i / 255.0, gamma)); #endif } for (i = 0; i < ncmap; i++) for (j = 0; j < maplen; j++) cmap[i][j] = gammap[cmap[i][j]]; } return cmap; } /* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. */ /* * rle_getcom.c - Get specific comments from globals structure. * * Author: Spencer W. Thomas * Computer Science Dept. * University of Utah * Date: Sun Jan 25 1987 * Copyright (c) 1987, University of Utah */ /***************************************************************** * TAG(match) * * Match a name against a test string for "name=value" or "name". * If it matches name=value, return pointer to value part, if just * name, return pointer to NUL at end of string. If no match, return NULL. * * Inputs: * n: Name to match. May also be "name=value" to make it easier * to replace comments. * v: Test string. * Outputs: * Returns pointer as above. * Assumptions: * [None] * Algorithm: * [None] */ static char * match(n, v) register char *n; register char *v; { for (; *n != '\0' && *n != '=' && *n == *v; n++, v++) ; if (*n == '\0' || *n == '=') { if (*v == '\0') return v; else if (*v == '=') return ++v; } return NULL; } /***************************************************************** * TAG(rle_getcom) * * Return a pointer to the value part of a name=value pair in the comments. * Inputs: * name: Name part of the comment to search for. * globals: sv_globals structure. * Outputs: * Returns pointer to value part of comment or NULL if no match. * Assumptions: * [None] * Algorithm: * [None] */ char * rle_getcom(name, globals) char *name; struct sv_globals *globals; { char ** cp; char * v; if (globals->sv_comments == NULL) return NULL; for (cp = globals->sv_comments; *cp; cp++) if ((v = match(name, *cp)) != NULL) return v; return NULL; } /* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. * * Modified at BRL 16-May-88 by Mike Muuss to avoid Alliant STDC desire * to have all "void" functions so declared. */ /* * rle_getrow.c - Read an RLE file in. * * Author: Spencer W. Thomas * Computer Science Dept. * University of Utah * Date: Wed Apr 10 1985 * Copyright (c) 1985 Spencer W. Thomas * */ /* * Automatically define LITTLE_ENDIAN on vax and pdp11 machines */ #if defined(vax) || defined(pdp11) #define LITTLE_ENDIAN #endif struct inst { unsigned opcode:8, datum:8; }; #define BREAD(type, var, len)\ zread(infile, (byte *)&var,len) #define OPCODE(inst) (inst.opcode & ~LONG) #define LONGP(inst) (inst.opcode & LONG) #define DATUM(inst) (0x00ff & inst.datum) static int debug_f; /* if non-zero, print debug info */ static void bfill(); /***************************************************************** * TAG(rle_get_setup) * * Read the initialization information from an RLE file. * Inputs: * globals: Contains pointer to the input file. * Outputs: * globals: Initialized with information from the * input file. * Returns 0 on success, -1 if the file is not an RLE file, * -2 if malloc of the color map failed, -3 if an immediate EOF * is hit (empty input file), and -4 if an EOF is encountered reading * the setup information. * Assumptions: * infile points to the "magic" number in an RLE file (usually * byte 0 in the file). * Algorithm: * Read in the setup info and fill in sv_globals. */ int rle_get_setup(globals) struct sv_globals * globals; { struct XtndRsetup setup; short magic; /* assume 16 bits */ register ZFILE *infile = globals->svfb_fd; rle_pixel * bg_color; register int i; char * comment_buf; zclearerr(infile); BREAD(short, magic, sizeof magic); SWAB(magic); if (zeof(infile)) return -3; if (magic != XtndRMAGIC) return -1; BREAD(struct XtndRsetup, setup, SETUPSIZE); /* assume VAX packing */ if (zeof(infile)) return -4; SWAB(setup.h_xpos); SWAB(setup.h_ypos); SWAB(setup.h_xlen); SWAB(setup.h_ylen); /* Extract information from setup */ globals->sv_ncolors = setup.h_ncolors; for (i = 0; i < globals->sv_ncolors; i++) SV_SET_BIT(*globals, i); if (!(setup.h_flags & H_NO_BACKGROUND)) { globals->sv_bg_color = (int *)lmalloc( (unsigned)(sizeof(int) * setup.h_ncolors)); bg_color = (rle_pixel *)lmalloc( (unsigned)(1 + (setup.h_ncolors / 2) * 2)); zread(infile, (byte *)bg_color, 1 + (setup.h_ncolors / 2) * 2); for (i = 0; i < setup.h_ncolors; i++) globals->sv_bg_color[i] = bg_color[i]; lfree(bg_color); } else zgetc(infile); /* skip filler byte */ if (setup.h_flags & H_NO_BACKGROUND) globals->sv_background = 0; else if (setup.h_flags & H_CLEARFIRST) globals->sv_background = 2; else globals->sv_background = 1; if (setup.h_flags & H_ALPHA) { globals->sv_alpha = 1; SV_SET_BIT(*globals, SV_ALPHA); } else globals->sv_alpha = 0; globals->sv_xmin = setup.h_xpos; globals->sv_ymin = setup.h_ypos; globals->sv_xmax = globals->sv_xmin + setup.h_xlen - 1; globals->sv_ymax = globals->sv_ymin + setup.h_ylen - 1; globals->sv_ncmap = setup.h_ncmap; globals->sv_cmaplen = setup.h_cmaplen; if (globals->sv_ncmap > 0) { register int maplen = globals->sv_ncmap * (1 << globals->sv_cmaplen); globals->sv_cmap = (rle_map *)lmalloc( (unsigned)(sizeof(rle_map) * maplen)); if (globals->sv_cmap == NULL) { fprintf(stderr, "Malloc failed for color map of size %d*%d in rle_get_setup\n", globals->sv_ncmap, (1 << globals->sv_cmaplen)); return -2; } zread(infile, (byte *)globals->sv_cmap, sizeof(short) * maplen); #ifndef LITTLE_ENDIAN /* Swap bytes on bigendian machines */ for (i = 0; i < maplen; i++) SWAB(globals->sv_cmap[i]); #endif } /* Check for comments */ if (setup.h_flags & H_COMMENT) { short comlen, evenlen; register char * cp; BREAD(short, comlen, sizeof comlen); /* get comment length */ SWAB(comlen); evenlen = (comlen + 1) & ~1; /* make it even */ comment_buf = (char *)lmalloc((unsigned) evenlen); if (comment_buf == NULL) { fprintf(stderr, "Malloc failed for comment buffer of size %d in rle_get_setup\n", comlen); return -2; } zread(infile, (byte *)comment_buf, evenlen); /* Count the comments */ for (i = 0, cp = comment_buf; cp < comment_buf + comlen; cp++) if (*cp == 0) i++; i++; /* extra for NULL pointer at end */ /* Get space to put pointers to comments */ globals->sv_comments = (char **)lmalloc((unsigned)(i * sizeof(char *))); if (globals->sv_comments == NULL) { fprintf(stderr, "Malloc failed for %d comment pointers in rle_get_setup\n", i); return -2; } /* Get pointers to the comments */ *globals->sv_comments = comment_buf; for (i = 1, cp = comment_buf + 1; cp < comment_buf + comlen; cp++) if (*(cp - 1) == 0) globals->sv_comments[i++] = cp; globals->sv_comments[i] = NULL; } else globals->sv_comments = NULL; /* Initialize state for rle_getrow */ globals->sv_private.get.scan_y = globals->sv_ymin; globals->sv_private.get.vert_skip = 0; globals->sv_private.get.is_eof = 0; globals->sv_private.get.is_seek = 0; /* Can't do seek on zfile */ debug_f = 0; if (!zeof(infile)) return 0; /* success! */ else { globals->sv_private.get.is_eof = 1; return -4; } } /***************************************************************** * TAG(rle_get_error) * * Print an error message for the return code from rle_get_setup * Inputs: * code: The return code from rle_get_setup. * pgmname: Name of this program (argv[0]). * fname: Name of the input file. * Outputs: * Prints an error message on standard output. * Returns code. */ int rle_get_error(code, pgmname, fname) int code; char *pgmname; char *fname; { switch(code) { case 0: /* success */ break; case -1: /* Not an RLE file */ fprintf(stderr, "%s: %s is not an RLE file\n", pgmname, fname); break; case -2: /* malloc failed */ fprintf(stderr, "%s: Malloc failed reading header of file %s\n", pgmname, fname); break; case -3: fprintf(stderr, "%s: %s is an empty file\n", pgmname, fname); break; case -4: fprintf(stderr, "%s: RLE header of %s is incomplete (premature EOF)\n", pgmname, fname); break; default: fprintf(stderr, "%s: Error encountered reading header of %s\n", pgmname, fname); break; } return code; } /***************************************************************** * TAG(rle_get_setup_ok) * * Read the initialization information from an RLE file. * Inputs: * globals: Contains pointer to the input file. * prog_name: Program name to be printed in the error message. * file_name: File name to be printed in the error message. * If NULL, the string "stdin" is generated. * Outputs: * globals: Initialized with information from the * input file. * If reading the globals fails, it prints an error message * and exits with the appropriate status code. * Algorithm: * sv_get_setup does all the work. */ void rle_get_setup_ok(globals, prog_name, file_name) struct sv_globals * globals; char *prog_name; char *file_name; { int code; if (! file_name) file_name = "stdin"; code = rle_get_error(rle_get_setup(globals), prog_name, file_name); if (code) cleanup(-1); } /***************************************************************** * TAG(rle_debug) * * Turn RLE debugging on or off. * Inputs: * on_off: if 0, stop debugging, else start. * Outputs: * Sets internal debug flag. * Assumptions: * [None] * Algorithm: * [None] */ void rle_debug(on_off) int on_off; { debug_f = on_off; } /***************************************************************** * TAG(rle_getrow) * * Get a scanline from the input file. * Inputs: * globals: sv_globals structure containing information about * the input file. * Outputs: * scanline: an array of pointers to the individual color * scanlines. Scanline is assumed to have * globals->sv_ncolors pointers to arrays of rle_pixel, * each of which is at least globals->sv_xmax+1 long. * Returns the current scanline number. * Assumptions: * rle_get_setup has already been called. * Algorithm: * If a vertical skip is being executed, and clear-to-background is * specified (globals->sv_background is true), just set the * scanlines to the background color. If clear-to-background is * not set, just increment the scanline number and return. * * Otherwise, read input until a vertical skip is encountered, * decoding the instructions into scanline data. */ int rle_getrow(globals, scanline) struct sv_globals * globals; rle_pixel *scanline[]; { register rle_pixel * scanc; register int nc; register ZFILE *infile = globals->svfb_fd; int scan_x = globals->sv_xmin, /* current X position */ channel = 0; /* current color channel */ short word, long_data; struct inst inst; /* Clear to background if specified */ if (globals->sv_background == 2) { if (globals->sv_alpha && SV_BIT(*globals, -1)) bfill((char *)scanline[-1], globals->sv_xmax + 1, 0); for (nc = 0; nc < globals->sv_ncolors; nc++) if (SV_BIT(*globals, nc)) bfill((char *)scanline[nc], globals->sv_xmax+1, globals->sv_bg_color[nc]); } /* If skipping, then just return */ if (globals->sv_private.get.vert_skip > 0) { globals->sv_private.get.vert_skip--; globals->sv_private.get.scan_y++; if (globals->sv_private.get.vert_skip > 0) return globals->sv_private.get.scan_y; } /* If EOF has been encountered, return also */ if (globals->sv_private.get.is_eof) return ++globals->sv_private.get.scan_y; /* Otherwise, read and interpret instructions until a skipLines * instruction is encountered. */ if (SV_BIT(*globals, channel)) scanc = scanline[channel] + scan_x; else scanc = NULL; for (;;) { BREAD(struct inst, inst, 2); if (zeof(infile)) { globals->sv_private.get.is_eof = 1; break; /* <--- one of the exits */ } switch(OPCODE(inst)) { case RSkipLinesOp: if (LONGP(inst)) { BREAD(short, long_data, sizeof long_data); SWAB(long_data); globals->sv_private.get.vert_skip = long_data; } else globals->sv_private.get.vert_skip = DATUM(inst); if (debug_f) fprintf(stderr, "Skip %d Lines (to %d)\n", globals->sv_private.get.vert_skip, globals->sv_private.get.scan_y + globals->sv_private.get.vert_skip); break; /* need to break for() here, too */ case RSetColorOp: channel = DATUM(inst); /* select color channel */ if (channel == 255) channel = -1; scan_x = globals->sv_xmin; if (SV_BIT(*globals, channel)) scanc = scanline[channel]+scan_x; if (debug_f) fprintf(stderr, "Set color to %d (reset x to %d)\n", channel, scan_x); break; case RSkipPixelsOp: if (LONGP(inst)) { BREAD(short, long_data, sizeof long_data); SWAB(long_data); scan_x += long_data; scanc += long_data; if (debug_f) fprintf(stderr, "Skip %d pixels (to %d)\n", long_data, scan_x); } else { scan_x += DATUM(inst); scanc += DATUM(inst); if (debug_f) fprintf(stderr, "Skip %d pixels (to %d)\n", DATUM(inst), scan_x); } break; case RByteDataOp: if (LONGP(inst)) { BREAD(short, long_data, sizeof long_data); SWAB(long_data); nc = (int)long_data; } else nc = DATUM(inst); nc++; if (SV_BIT(*globals, channel)) { zread(infile, (byte *)scanc, nc); if (nc & 1) (void)zgetc(infile); /* throw away odd byte */ } else { /* Emulate a forward fseek */ register int ii; for (ii = ((nc + 1) / 2) * 2; ii > 0; ii--) (void) zgetc(infile); /* discard it */ } scanc += nc; scan_x += nc; if (debug_f) { if (SV_BIT(*globals, channel)) { rle_pixel * cp = scanc - nc; fprintf(stderr, "Pixel data %d (to %d):", nc, scan_x); for (; nc > 0; nc--) fprintf(stderr, "%02x", *cp++); putc('\n', stderr); } } else { fprintf(stderr, "Pixel data %d (to %d)\n", nc, scan_x); } break; case RRunDataOp: if (LONGP(inst)) { BREAD(short, long_data, sizeof long_data); SWAB(long_data); nc = long_data; } else nc = DATUM(inst); scan_x += nc + 1; BREAD(short, word, sizeof(short)); SWAB(word); if (debug_f) fprintf(stderr, "Run length %d (to %d), data %02x\n", nc + 1, scan_x, word); if (SV_BIT(*globals, channel)) { if (nc >= 10) /* break point for 785, anyway */ { bfill((char *)scanc, nc + 1, word); scanc += nc + 1; } else for (; nc >= 0; nc--, scanc++) *scanc = word; } break; case REOFOp: globals->sv_private.get.is_eof = 1; break; default: fprintf(stderr, "rle_getrow: Unrecognized opcode: %d\n", inst.opcode); cleanup(-1); } if (OPCODE(inst) == RSkipLinesOp || OPCODE(inst) == REOFOp) break; /* <--- the other loop exit */ } return globals->sv_private.get.scan_y; } /* Fill buffer at s with n copies of character c. N must be <= 65535*/ /* ARGSUSED */ static void bfill(s, n, c) char *s; int n, c; { #ifdef vax asm(" movc5 $0,*4(ap),12(ap),8(ap),*4(ap)"); #else while (n-- > 0) *s++ = c; #endif } /* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. * * Modified at BRL 16-May-88 by Mike Muuss to avoid Alliant STDC desire * to have all "void" functions so declared. * * Modified to generate an apropriate size dither map (ie 2x2, 4x4, 8x8 * or 16x16) rather than use fixed 16x16 map. Use a large enough map * to give a minimum of 128 effective levels rather than aiming for 256. * This should give less grainy pictures. * Two global variables can modify this: * dith_levels = 128 (default) * dith_np2 = 0 (default). Nonzero to enable non power of 2 dither mapping. * dith_size = actual dither matrix size chosen. * * Graeme Gill 3 June 88 */ /* * dither.c - Functions for RGB color dithering. * * Author: Spencer W. Thomas * Computer Science Dept. * University of Utah * Date: Mon Feb 2 1987 * Copyright (c) 1987, University of Utah */ void make_square(); /* dither globals */ int dith_levels = 128; int dith_np2 = 0; int dith_size = 16; /* basic dithering macro */ #define DMAP(v,x,y) (modN[v]>magic[x][y] ? divN[v] + 1 : divN[v]) /***************************************************************** * TAG(dithermap) * * Create a color dithering map with a specified number of intensity levels. * Inputs: * levels: Intensity levels per primary. * gamma: Display gamma value. * Outputs: * rgbmap: Generated color map. * divN: "div" function for dithering. * modN: "mod" function for dithering. * Assumptions: * rgbmap will hold levels^3 entries. * Algorithm: * Compute gamma compensation map. * N = 255.0 / (levels - 1) is number of pixel values per level. * Compute rgbmap with red ramping fastest, green slower, and blue * slowest (treat it as if it were rgbmap[levels][levels][levels][3]). * Call make_square to get divN, modN, and magic * * Note: * Call dithergb(x, y, r, g, b, levels, divN, modN, magic) to get index * into rgbmap for a given color/location pair, or use * row = y % 16; col = x % 16; * DMAP(v,col,row) =def (divN[v] + (modN[v]>magic[col][row] ? 1 : 0)) * DMAP(r,col,row) + DMAP(g,col,row)*levels + DMAP(b,col,row)*levels^2 * if you don't want function call overhead. */ void dithermap(levels, gamma, rgbmap, divN, modN, magic) double gamma; int rgbmap[][3]; int divN[256]; int modN[256]; int magic[16][16]; { double N; register int i; int levelsq, levelsc; int gammamap[256]; make_gamma(gamma,gammamap); levelsq = levels*levels; /* squared */ levelsc = levels*levelsq; /* and cubed */ N = 255.0 / (levels - 1); /* Get size of each step */ /* * Set up the color map entries. */ for(i = 0; i < levelsc; i++) { rgbmap[i][0] = gammamap[(int)(0.5 + (i%levels) * N)]; rgbmap[i][1] = gammamap[(int)(0.5 + ((i/levels)%levels) * N)]; rgbmap[i][2] = gammamap[(int)(0.5 + ((i/levelsq)%levels) * N)]; } make_square(N, divN, modN, magic); } /***************************************************************** * TAG(bwdithermap) * * Create a color dithering map with a specified number of intensity levels. * Inputs: * levels: Intensity levels. * gamma: Display gamma value. * Outputs: * bwmap: Generated black & white map. * divN: "div" function for dithering. * modN: "mod" function for dithering. * Assumptions: * bwmap will hold levels entries. * Algorithm: * Compute gamma compensation map. * N = 255.0 / (levels - 1) is number of pixel values per level. * Compute bwmap for levels entries. * Call make_square to get divN, modN, and magic. * Note: * Call ditherbw(x, y, val, divN, modN, magic) to get index into * bwmap for a given color/location pair, or use * row = y % 16; col = x % 16; * divN[val] + (modN[val]>magic[col][row] ? 1 : 0) * if you don't want function call overhead. * On a 1-bit display, use * divN[val] > magic[col][row] ? 1 : 0 */ void bwdithermap(levels, gamma, bwmap, divN, modN, magic) double gamma; int bwmap[]; int divN[256]; int modN[256]; int magic[16][16]; { double N; register int i; int gammamap[256]; make_gamma(gamma,gammamap); N = 255.0 / (levels - 1); /* Get size of each step */ /* * Set up the color map entries. */ for(i = 0; i < levels; i++) bwmap[i] = gammamap[(int)(0.5 + i * N)]; make_square(N, divN, modN, magic); } int magic16x16[16][16] = { {0,128,32,160,8,136,40,168,2,130,34,162,10,138,42,170}, {192,64,224,96,200,72,232,104,194,66,226,98,202,74,234,106}, {48,176,16,144,56,184,24,152,50,178,18,146,58,186,26,154}, {240,112,208,80,248,120,216,88,242,114,210,82,250,122,218,90}, {12,140,44,172,4,132,36,164,14,142,46,174,6,134,38,166}, {204,76,236,108,196,68,228,100,206,78,238,110,198,70,230,102}, {60,188,28,156,52,180,20,148,62,190,30,158,54,182,22,150}, {252,124,220,92,244,116,212,84,254,126,222,94,246,118,214,86}, {3,131,35,163,11,139,43,171,1,129,33,161,9,137,41,169}, {195,67,227,99,203,75,235,107,193,65,225,97,201,73,233,105}, {51,179,19,147,59,187,27,155,49,177,17,145,57,185,25,153}, {243,115,211,83,251,123,219,91,241,113,209,81,249,121,217,89}, {15,143,47,175,7,135,39,167,13,141,45,173,5,133,37,165}, {207,79,239,111,199,71,231,103,205,77,237,109,197,69,229,101}, {63,191,31,159,55,183,23,151,61,189,29,157,53,181,21,149}, {255,127,223,95,247,119,215,87,253,125,221,93,245,117,213,85} }; /***************************************************************** * TAG(make_magic) * * Create the magic square. * Inputs: * size: Order of the square * magic: Address of 16 x 16 magic square. * Outputs: * Fills in the 16 x 16 magic square. * Assumptions: * size is between 2 and 16 * Algorithm: * Chose sub cell of 16 by 16 magic square */ static void make_magic(size, magic) int size; int magic[16][16]; { int j,i,li,bi,bx=0,by=0; int xx,yy; int total; total = size * size; i = 0; li = -1; for(j=0;jli && magic16x16[xx][yy] < bi) { bx = xx; by = yy; bi = magic16x16[xx][yy]; } } } magic[bx][by] = i; i++; li = bi; } } /***************************************************************** * TAG(make_square) * * Build the magic square for a given number of levels. * Inputs: * N: Pixel values per level (255.0 / (levels-1)). * (global) dith_levels = 128 (default) - number of effective levels to aim for * (global) dith_np2 = 0 (default) - non-zero if non power of two size is permissable. * Outputs: * divN: Integer value of pixval / N * modN: Integer remainder between pixval and divN[pixval]*N * magic: Magic square for dithering to N sublevels. * (global) dith_size = magic square size chosen. * Assumptions: * * Algorithm: * divN[pixval] = (int)(pixval / N) maps pixval to its appropriate level. * modN[pixval] = pixval - (int)(N * divN[pixval]) maps pixval to * its sublevel, and is used in the dithering computation. */ void make_square(N, divN, modN, magic) double N; int divN[256]; int modN[256]; int magic[16][16] ; { register int i, j, k, l; double magicfact; for (i = 0; i < 256; i++) { divN[i] = (int)(i / N); modN[i] = i - (int)(N * divN[i]); } modN[255] = 0; /* always */ /* figure out how big a square will give */ /* the desired number of levels */ if(dith_np2) for(dith_size= 2;((dith_size * dith_size)+1)<((N*dith_levels)/256);dith_size++); else for(dith_size= 2;((dith_size * dith_size)+1)<((N*dith_levels)/256);dith_size *=2); /* make the basic square up */ /* (will have numbers 0 - size * size) */ make_magic(dith_size,magic); /* divN gives 0 - levels-1 */ /* modN gives 0 - N-1 */ /* dither is if(modN(pix) > magic[][] so */ /* scale magic it to have levels 0 to N-2 */ /* (ie takes account of magic square size allows size * size +1 levels */ magicfact = (N-2)/((double)((dith_size * dith_size)-1)); for(i=0;i0?0:dith_size;l<16;l += dith_size) { for(i=0;ititle) sprintf(buf, "%s (rotated by %d degrees)", simage->title, degrees); image1 = simage; do { degrees -= 90; switch (image1->type) { case IBITMAP: image2= newBitImage(image1->height, image1->width); for (x= 0; x < image1->rgb.used; x++) { *(image2->rgb.red + x)= *(image1->rgb.red + x); *(image2->rgb.green + x)= *(image1->rgb.green + x); *(image2->rgb.blue + x)= *(image1->rgb.blue + x); } slinelen= (image1->width / 8) + (image1->width % 8 ? 1 : 0); sp = image1->data; dp = image2->data; for (i = 0; i < (slinelen * image1->height); i++) for (b = 0; b < 8; b++) if (sp[i] & bit[b]) { rotate_bitmap(i, b, image1->width, image1->height, &newi, &newb); dp[newi] |= bit[newb]; } break; case IRGB: image2= newRGBImage(image1->height, image1->width, image1->depth); for (x= 0; x < image1->rgb.used; x++) { *(image2->rgb.red + x)= *(image1->rgb.red + x); *(image2->rgb.green + x)= *(image1->rgb.green + x); *(image2->rgb.blue + x)= *(image1->rgb.blue + x); } image2->rgb.used= image1->rgb.used; /* FALLTHRU */ case ITRUE: if (TRUEP(image1)) image2= newTrueImage(image1->height, image1->width); /* build array of y axis ptrs into destination image */ yptr= (byte **)lmalloc(image1->width * sizeof(char *)); dlinelen= image1->height * image1->pixlen; for (y= 0; y < image1->width; y++) yptr[y]= image2->data + (y * dlinelen); /* rotate */ sp= image1->data; for (y = 0; y < image1->height; y++) for (x = 0; x < image1->width; x++) { valToMem(memToVal(sp, image1->pixlen), yptr[x] + ((image1->height - y - 1) * image1->pixlen), image1->pixlen); sp += image1->pixlen; } lfree(yptr); break; default: fprintf(stderr, "rotate: Unsupported image type\n"); cleanup(-1); } if (image1 != simage) freeImage(image1); image1 = image2; } while (degrees); image1->title= dupString(buf); if (verbose) fprintf(stderr, "done\n"); return(image1); } kit/image/send.c010064400237450000000000000423401062310351400133230ustar nishidawheel/* send.c: * * send an Image to an X pixmap * * jim frost 10.02.89 * * Copyright 1989, 1990, 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #define XLIB_ILLEGAL_ACCESS #include "copyright.h" #include "../mgp.h" #if 0 #include "xloadimage.h" #endif static int GotError; static int pixmapErrorTrap(disp, pErrorEvent) Display *disp; XErrorEvent * pErrorEvent; { #define MAXERRORLEN 100 char buf[MAXERRORLEN+1]; GotError = 1; XGetErrorText(disp, pErrorEvent->error_code, buf, MAXERRORLEN); fprintf(stderr, "serial #%d (request code %d) Got Error %s\n", (int) pErrorEvent->serial, pErrorEvent->request_code, buf); return(0); } Pixmap ximageToPixmap(disp, parent, ximageinfo) Display *disp; Window parent; XImageInfo *ximageinfo; { int (*old_handler)(); Pixmap pixmap; GotError = 0; old_handler = XSetErrorHandler(pixmapErrorTrap); XSync(disp, False); pixmap= XCreatePixmap(disp, parent, ximageinfo->ximage->width, ximageinfo->ximage->height, ximageinfo->depth); (void)XSetErrorHandler(old_handler); if (GotError) return(None); ximageinfo->drawable= pixmap; sendXImage(ximageinfo, 0, 0, 0, 0, ximageinfo->ximage->width, ximageinfo->ximage->height); return(pixmap); } /* find the best pixmap depth supported by the server for a particular * visual and return that depth. * * this is complicated by R3's lack of XListPixmapFormats so we fake it * by looking at the structure ourselves. */ static unsigned int bitsPerPixelAtDepth(disp, scrn, depth) Display *disp; int scrn; unsigned int depth; { #if 1 /* the way things are */ unsigned int a; for (a= 0; a < disp->nformats; a++) if (disp->pixmap_format[a].depth == depth) return(disp->pixmap_format[a].bits_per_pixel); #else /* the way things should be */ XPixmapFormatValues *xf; unsigned int nxf, a; xf = XListPixmapFormats(disp, &nxf); for (a = 0; a < nxf; a++) if (xf[a].depth == closest_depth) return(disp->pixmap_format[a].bits_per_pixel); #endif /* this should never happen; if it does, we're in trouble */ fprintf(stderr, "bitsPerPixelAtDepth: Can't find pixmap depth info!\n"); cleanup(-1); return (-1); /* To avoid -Wall warnings */ } XImageInfo *imageToXImage(disp, scrn, visual, ddepth, image, private_cmap, fit, back, verbose) Display *disp; int scrn; Visual *visual; /* visual to use */ unsigned int ddepth; /* depth of the visual to use */ Image *image; unsigned int private_cmap; unsigned int fit; unsigned int back; unsigned int verbose; { Pixel *index, *redvalue, *greenvalue, *bluevalue; unsigned int a, b=0, newmap, x, y, linelen, dpixlen, dbits, again_flag=0; XColor xcolor; XGCValues gcv; XImageInfo *ximageinfo; Image *orig_image; goodImage(image, "imageToXimage"); xcolor.flags= DoRed | DoGreen | DoBlue; index= redvalue= greenvalue= bluevalue= NULL; orig_image= image; ximageinfo= (XImageInfo *)lmalloc(sizeof(XImageInfo)); ximageinfo->disp= disp; ximageinfo->scrn= scrn; ximageinfo->depth= 0; ximageinfo->drawable= None; ximageinfo->foreground= ximageinfo->background= 0; ximageinfo->gc= NULL; ximageinfo->ximage= NULL; /* process image based on type of visual we're sending to */ switch (image->type) { case ITRUE: switch (visual->class) { case TrueColor: case DirectColor: /* goody goody */ break; default: if (visual->bits_per_rgb > 1) image= reduce(image, depthToColors(visual->bits_per_rgb), verbose); else image= dither(image, verbose); } break; case IRGB: switch(visual->class) { case TrueColor: case DirectColor: /* no problem, we handle this just fine */ break; default: if (visual->bits_per_rgb < 2) image= dither(image, verbose); break; } case IBITMAP: /* no processing ever needs to be done for bitmaps */ break; } /* do color allocation */ switch (visual->class) { case TrueColor: case DirectColor: if (!BITMAPP(image)) { Pixel pixval; unsigned int redcolors, greencolors, bluecolors; unsigned int redstep, greenstep, bluestep; unsigned int redbottom, greenbottom, bluebottom; unsigned int redtop=0, greentop=0, bluetop=0; redvalue= (Pixel *)lmalloc(sizeof(Pixel) * 256); greenvalue= (Pixel *)lmalloc(sizeof(Pixel) * 256); bluevalue= (Pixel *)lmalloc(sizeof(Pixel) * 256); if (visual == DefaultVisual(disp, scrn)) ximageinfo->cmap= DefaultColormap(disp, scrn); else ximageinfo->cmap= XCreateColormap(disp, RootWindow(disp, scrn), visual, AllocNone); retry_direct: /* tag we hit if a DirectColor allocation fails on * default colormap */ /* calculate number of distinct colors in each band */ redcolors= greencolors= bluecolors= 1; for (pixval= 1; pixval; pixval <<= 1) { if (pixval & visual->red_mask) redcolors <<= 1; if (pixval & visual->green_mask) greencolors <<= 1; if (pixval & visual->blue_mask) bluecolors <<= 1; } /* sanity check */ if ((redcolors > visual->map_entries) || (greencolors > visual->map_entries) || (bluecolors > visual->map_entries)) { fprintf(stderr, "\ Warning: inconsistency in color information (this may be ugly)\n"); } redstep= 256 / redcolors; greenstep= 256 / greencolors; bluestep= 256 / bluecolors; redbottom= greenbottom= bluebottom= 0; for (a= 0; a < visual->map_entries; a++) { if (redbottom < 256) redtop= redbottom + redstep; if (greenbottom < 256) greentop= greenbottom + greenstep; if (bluebottom < 256) bluetop= bluebottom + bluestep; xcolor.red= (redtop - 1) << 8; xcolor.green= (greentop - 1) << 8; xcolor.blue= (bluetop - 1) << 8; if (! XAllocColor(disp, ximageinfo->cmap, &xcolor)) { /* if an allocation fails for a DirectColor default visual then * we should create a private colormap and try again. */ if ((visual->class == DirectColor) && (visual == DefaultVisual(disp, scrn))) { ximageinfo->cmap= XCreateColormap(disp, RootWindow(disp, scrn), visual, AllocNone); goto retry_direct; } /* something completely unexpected happened */ fprintf(stderr, "\ imageToXImage: XAllocColor failed on a TrueColor/Directcolor visual\n"); return(NULL); } /* fill in pixel values for each band at this intensity */ while ((redbottom < 256) && (redbottom < redtop)) redvalue[redbottom++]= xcolor.pixel & visual->red_mask; while ((greenbottom < 256) && (greenbottom < greentop)) greenvalue[greenbottom++]= xcolor.pixel & visual->green_mask; while ((bluebottom < 256) && (bluebottom < bluetop)) bluevalue[bluebottom++]= xcolor.pixel & visual->blue_mask; } break; } default: retry: /* this tag is used when retrying because we couldn't get a fit */ index= (Pixel *)lmalloc(sizeof(Pixel) * image->rgb.used); /* private_cmap flag is invalid if not a dynamic visual */ switch (visual->class) { case StaticColor: case StaticGray: private_cmap= 0; } /* get the colormap to use. */ if (private_cmap) { /* user asked us to use a private cmap */ newmap= 1; fit= 0; } else if ((visual == DefaultVisual(disp, scrn)) || (visual->class == StaticGray) || (visual->class == StaticColor)) { /* if we're using the default visual, try to alloc colors shareable. * otherwise we're using a static visual and should treat it * accordingly. */ if (visual == DefaultVisual(disp, scrn)) ximageinfo->cmap= DefaultColormap(disp, scrn); else ximageinfo->cmap= XCreateColormap(disp, RootWindow(disp, scrn), visual, AllocNone); newmap= 0; /* allocate colors shareable (if we can) */ for (a= 0; a < image->rgb.used; a++) { xcolor.red= *(image->rgb.red + a); xcolor.green= *(image->rgb.green + a); xcolor.blue= *(image->rgb.blue + a); if (! XAllocColor(disp, ximageinfo->cmap, &xcolor)) { if ((visual->class == StaticColor) || (visual->class == StaticGray)) { fprintf(stderr, "imageToXImage: XAllocColor failed on a static visual\n"); return(NULL); } else { /* we can't allocate the colors shareable so free all the colors * we had allocated and create a private colormap (or fit * into the default cmap if `fit' is true). */ XFreeColors(disp, ximageinfo->cmap, index, a, 0); newmap= 1; break; } } *(index + a)= xcolor.pixel; } } else { newmap= 1; fit= 0; } if (newmap) { /* either create a new colormap or fit the image into the one we * have. to create a new one, we create a private cmap and allocate * the colors writable. fitting the colors is harder, we have to: * 1. grab the server so no one can goof with the colormap. * 2. count the available colors using XAllocColorCells. * 3. free the colors we just allocated. * 4. reduce the depth of the image to fit. * 5. allocate the colors again shareable. * 6. ungrab the server and continue on our way. * someone should shoot the people who designed X color allocation. */ if (fit) { if (verbose) fprintf(stderr, " Fitting image into default colormap\n"); XGrabServer(disp); } else { if (verbose) fprintf(stderr, " Using private colormap\n"); /* create new colormap */ if (private_cmap) ximageinfo->cmap= colormap; else ximageinfo->cmap= XCreateColormap(disp, RootWindow(disp, scrn), visual, AllocNone); } again: for (a= 0; a < image->rgb.used; a++) /* count entries we got */ if (! XAllocColorCells(disp, ximageinfo->cmap, False, NULL, 0, index + a, 1)) break; if (fit) { if (a > 0) XFreeColors(disp, ximageinfo->cmap, index, a, 0); if (a <= 2) { if (verbose) { fprintf(stderr, " Cannot fit into default colormap, dithering..."); fflush(stderr); } image= dither(image, 0); if (verbose) fprintf(stderr, "done\n"); fit= 0; lfree(index); goto retry; } } if (a == 0) { if (again_flag == 0){ free_alloc_colors(&image_clr); again_flag = 1; goto again; } else { fprintf(stderr, "imageToXImage: Color allocation failed!\n"); lfree(index); return(NULL); } } if (a < image->rgb.used) image= reduce(image, a, verbose); if (fit) { for (a= 0; a < image->rgb.used; a++) { xcolor.red= *(image->rgb.red + a); xcolor.green= *(image->rgb.green + a); xcolor.blue= *(image->rgb.blue + a); /* if this fails we're in trouble */ if (! XAllocColor(disp, ximageinfo->cmap, &xcolor)) { fprintf(stderr, "XAllocColor failed while fitting colormap!\n"); return(NULL); } *(index + a)= xcolor.pixel; } XUngrabServer(disp); } else { for (b = 0; b < a; b++) { xcolor.pixel= *(index + b); xcolor.red= *(image->rgb.red + b); xcolor.green= *(image->rgb.green + b); xcolor.blue= *(image->rgb.blue + b); XStoreColor(disp, ximageinfo->cmap, &xcolor); } } /* regist free_clr array */ if (private_cmap && ximageinfo->cmap == colormap) { if (back) regist_alloc_colors(&back_clr, index, b); else regist_alloc_colors(&image_clr, index, b); } } break; } /* create an XImage and related colormap based on the image type * we have. */ if (verbose) { fprintf(stderr, " Building XImage..."); fflush(stderr); } switch (image->type) { case IBITMAP: { byte *data; /* we copy the data to be more consistent */ data= lmalloc((image->width + 7) / 8 * image->height); memcpy(data, image->data, ((image->width + 7) / 8) * image->height); gcv.function= GXcopy; ximageinfo->ximage= XCreateImage(disp, visual, 1, XYBitmap, 0, data, image->width, image->height, 8, 0); ximageinfo->depth= ddepth; ximageinfo->foreground= *(index + 1); ximageinfo->background= *index; ximageinfo->ximage->bitmap_bit_order= MSBFirst; ximageinfo->ximage->byte_order= MSBFirst; break; } case IRGB: case ITRUE: /* modify image data to match visual and colormap */ dbits= bitsPerPixelAtDepth(disp, scrn, ddepth); ximageinfo->depth= ddepth; dpixlen= (dbits + 7) / 8; switch (visual->class) { case DirectColor: case TrueColor: { byte *data, *destptr, *srcptr; Pixel pixval, newpixval; ximageinfo->ximage = XCreateImage(disp, visual, ddepth, ZPixmap, 0, NULL, image->width, image->height, 8, 0); data= lmalloc(image->width * image->height * dpixlen); ximageinfo->ximage->data= (char *)data; destptr= data; srcptr= image->data; switch (image->type) { case ITRUE: for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { pixval= memToVal(srcptr, image->pixlen); newpixval= redvalue[TRUE_RED(pixval)] | greenvalue[TRUE_GREEN(pixval)] | bluevalue[TRUE_BLUE(pixval)]; valToMem(newpixval, destptr, dpixlen); srcptr += image->pixlen; destptr += dpixlen; } break; case IRGB: for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { pixval= memToVal(srcptr, image->pixlen); pixval= redvalue[image->rgb.red[pixval] >> 8] | greenvalue[image->rgb.green[pixval] >> 8] | bluevalue[image->rgb.blue[pixval] >> 8]; valToMem(pixval, destptr, dpixlen); srcptr += image->pixlen; destptr += dpixlen; } break; default: /* something's broken */ fprintf(stderr, "Unexpected image type for DirectColor/TrueColor visual!\n"); cleanup(-1); } ximageinfo->ximage->byte_order= MSBFirst; /* trust me, i know what * i'm talking about */ break; } default: /* only IRGB images make it this far. */ /* if our XImage doesn't have modulus 8 bits per pixel, it's unclear * how to pack bits so we instead use an XYPixmap image. this is * slower. */ if (dbits % 8) { byte *data, *destdata, *destptr, *srcptr, mask; Pixel pixmask, pixval; ximageinfo->ximage = XCreateImage(disp, visual, ddepth, XYPixmap, 0, NULL, image->width, image->height, 8, 0); data= (byte *)lmalloc(image->width * image->height * dpixlen); ximageinfo->ximage->data= (char *)data; memset(data, 0, image->width * image->height * dpixlen); ximageinfo->ximage->bitmap_bit_order= MSBFirst; ximageinfo->ximage->byte_order= MSBFirst; linelen= (image->width + 7) / 8; for (a= 0; a < dbits; a++) { pixmask= 1 << a; destdata= data + ((dbits - a - 1) * image->height * linelen); srcptr= image->data; for (y= 0; y < image->height; y++) { destptr= destdata + (y * linelen); *destptr= 0; mask= 0x80; for (x= 0; x < image->width; x++) { pixval= memToVal(srcptr, image->pixlen); srcptr += image->pixlen; if (index[pixval] & pixmask) *destptr |= mask; mask >>= 1; if (mask == 0) { mask= 0x80; destptr++; } } } } } else { byte *data, *srcptr, *destptr; ximageinfo->ximage = XCreateImage(disp, visual, ddepth, ZPixmap, 0, NULL, image->width, image->height, 8, 0); dpixlen= (ximageinfo->ximage->bits_per_pixel + 7) / 8; data= (byte *)lmalloc(image->width * image->height * dpixlen); ximageinfo->ximage->data= (char *)data; ximageinfo->ximage->byte_order= MSBFirst; /* trust me, i know what * i'm talking about */ srcptr= image->data; destptr= data; for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { valToMem(index[memToVal(srcptr, image->pixlen)], destptr, dpixlen); srcptr += image->pixlen; destptr += dpixlen; } } break; } } if (verbose) fprintf(stderr, "done\n"); if (index) lfree((byte *)index); if (redvalue) { lfree((byte *)redvalue); lfree((byte *)greenvalue); lfree((byte *)bluevalue); } if (image != orig_image) freeImage(image); return(ximageinfo); } /* Given an XImage and a drawable, move a rectangle from the Ximage * to the drawable. */ void sendXImage(ximageinfo, src_x, src_y, dst_x, dst_y, w, h) XImageInfo *ximageinfo; int src_x, src_y, dst_x, dst_y; unsigned int w, h; { XGCValues gcv; /* build and cache the GC */ if (!ximageinfo->gc) { gcv.function= GXcopy; if (ximageinfo->ximage->depth == 1) { gcv.foreground= ximageinfo->foreground; gcv.background= ximageinfo->background; ximageinfo->gc= XCreateGC(ximageinfo->disp, ximageinfo->drawable, GCFunction | GCForeground | GCBackground, &gcv); } else ximageinfo->gc= XCreateGC(ximageinfo->disp, ximageinfo->drawable, GCFunction, &gcv); } XPutImage(ximageinfo->disp, ximageinfo->drawable, ximageinfo->gc, ximageinfo->ximage, src_x, src_y, dst_x, dst_y, w, h); } /* free up anything cached in the local Ximage structure. */ void freeXImage(image, ximageinfo) Image *image; XImageInfo *ximageinfo; { if (ximageinfo->gc) XFreeGC(ximageinfo->disp, ximageinfo->gc); lfree((byte *)ximageinfo->ximage->data); ximageinfo->ximage->data= NULL; XDestroyImage(ximageinfo->ximage); lfree((byte *)ximageinfo); } kit/image/smooth.c010064400237450000000000000044320647077536000137260ustar nishidawheel/* smooth.c: * * this performs a smoothing convolution using a 3x3 area. * * jim frost 09.20.90 * * Copyright 1990, 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "image.h" static Image *doSmooth(image) Image *image; { Image *old, *new; int x, y, x1, y1, linelen; int xindex[3]; byte *yindex[3]; byte *destptr; Pixel pixval; unsigned long avgred, avggreen, avgblue; /* build true color image from old image and allocate new image */ old= expand(image); new= newTrueImage(image->width, image->height); if (image->title) { new->title= (char *)lmalloc(strlen(image->title) + 12); sprintf(new->title, "%s (smoothed)", image->title); } /* run through image and take a guess as to what the color should * actually be. */ destptr= new->data; linelen= old->pixlen * old->width; for (y= 0; y < old->height; y++) { yindex[1]= old->data + (y * linelen); yindex[0]= yindex[1] - (y > 0 ? linelen : 0); yindex[2]= yindex[1] + (y < old->height - 1 ? linelen : 0); for (x= 0; x < old->width; x++) { avgred= avggreen= avgblue= 0; xindex[1]= x * old->pixlen; xindex[0]= xindex[1] - (x > 0 ? old->pixlen : 0); xindex[2]= xindex[1] + (x < old->width - 1 ? old->pixlen : 0); for (y1= 0; y1 < 3; y1++) { for (x1= 0; x1 < 3; x1++) { pixval= memToVal(yindex[y1] + xindex[x1], old->pixlen); avgred += TRUE_RED(pixval); avggreen += TRUE_GREEN(pixval); avgblue += TRUE_BLUE(pixval); } } /* average the pixel values */ avgred= ((avgred + 8) / 9); avggreen= ((avggreen + 8) / 9); avgblue= ((avgblue + 8) / 9); pixval= (avgred << 16) | (avggreen << 8) | avgblue; valToMem(pixval, destptr, new->pixlen); destptr += new->pixlen; } } if (old != image) freeImage(old); return(new); } Image *smooth(image, iterations, verbose) Image *image; int verbose; { int a; Image *old, *new; if (verbose) { fprintf(stderr, " Smoothing..."); fflush(stderr); } old= image; for (a= 0; a < iterations; a++) { new= doSmooth(old); if (image != old) freeImage(old); old= new; } if (verbose) fprintf(stderr, "done\n"); return(old); } kit/image/sunraster.c010064400237450000000000000166540664163777400144620ustar nishidawheel/* sunraster.c: * * sun rasterfile image type * * jim frost 09.27.89 * * Copyright 1989, 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "image.h" #include "sunraster.h" /* SUPPRESS 558 */ /* SUPPRESS 560 */ static void babble(name, header) char *name; struct rheader *header; { fprintf(stderr, "%s is a", name); switch (memToVal(header->type, 4)) { case ROLD: fprintf(stderr, "n old-style"); break; case RSTANDARD: fprintf(stderr, " standard"); break; case RRLENCODED: fprintf(stderr, " run-length encoded"); break; case RRGB: fprintf(stderr, " RGB"); /* RGB format instead of BGR */ break; case RTIFF: fprintf(stderr, " TIFF"); break; case RIFF: fprintf(stderr, " RIFF"); break; default: fprintf(stderr, " unknown-type"); } fprintf(stderr, " %ldx%ld", memToVal(header->width, 4), memToVal(header->height, 4)); switch (memToVal(header->depth, 4)) { case 1: fprintf(stderr, " monochrome"); break; case 8: fprintf(stderr, " 8 plane %s", memToVal(header->maplen, 4) > 0 ? "color" : "greyscale"); break; case 24: fprintf(stderr, " 24 plane color"); break; case 32: /* isn't it nice how the sunraster.h file doesn't bother to mention that * 32-bit depths are allowed? */ fprintf(stderr, " 32 plane color"); break; } fprintf(stderr, " Sun rasterfile\n"); } int sunRasterIdent(fullname, name) char *fullname, *name; { ZFILE *zf; struct rheader header; int r; if (! (zf= zopen(fullname))) { perror("sunRasterIdent"); return(0); } switch (zread(zf, (byte *)&header, sizeof(struct rheader))) { case -1: perror("sunRasterIdent"); r= 0; break; case sizeof(struct rheader): if (memToVal(header.magic, 4) != RMAGICNUMBER) { r= 0; break; } babble(name, &header); r= 1; break; default: r= 0; break; } zclose(zf); return(r); } /* read either rl-encoded or normal image data */ static void sunread(zf, buf, len, enc) ZFILE *zf; byte *buf; unsigned int len; unsigned int enc; /* true if encoded file */ { static byte repchar, remaining= 0; /* rl-encoded read */ if (enc) { while (len--) if (remaining) { remaining--; *(buf++)= repchar; } else { if (zread(zf, &repchar, 1) != 1) { fprintf(stderr, "sunRasterLoad: Bad read on image data\n"); cleanup(-1); } if (repchar == RESC) { if (zread(zf, &remaining, 1) != 1) { fprintf(stderr, "sunRasterLoad: Bad read on image data\n"); cleanup(-1); } if (remaining == 0) *(buf++)= RESC; else { if (zread(zf, &repchar, 1) != 1) { fprintf(stderr, "sunRasterLoad: Bad read on image data\n"); cleanup(-1); } *(buf++)= repchar; } } else *(buf++)= repchar; } } /* normal read */ else { if (zread(zf, buf, len) < len) { fprintf(stderr, "sunRasterLoad: Bad read on image data\n"); cleanup(-1); } } } Image *sunRasterLoad(fullname, name, verbose) char *fullname, *name; unsigned int verbose; { ZFILE *zf; struct rheader header; unsigned int mapsize; byte *map; byte *mapred, *mapgreen, *mapblue; unsigned int depth; unsigned int linelen; /* length of raster line in bytes */ unsigned int fill; /* # of fill bytes per raster line */ unsigned int enc; byte fillchar; Image *image=NULL; byte *lineptr; unsigned int x, y; if (! (zf= zopen(fullname))) { perror("sunRasterLoad"); return(NULL); } switch (zread(zf, (byte *)&header, sizeof(struct rheader))) { case -1: perror("sunRasterLoad"); zclose(zf); cleanup(-1); case sizeof(struct rheader): if (memToVal(header.magic, 4) != RMAGICNUMBER) { zclose(zf); return(NULL); } if (verbose) babble(name, &header); break; default: zclose(zf); return(NULL); } znocache(zf); /* turn off caching; we don't need it anymore */ /* get an image to put the data in */ depth= memToVal(header.depth, 4); switch(depth) { case 1: image= newBitImage(memToVal(header.width, 4), memToVal(header.height, 4)); break; case 8: image= newRGBImage(memToVal(header.width, 4), memToVal(header.height, 4), memToVal(header.depth, 4)); break; case 24: case 32: image= newTrueImage(memToVal(header.width, 4), memToVal(header.height, 4), memToVal(header.depth, 4)); break; default: fprintf(stderr, "sunRasterLoad: Bad depth %d (only 1, 8, 24 are valid)\n", depth); cleanup(-1); } /* set up the colormap */ if (depth == 1) linelen= (image->width / 8) + (image->width % 8 ? 1 : 0); else linelen= image->width * image->pixlen; fill= (linelen % 2 ? 1 : 0); /* * Handle color... */ if ((mapsize = memToVal(header.maplen, 4))) { map= lmalloc(mapsize); if (zread(zf, map, mapsize) < mapsize) { fprintf(stderr, "sunRasterLoad: Bad read on colormap\n"); cleanup(-1); } mapsize /= 3; mapred= map; mapgreen= mapred + mapsize; mapblue= mapgreen + mapsize; if (image->rgb.size == 0) newRGBMapData(&image->rgb, mapsize); for (y= 0; y < mapsize; y++) { *(image->rgb.red + y)= (*(mapred++) << 8); *(image->rgb.green + y)= (*(mapgreen++) << 8); *(image->rgb.blue + y)= (*(mapblue++) << 8); } lfree(map); image->rgb.used= mapsize; } /* * Handle 8-bit greyscale via a simple ramp function... */ else if (depth == 8) { mapsize = 256*3; map= lmalloc(mapsize); for (y = 0; y < 256; y += 1) { map[y] = map[256+y] = map[2*256+y] = y; } mapsize /= 3; mapred= map; mapgreen= mapred + mapsize; mapblue= mapgreen + mapsize; if (image->rgb.size == 0) newRGBMapData(&image->rgb, mapsize); for (y= 0; y < mapsize; y++) { *(image->rgb.red + y)= (*(mapred++) << 8); *(image->rgb.green + y)= (*(mapgreen++) << 8); *(image->rgb.blue + y)= (*(mapblue++) << 8); } lfree(map); image->rgb.used= mapsize; } /* 24-bit and 32-bit handle themselves. currently we don't support * a colormap for them. */ enc= (memToVal(header.type, 4) == RRLENCODED); lineptr= image->data; /* if it's a 32-bit image, we read the line and then strip off the * top byte of each pixel to get truecolor format */ if (depth >= 24) { byte *buf, *bp; buf= lmalloc(image->width * (depth == 24 ? 3 : 4)); for (y= 0; y < image->height; y++) { sunread(zf, buf, image->width * (depth == 24 ? 3 : 4), enc); bp= buf; if (depth == 24) { for (x= 0; x < image->width; x++) { *(lineptr++)= *(bp + 2); /* red */ *(lineptr++)= *(bp + 1); /* green */ *(lineptr++)= *bp; /* blue */ bp += 3; } } else { for (x= 0; x < image->width; x++) { *(lineptr++)= *(bp + 3); /* red */ *(lineptr++)= *(bp + 2); /* green */ *(lineptr++)= *(bp + 1); /* blue */ bp += 4; } } if (fill) sunread(zf, &fillchar, fill, enc); } lfree(buf); } else { for (y= 0; y < image->height; y++) { sunread(zf, lineptr, linelen, enc); lineptr += linelen; if (fill) sunread(zf, &fillchar, fill, enc); } } zclose(zf); image->title= dupString(name); return(image); } kit/image/sunraster.h010064400237450000000000000034310642466043000144340ustar nishidawheel/* sunraster.h * * this describes the header for Sun rasterfiles. if you have SunOS, a * better description is in /usr/include/rasterfile.h. this is used * instead to improve portability and to avoid distribution problems. * * Copyright 1989 Jim Frost. See included file "copyright.h" for complete * copyright information. */ #include "copyright.h" struct rheader { unsigned char magic[4]; /* magic number */ unsigned char width[4]; /* width of image in pixels */ unsigned char height[4]; /* height of image in pixels */ unsigned char depth[4]; /* depth of each pixel */ unsigned char length[4]; /* length of the image in bytes */ unsigned char type[4]; /* format of file */ unsigned char maptype[4]; /* type of colormap */ unsigned char maplen[4]; /* length of colormap in bytes */ }; /* following the header is the colormap (unless maplen is zero) then * the image. each row of the image is rounded to 2 bytes. */ #define RMAGICNUMBER 0x59a66a95 /* magic number of this file type */ /* these are the possible file formats */ #define ROLD 0 /* old format, see /usr/include/rasterfile.h */ #define RSTANDARD 1 /* standard format */ #define RRLENCODED 2 /* run length encoding to compress the image */ #define RRGB 3 /* RGB-format instead of BGR in 24 or 32-bit mode */ #define RTIFF 4 /* TIFF <-> rasterfile */ #define RIFF 5 /* IFF (TAAC) <-> rasterfile */ /* these are the possible colormap types. if it's in RGB format, * the map is made up of three byte arrays (red, green, then blue) * that are each 1/3 of the colormap length. */ #define RNOMAP 0 /* no colormap follows the header */ #define RRGBMAP 1 /* rgb colormap */ #define RRAWMAP 2 /* raw colormap; good luck */ #define RESC 128 /* run-length encoding escape character */ kit/image/tgncpyrght.h010064400237450000000000000021260642466042700146050ustar nishidawheel#ifndef _TGN_COPYRIGHT_ /**** Copyright 1991 Tim Northrup Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The author makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****/ #ifndef __SABER__ static char *TGNCopyright = "Copyright (C) 1991 Tim Northrup"; #endif #define _TGN_COPYRIGHT_ #endif kit/image/value.c010064400237450000000000000031350642466042600135230ustar nishidawheel/* value.c: * * routines for converting byte values to long values. these are pretty * portable although they are not necessarily the fastest things in the * world. * * jim frost 10.02.89 * * Copyright 1989 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "image.h" unsigned long doMemToVal(p, len) byte *p; unsigned int len; { unsigned int a; unsigned long i; i= 0; for (a= 0; a < len; a++) i= (i << 8) + *(p++); return(i); } unsigned long doValToMem(val, p, len) unsigned long val; byte *p; unsigned int len; { int a; for (a= len - 1; a >= 0; a--) { *(p + a)= val & 0xff; val >>= 8; } return(val); } unsigned long doMemToValLSB(p, len) byte *p; unsigned int len; { int val, a; val= 0; for (a= len - 1; a >= 0; a--) val= (val << 8) + *(p + a); return(val); } /* this is provided for orthagonality */ unsigned long doValToMemLSB(val, p, len) byte *p; unsigned long val; unsigned int len; { while (len--) { *(p++)= val & 0xff; val >>= 8; } return(val); } /* this flips all the bits in a byte array at byte intervals */ void flipBits(p, len) byte *p; unsigned int len; { static int init= 0; static byte flipped[256]; if (!init) { int a, b; byte norm; for (a= 0; a < 256; a++) { flipped[a]= 0; norm= a; for (b= 0; b < 8; b++) { flipped[a]= (flipped[a] << 1) | (norm & 1); norm >>= 1; } } } while (len--) p[len]= flipped[p[len]]; } kit/image/xwd.c010064400237450000000000000347550664164000100132110ustar nishidawheel/* xwd.c: * * XWD file reader. unfortunately the bozo who thought up this format didn't * define anything at all that we can use as an identifier or even to tell * what kind of machine dumped the format. what this does is read the * header and look at several fields to decide if this *might* be an XWD * file and if it is what byte order machine wrote it. * * jim frost 07.24.90 * * Copyright 1990 Jim Frost. See included file "copyright.h" for complete * copyright information. */ #include "copyright.h" #include "xloadimage.h" #include "xwd.h" /* SUPPRESS 558 */ /* this reads the header and does the magic to determine if it is indeed * an XWD file. */ static int isXWD(name, zf, header, verbose) char *name; ZFILE *zf; XWDHeader *header; int verbose; { GenericXWDHeader gh; int a; if (zread(zf, (byte *)&gh, sizeof(GenericXWDHeader)) != sizeof(GenericXWDHeader)) return(0); /* first try -- see if XWD version number matches in either MSB or LSB order */ if (memToVal(gh.file_version, 4) != XWD_VERSION) return(0); /* convert fields to fill out header. things we don't care about * are commented out. */ header->header_size= memToVal(gh.header_size, 4); header->file_version= memToVal(gh.file_version, 4); header->pixmap_format= memToVal(gh.pixmap_format, 4); header->pixmap_depth= memToVal(gh.pixmap_depth, 4); header->pixmap_width= memToVal(gh.pixmap_width, 4); header->pixmap_height= memToVal(gh.pixmap_height, 4); header->xoffset= memToVal(gh.xoffset, 4); header->byte_order= memToVal(gh.byte_order, 4); header->bitmap_unit= memToVal(gh.bitmap_unit, 4); header->bitmap_bit_order= memToVal(gh.bitmap_bit_order, 4); header->bitmap_pad= memToVal(gh.bitmap_pad, 4); header->bits_per_pixel= memToVal(gh.bits_per_pixel, 4); header->bytes_per_line= memToVal(gh.bytes_per_line, 4); header->visual_class= memToVal(gh.visual_class, 4); /*header->red_mask= memToVal(gh.red_mask, 4);*/ /*header->green_mask= memToVal(gh.green_mask, 4);*/ /*header->blue_mask= memToVal(gh.blue_mask, 4);*/ /*header->bits_per_rgb= memToVal(gh.bits_per_rgb, 4);*/ header->colormap_entries= memToVal(gh.colormap_entries, 4); header->ncolors= memToVal(gh.ncolors, 4); /*header->window_width= memToVal(gh.window_width, 4);*/ /*header->window_height= memToVal(gh.window_height, 4);*/ /*header->window_x= memToVal(gh.window_x, 4);*/ /*header->window_y= memToVal(gh.window_y, 4);*/ /*header->window_bdrwidth= memToVal(gh.window_bdrwidth, 4);*/ /* if header size isn't either 100 or 104 bytes, this isn't an XWD file */ if (header->header_size < sizeof(GenericXWDHeader)) return(0); for (a= header->header_size - sizeof(GenericXWDHeader); a; a--) zgetc(zf); /* look at a variety of the XImage fields to see if they are sane. if * they are, this passes our tests. */ switch (header->pixmap_format) { case XYBitmap: case XYPixmap: case ZPixmap: break; default: return(0); } switch (header->visual_class) { case StaticGray: case GrayScale: case StaticColor: case PseudoColor: /* the following are unsupported but recognized */ case TrueColor: case DirectColor: break; default: return(0); } if (verbose) { fprintf(stderr, "%s is a %dx%d XWD image in ", name, header->pixmap_width, header->pixmap_height); switch (header->pixmap_format) { case XYBitmap: fprintf(stderr, "XYBitmap"); break; case XYPixmap: fprintf(stderr, "%d bit XYPixmap", header->pixmap_depth); break; case ZPixmap: fprintf(stderr, "%d bit ZPixmap", header->pixmap_depth); break; } fprintf(stderr, " format\n"); } /* if it got this far, we're pretty damned certain we've got the right * file type and know what order it's in. */ znocache(zf); return(1); } int xwdIdent(fullname, name) char *fullname, *name; { ZFILE *zf; XWDHeader header; int ret; if (! (zf= zopen(fullname))) return(0); ret= isXWD(name, zf, &header, 1); zclose(zf); return(ret); } static Image *loadXYBitmap(fullname, zf, header) char *fullname; ZFILE *zf; XWDHeader header; { Image *image; int dlinelen; /* length of scan line in data file */ int ilinelen; /* length of line within image structure */ int unit; /* # of bytes in a bitmap unit */ int xoffset; /* xoffset within line */ int xunits; /* # of units across the whole scan line */ int trailer; /* # of bytes in last bitmap unit on a line */ int shift; /* # of bits to shift last byte set */ int x, y; /* horizontal and vertical counters */ byte *line; /* input scan line */ byte *dptr, *iptr; /* image data pointers */ unsigned long (*loader)(); /* unit loading function */ image= newBitImage(header.pixmap_width, header.pixmap_height); ilinelen= (header.pixmap_width / 8) + (header.pixmap_width % 8 ? 1 : 0); if (header.bitmap_unit > 7) /* supposed to be 8, 16, or 32 but appears */ unit= header.bitmap_unit / 8; /* to often be the byte count. this will */ else /* accept either. */ unit= header.bitmap_unit; xoffset= (header.xoffset / (unit * 8)) * unit; if (header.bytes_per_line) dlinelen= header.bytes_per_line; else dlinelen= unit * header.pixmap_width; xunits= (header.pixmap_width / (unit * 8)) + (header.pixmap_width % (unit * 8) ? 1 : 0); trailer= unit - ((xunits * unit) - ilinelen); xunits--; /* we want to use one less than the actual # of units */ shift= (unit - trailer) * 8; if (header.byte_order == MSBFirst) loader= doMemToVal; else loader= doMemToValLSB; line= (byte *)lmalloc(dlinelen); for (y= 0; y < header.pixmap_height; y++) { if (zread(zf, (byte *)line, dlinelen) != dlinelen) { fprintf(stderr, "%s: Short read while reading data! (returning partial image)\n", fullname); lfree(line); return(image); } dptr= line + xoffset; iptr= image->data + (y * ilinelen); if (header.bitmap_bit_order == LSBFirst) flipBits(line, dlinelen); for (x= 0; x < xunits; x++) { valToMem(loader(dptr, unit), iptr, unit); dptr += unit; iptr += unit; } /* take care of last unit on this line */ valToMem(loader(dptr, unit) >> shift, iptr, trailer); } lfree(line); return(image); } /* this is a lot like the above function but OR's planes together to * build the destination. 1-bit images are handled by XYBitmap. */ static Image *loadXYPixmap(fullname, zf, header) char *fullname; ZFILE *zf; XWDHeader header; { Image *image; int plane; int dlinelen; /* length of scan line in data file */ int ilinelen; /* length of line within image structure */ int unit; /* # of bytes in a bitmap unit */ int unitbits; /* # of bits in a bitmap unit */ int unitmask; /* mask for current bit within current unit */ int xoffset; /* xoffset within data */ int xunits; /* # of units across the whole scan line */ int x, x2, y; /* horizontal and vertical counters */ int index; /* index within image scan line */ byte *line; /* input scan line */ byte *dptr, *iptr; /* image data pointers */ unsigned long pixvals; /* bits for pixels in this unit */ unsigned long mask; unsigned long (*loader)(); /* unit loading function */ image= newRGBImage(header.pixmap_width, header.pixmap_height, header.pixmap_depth); ilinelen= image->width * image->pixlen; if (header.bitmap_unit > 7) /* supposed to be 8, 16, or 32 but appears */ unit= header.bitmap_unit / 8; /* to often be the byte count. this will */ else /* accept either. */ unit= header.bitmap_unit; unitbits= unit * 8; unitmask= 1 << (unitbits - 1); xoffset= (header.xoffset / unitbits) * unit; if (header.bytes_per_line) dlinelen= header.bytes_per_line; else dlinelen= unit * header.pixmap_width; xunits= (header.pixmap_width / (unit * 8)) + (header.pixmap_width % (unit * 8) ? 1 : 0); if (header.byte_order == MSBFirst) loader= doMemToVal; else loader= doMemToValLSB; line= (byte *)lmalloc(dlinelen); /* for each plane, load in the bitmap and or it into the image */ for (plane= header.pixmap_depth; plane > 0; plane--) { for (y= 0; y < header.pixmap_height; y++) { if (zread(zf, (byte *)line, dlinelen) != dlinelen) { fprintf(stderr, "%s: Short read while reading data! (returning partial image)\n", fullname); lfree(line); return(image); } dptr= line + xoffset; iptr= image->data + (y * ilinelen); index= 0; if (header.bitmap_bit_order == LSBFirst) flipBits(line, dlinelen); for (x= 0; x < xunits; x++) { pixvals= loader(dptr, unit); mask= unitmask; for (x2= 0; x2 < unitbits; x2++) { if (pixvals & mask) valToMem(memToVal(iptr + index, image->pixlen) | (1 << plane), iptr + index, image->pixlen); index += image->pixlen; if (index > ilinelen) { x= xunits; break; } if (! (mask >>= 1)) mask= unitmask; } dptr += unit; } } } lfree(line); return(image); } /* this loads a ZPixmap format image. note that this only supports depths * of 4, 8, 16, 24, or 32 bits as does Xlib. You gotta 6-bit image, * you gotta problem. 1-bit images are handled by XYBitmap. */ static Image *loadZPixmap(fullname, zf, header) char *fullname; ZFILE *zf; XWDHeader header; { Image *image; int dlinelen; /* length of scan line in data file */ int ilinelen; /* length of scan line in image file */ int depth; /* depth rounded up to 8-bit value */ int pixlen; /* length of pixel in bytes */ int x, y; /* horizontal and vertical counters */ byte *line; /* input scan line */ byte *dptr, *iptr; /* image data pointers */ unsigned long pixmask; /* bit mask within pixel */ unsigned long pixel; /* pixel we're working on */ unsigned long (*loader)(); /* unit loading function */ image= newRGBImage(header.pixmap_width, header.pixmap_height, header.pixmap_depth); /* for pixmaps that aren't simple depths, we round to a depth of 8. this * is what Xlib does, be it right nor not. */ if ((header.pixmap_depth != 4) && (header.pixmap_depth % 8)) depth= header.pixmap_depth + 8 - (header.pixmap_depth % 8); else depth= header.pixmap_depth; pixmask= 0xffffffff >> (32 - header.pixmap_depth); pixlen= image->pixlen; if (header.bytes_per_line) dlinelen= header.bytes_per_line; else dlinelen= depth * header.pixmap_width; ilinelen= image->width * image->pixlen; if (header.byte_order == MSBFirst) loader= doMemToVal; else loader= doMemToValLSB; line= (byte *)lmalloc(dlinelen); for (y= 0; y < header.pixmap_height; y++) { if (zread(zf, (byte *)line, dlinelen) != dlinelen) { fprintf(stderr, "%s: Short read while reading data! (returning partial image)\n", fullname); lfree(line); return(image); } dptr= line; iptr= image->data + (y * ilinelen); if (header.bitmap_bit_order == LSBFirst) flipBits(line, dlinelen); for (x= 0; x < header.pixmap_width; x++) { switch (depth) { case 4: pixel= memToVal(dptr, 1); if (header.bitmap_bit_order == LSBFirst) { /* nybbles are reversed */ valToMem(pixel & 0xf, iptr++, 1); /* by flipBits */ if (++x < header.pixmap_width) valToMem(pixel >> 4, iptr++, 1); } else { valToMem(pixel >> 4, iptr++, 1); if (++x < header.pixmap_width) valToMem(pixel & 0xf, iptr++, 1); } break; case 8: pixel= ((unsigned long)*(dptr++)) & pixmask; /* loader isn't needed */ valToMem(pixel, iptr++, 1); break; case 16: case 24: case 32: valToMem(loader(dptr, pixlen) & pixmask, iptr, pixlen); dptr += pixlen; iptr += pixlen; break; default: fprintf(stderr, "%s: ZPixmaps of depth %d are not supported (sorry).\n", fullname, header.pixmap_depth); cleanup(-1); } } } lfree(line); return(image); } Image *xwdLoad(fullname, name, verbose) char *fullname, *name; int verbose; { ZFILE *zf; XWDHeader header; int cmaplen; XWDColor *cmap; Image *image=NULL; int a; if (! (zf= zopen(fullname))) return(NULL); if (! isXWD(name, zf, &header, verbose)) { zclose(zf); return(NULL); } /* complain if we don't understand the visual */ switch (header.visual_class) { case StaticGray: case GrayScale: case StaticColor: case PseudoColor: break; case TrueColor: case DirectColor: fprintf(stderr, "Unsupported visual type, sorry\n"); cleanup(-1); } if ((header.pixmap_width == 0) || (header.pixmap_height == 0)) { fprintf(stderr, "Zero-size image -- header might be corrupted.\n"); cleanup(-1); } /* read in colormap */ cmaplen= header.ncolors * sizeof(XWDColor); cmap= (XWDColor *)lmalloc(cmaplen); if (zread(zf, (byte *)cmap, cmaplen) != cmaplen) { fprintf(stderr, "Short read in colormap!\n"); cleanup(-1); } /* any depth 1 image is basically a XYBitmap so we fake it here */ if (header.pixmap_depth == 1) header.pixmap_format= XYBitmap; /* we can't realistically support images of more than depth 16 with the * RGB image format so this nukes them for the time being. */ if (header.pixmap_depth > 16) { fprintf(stderr, "%s: Sorry, cannot load images deeper than 16 bits (yet)\n", fullname); cleanup(-1); } switch (header.pixmap_format) { case XYBitmap: image= loadXYBitmap(fullname, zf, header); zclose(zf); image->title= dupString(name); return(image); /* we used to goof w/ the cmap but we gave up */ case XYPixmap: image= loadXYPixmap(fullname, zf, header); break; case ZPixmap: image= loadZPixmap(fullname, zf, header); break; } zclose(zf); image->title= dupString(name); /* load the colormap. we should probably use pixval instead of the color * number but the value seems pretty system-dependent and most colormaps * seem to be just dumped in order. */ image->rgb.used= header.ncolors; for (a= 0; a < header.ncolors; a++) { image->rgb.red[memToVal(cmap[a].pixel, 4)]= memToVal(cmap[a].red, 2); image->rgb.green[memToVal(cmap[a].pixel, 4)]= memToVal(cmap[a].green, 2); image->rgb.blue[memToVal(cmap[a].pixel, 4)]= memToVal(cmap[a].blue, 2); } lfree((byte *)cmap); return(image); } kit/image/window.c010064400237450000000000000652511010174522300137070ustar nishidawheel/* window.c: * * display an image in a window * * jim frost 10.03.89 * * Copyright 1989, 1990, 1991 Jim Frost. * See included file "copyright.h" for complete copyright information. */ #include "copyright.h" #include "xloadimage.h" #include #include #include #include #include #include #ifdef SYSV #include #endif #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #if HAVE_SYS_SELECT_H # include #endif #ifdef __APPLE__ #include #endif /* SUPPRESS 560 */ static Window ImageWindow= 0; static Window ViewportWin= 0; static Colormap ImageColormap; static int AlarmWentOff = 0; static RETSIGTYPE delayAlarmHandler() { AlarmWentOff = 1; } /* this is a bogus function whose only purpose is to interrupt * the XNextEvent signal call in imageInWindow(). * This is added to allow automatic cycling through the specified list * of pictures. The amount of wait time is specified using the -delay * option, which is the number of seconds to pause between pictures. * - mfc 90/10/08 */ static int getNextEventWithTimeout(disp, event) Display *disp; XEvent *event; { fd_set rmask; int nfound; /* force any output to occur before we set & spin */ XFlush(disp); /* wait for alarm */ while ((AlarmWentOff == 0)) { if (XPending(disp)) { XNextEvent(disp, event); return(1); } FD_ZERO(&rmask); FD_SET(ConnectionNumber(disp), &rmask); nfound = select(ConnectionNumber(disp)+1, &rmask, (fd_set *) 0, (fd_set *) 0, /*(struct timeval *)*/0); switch (nfound) { case -1: if (errno == EINTR) { continue; } else { perror("select"); continue; } } } return(0); } static void setCursor(disp, window, iw, ih, ww, wh, cursor) Display *disp; Window window; unsigned int iw, ih; unsigned int ww, wh; Cursor *cursor; { XSetWindowAttributes swa; if ((ww >= iw) && (wh >= ih)) swa.cursor= XCreateFontCursor(disp, XC_icon); else if ((ww < iw) && (wh >= ih)) swa.cursor= XCreateFontCursor(disp, XC_sb_h_double_arrow); else if ((ww >= iw) && (wh < ih)) swa.cursor= XCreateFontCursor(disp, XC_sb_v_double_arrow); else swa.cursor= XCreateFontCursor(disp, XC_fleur); XChangeWindowAttributes(disp, window, CWCursor, &swa); XFreeCursor(disp, *cursor); *cursor= swa.cursor; } /* place an image */ static void placeImage(disp, width, height, winwidth, winheight, rx, ry) Display *disp; int width, height, winwidth, winheight; int *rx, *ry; /* supplied and returned */ { int pixx, pixy; pixx= *rx; pixy= *ry; if (winwidth > width) pixx= (winwidth - width) / 2; else { if ((pixx < 0) && (pixx + width < winwidth)) pixx= winwidth - width; if (pixx > 0) pixx= 0; } if (winheight > height) pixy= (winheight - height) / 2; else { if ((pixy < 0) && (pixy + height < winheight)) pixy= winheight - height; if (pixy > 0) pixy= 0; } *rx= pixx; *ry= pixy; XMoveWindow(disp, ImageWindow, pixx, pixy); } /* blit an image */ static void blitImage(ximageinfo, width, height, x, y, w, h) XImageInfo *ximageinfo; unsigned int width, height; int x, y, w, h; { if (w > width) w= width; if (h > height) h= height; if (x < 0) { XClearArea(ximageinfo->disp, ximageinfo->drawable, x, y, -x, h, False); w -= (0 - x); x= 0; } if (y < 0) { XClearArea(ximageinfo->disp, ximageinfo->drawable, x, y, w, -y, False); h -= (0 - y); y= 0; } if (x + w > width) { XClearArea(ximageinfo->disp, ximageinfo->drawable, x + width, y, x + w - width, h, False); w -= x + w - width; } if (y + h > height) { XClearArea(ximageinfo->disp, ximageinfo->drawable, x, y + height, w, y + h - height, False); h -= y + h - height; } sendXImage(ximageinfo, x, y, x, y, w, h); } /* clean up static window if we're through with it */ void cleanUpWindow(disp) Display *disp; { if (ImageWindow) XDestroyWindow(disp, ImageWindow); ImageWindow= 0; if (ViewportWin) XDestroyWindow(disp, ViewportWin); ViewportWin= 0; } /* clean up after displaying an image */ static void cleanUpImage(disp, scrn, cursor, pixmap, image, ximageinfo) Display *disp; int scrn; Cursor cursor; Pixmap pixmap; Image *image; XImageInfo *ximageinfo; { XFreeCursor(disp, cursor); if (pixmap != None) XFreePixmap(disp, pixmap); freeXImage(image, ximageinfo); } /* this sets the colormap and WM_COLORMAP_WINDOWS properly for the * viewport. */ void setViewportColormap(disp, scrn, visual) Display *disp; int scrn; Visual *visual; { XSetWindowAttributes swa; static cmap_atom= None; Window cmap_windows[2]; if (cmap_atom == None) cmap_atom = XInternAtom(disp, "WM_COLORMAP_WINDOWS", False); /* if the visual we're using is the same as the default visual (used by * the viewport window) then we can set the viewport window to use the * image's colormap. this keeps most window managers happy. */ if (visual == DefaultVisual(disp, scrn)) { swa.colormap= ImageColormap; XChangeWindowAttributes(disp, ViewportWin, CWColormap, &swa); XDeleteProperty(disp, ViewportWin, cmap_atom); } /* smart window managers can handle it when we use a different colormap * in our subwindow so long as we set the WM_COLORMAP_WINDOWS property * ala ICCCM. */ else { cmap_windows[0]= ImageWindow; cmap_windows[1]= ViewportWin; XChangeProperty(disp, ViewportWin, cmap_atom, XA_WINDOW, 32, PropModePrepend, (unsigned char *) cmap_windows, 2); } } /* this attempts to convert an image title into a reasonable icon name */ static char *iconName(s) char *s; { static char buf[BUFSIZ]; char *t; if (!s) return("Unnamed"); buf[BUFSIZ - 1]= '\0'; strncpy(buf, s, BUFSIZ - 1); t= index(buf, ' '); /* strip off stuff following 1st word. this strips */ if (t) /* info added by processing functions too. */ *t= '\0'; /* strip off leading path. if you don't use unix-style paths, you might * want to change this. */ if ((t = rindex(buf, '/'))) { for (s= buf, t++; *t; s++, t++) *s= *t; *s= '\0'; } t= index(buf, '.'); /* look for an extension and strip it off */ if (t) *t= '\0'; return(buf); } /* visual class to name table */ static struct visual_class_name { int class; /* numerical value of class */ char *name; /* actual name of class */ } VisualClassName[] = { { TrueColor, "TrueColor" }, { DirectColor, "DirectColor" }, { PseudoColor, "PseudoColor" }, { StaticColor, "StaticColor" }, { GrayScale, "GrayScale" }, { StaticGray, "StaticGray" }, { StaticGray, "StaticGrey" }, { -1, NULL } }; int visualClassFromName(name) char *name; { int a; char *s1, *s2; int class= -1; for (a= 0; VisualClassName[a].name; a++) { for (s1= VisualClassName[a].name, s2= name; *s1 && *s2; s1++, s2++) if ((isupper(*s1) ? tolower(*s1) : *s1) != (isupper(*s2) ? tolower(*s2) : *s2)) break; if ((*s1 == '\0') || (*s2 == '\0')) { /* check for uniqueness. we special-case StaticGray because we have two * spellings but they are unique if either is found */ if ((class != -1) && (class != StaticGray)) { fprintf(stderr, "%s does not uniquely describe a visual class (ignored)\n", name); return(-1); } class= VisualClassName[a].class; } } if (class == -1) fprintf(stderr, "%s is not a visual class (ignored)\n", name); return(class); } char *nameOfVisualClass(class) int class; { int a; for (a= 0; VisualClassName[a].name; a++) if (VisualClassName[a].class == class) return(VisualClassName[a].name); return("[Unknown Visual Class]"); } /* find the best visual of a particular class with a particular depth */ static Visual *bestVisualOfClassAndDepth(disp, scrn, class, depth) Display *disp; int scrn; int class; unsigned int depth; { Visual *best= NULL; XVisualInfo template, *info; int nvisuals; template.screen= scrn; template.class= class; template.depth= depth; if (! (info= XGetVisualInfo(disp, VisualScreenMask | VisualClassMask | VisualDepthMask, &template, &nvisuals))) return(NULL); /* no visuals of this depth */ /* not sure what to do if this gives more than one visual of a particular * class and depth, so just return the first one. */ best= info->visual; XFree(info); return(best); } /* this tries to determine the best available visual to use for a particular * image */ void bestVisual(disp, scrn, image, rvisual, rdepth) Display *disp; int scrn; Image *image; Visual **rvisual; unsigned int *rdepth; { unsigned int depth, a; Screen *screen; Visual *visual=NULL, *default_visual; /* figure out the best depth the server supports. note that some servers * (such as the HP 11.3 server) actually say they support some depths but * have no visuals that support that depth. seems silly to me.... */ depth= 0; screen= ScreenOfDisplay(disp, scrn); for (a= 0; a < screen->ndepths; a++) { if (screen->depths[a].nvisuals && ((!depth || ((depth < image->depth) && (screen->depths[a].depth > depth)) || ((screen->depths[a].depth >= image->depth) && (screen->depths[a].depth < depth))))) depth= screen->depths[a].depth; } if (!depth) { /* this shouldn't happen */ fprintf(stderr, "bestVisual: didn't find any depths?!?\n"); depth= DefaultDepth(disp, scrn); } /* given this depth, find the best possible visual */ default_visual= DefaultVisual(disp, scrn); switch (image->type) { case ITRUE: /* if the default visual is DirectColor or TrueColor prioritize such * that we use the default type if it exists at this depth */ if (default_visual->class == TrueColor) { visual= bestVisualOfClassAndDepth(disp, scrn, TrueColor, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, DirectColor, depth); } else { visual= bestVisualOfClassAndDepth(disp, scrn, DirectColor, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, TrueColor, depth); } if (!visual || ((depth <= 8) && bestVisualOfClassAndDepth(disp, scrn, PseudoColor, depth))) visual= bestVisualOfClassAndDepth(disp, scrn, PseudoColor, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, StaticColor, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, GrayScale, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, StaticGray, depth); break; case IRGB: /* if it's an RGB image, we want PseudoColor if we can get it */ visual= bestVisualOfClassAndDepth(disp, scrn, PseudoColor, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, DirectColor, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, TrueColor, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, StaticColor, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, GrayScale, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, StaticGray, depth); break; case IBITMAP: visual= bestVisualOfClassAndDepth(disp, scrn, PseudoColor, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, StaticColor, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, GrayScale, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, StaticGray, depth); /* it seems pretty wasteful to use a TrueColor or DirectColor visual * to display a bitmap (2-color) image, so we look for those last */ if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, DirectColor, depth); if (!visual) visual= bestVisualOfClassAndDepth(disp, scrn, TrueColor, depth); break; } if (!visual) { /* this shouldn't happen */ fprintf(stderr, "bestVisual: couldn't find one?!?\n"); depth= DefaultDepth(disp, scrn); visual= DefaultVisual(disp, scrn); } *rvisual= visual; *rdepth= depth; } /* given a visual class, try to find the best visual of that class at * the best depth. returns a null visual and depth if it couldn't find * any visual of that type at any depth */ void bestVisualOfClass(disp, scrn, image, visual_class, rvisual, rdepth) Display *disp; int scrn; Image *image; int visual_class; Visual **rvisual; unsigned int *rdepth; { Visual *visual; Screen *screen; unsigned int a, b, depth; /* loop through depths looking for a visual of a good depth which matches * our visual class. */ screen= ScreenOfDisplay(disp, scrn); visual= (Visual *)NULL; depth= 0; for (a= 0; a < screen->ndepths; a++) { for (b= 0; b < screen->depths[a].nvisuals; b++) { if ((screen->depths[a].visuals[b].class == visual_class) && (!depth || ((depth < image->depth) && (screen->depths[a].depth > depth)) || ((screen->depths[a].depth >= image->depth) && (screen->depths[a].depth < depth)))) { depth= screen->depths[a].depth; visual= &(screen->depths[a].visuals[b]); } } } *rvisual= visual; *rdepth= depth; } char imageInWindow(disp, scrn, image, user_geometry, fullscreen, install, private_cmap, fit, use_pixmap, delay, visual_class, argc, argv, verbose) Display *disp; int scrn; Image *image; char *user_geometry; unsigned int fullscreen; unsigned int install; unsigned int private_cmap; unsigned int fit; unsigned int use_pixmap; unsigned int delay; int visual_class; /* visual class user wants (or -1) */ int argc; char *argv[]; unsigned int verbose; { Pixmap pixmap = None; XImageInfo *ximageinfo; Visual *visual; unsigned int depth; Window oldimagewindow; Colormap oldcmap=None; XSetWindowAttributes swa_img; XSetWindowAttributes swa_view; XClassHint classhint; unsigned int wa_mask_img; XSizeHints sh; XWMHints wmh; int pixx= -1, pixy= -1; int lastx=0, lasty, mousex, mousey; int paint; static int old_width= -1, old_height= -1; static Atom proto_atom= None, delete_atom= None; union { XEvent event; XAnyEvent any; XButtonEvent button; XKeyEvent key; XConfigureEvent configure; XExposeEvent expose; XMotionEvent motion; XResizeRequestEvent resize; XClientMessageEvent message; } event; unsigned int winx, winy, winwidth, winheight; /* figure out the window size. unless specifically requested to do so, * we will not exceed 90% of display real estate. */ if (user_geometry == NULL) { winx= winy= winwidth= winheight= 0; } else { char def_geom[30]; sprintf(def_geom, "%ux%u+0+0", image->width, image->height); XGeometry(disp, scrn, user_geometry, def_geom, 0, 1, 1, 0, 0, &winx, &winy, &winwidth, &winheight); } if (fullscreen) { winwidth= DisplayWidth(disp, scrn); winheight= DisplayHeight(disp, scrn); } else { lastx= (winwidth || winheight); /* user set size flag */ if (!winwidth) { winwidth= image->width; if (winwidth > DisplayWidth(disp, scrn) * 0.9) winwidth= DisplayWidth(disp, scrn) * 0.9; } if (!winheight) { winheight= image->height; if (winheight > DisplayHeight(disp, scrn) * 0.9) winheight= DisplayHeight(disp, scrn) * 0.9; } } /* if the user told us to fit the colormap, we must use the default * visual. */ if (fit) { visual= DefaultVisual(disp, scrn); depth= DefaultDepth(disp, scrn); } else { visual= (Visual *)NULL; if (visual_class == -1) { /* try to pick the best visual for the image. */ bestVisual(disp, scrn, image, &visual, &depth); if (verbose && (visual != DefaultVisual(disp, scrn))) fprintf(stderr, " Using %s visual\n", nameOfVisualClass(visual->class)); } else { /* try to find a visual of the specified class */ bestVisualOfClass(disp, scrn, image, visual_class, &visual, &depth); if (!visual) { bestVisual(disp, scrn, image, &visual, &depth); fprintf(stderr, "Server does not support %s visual, using %s\n", nameOfVisualClass(visual_class), nameOfVisualClass(visual->class)); } } } /* if we're in slideshow mode and the user told us to fit the colormap, * free it here. */ if (ViewportWin) { if (fit) { XDestroyWindow(disp, ImageWindow); ImageWindow= 0; ImageColormap= 0; } /* for the 1st image we display we can use the default cmap. subsequent * images use a private colormap (unless they're bitmaps) so we don't get * color erosion when switching images. */ else if (!BITMAPP(image)) private_cmap= 1; } if (! (ximageinfo= imageToXImage(disp, scrn, visual, depth, image, private_cmap, fit, verbose))) { fprintf(stderr, "Cannot convert Image to XImage\n"); cleanup(-1); } swa_view.background_pixel= WhitePixel(disp,scrn); swa_view.backing_store= NotUseful; swa_view.cursor= XCreateFontCursor(disp, XC_watch); swa_view.event_mask= ButtonPressMask | Button1MotionMask | KeyPressMask | StructureNotifyMask | EnterWindowMask | LeaveWindowMask; swa_view.save_under= False; classhint.res_class = "Xloadimage"; classhint.res_name=NULL; if (!ViewportWin) { ViewportWin= XCreateWindow(disp, RootWindow(disp, scrn), winx, winy, winwidth, winheight, 0, DefaultDepth(disp, scrn), InputOutput, DefaultVisual(disp, scrn), CWBackingStore | CWBackPixel | CWCursor | CWEventMask | CWSaveUnder, &swa_view); oldimagewindow= 0; XSetCommand(disp, ViewportWin, argv, argc); XSetClassHint(disp,ViewportWin,&classhint); proto_atom = XInternAtom(disp, "WM_PROTOCOLS", False); delete_atom = XInternAtom(disp, "WM_DELETE_WINDOW", False); if ((proto_atom != None) && (delete_atom != None)) XChangeProperty(disp, ViewportWin, proto_atom, XA_ATOM, 32, PropModePrepend, (unsigned char *) &delete_atom, 1); paint= 0; } else { oldimagewindow= ImageWindow; oldcmap= ImageColormap; paint= 1; } /* create image window */ swa_img.bit_gravity= NorthWestGravity; swa_img.save_under= False; swa_img.colormap= ximageinfo->cmap; swa_img.border_pixel= 0; ImageWindow= XCreateWindow(disp, ViewportWin, winx, winy, image->width, image->height, 0, ximageinfo->depth, InputOutput, visual, CWBitGravity | CWColormap | CWSaveUnder | CWBorderPixel, &swa_img); ImageColormap= ximageinfo->cmap; XSetCommand(disp, ImageWindow, argv, argc); XSetClassHint(disp,ImageWindow,&classhint); /* decide how we're going to handle repaints. we have three modes: * use backing-store, use background pixmap, and use exposures. * if the server supports backing-store, we enable it and use it. * this really helps servers which are memory constrained. if the * server does not have backing-store, we try to send the image to * a pixmap and use that as backing-store. if that fails, we use * exposures to blit the image (which is ugly but it works). * * the "use_pixmap" flag forces background pixmap mode, which may * improve performance. */ ximageinfo->drawable= ImageWindow; if ((DoesBackingStore(ScreenOfDisplay(disp,scrn)) == NotUseful) || use_pixmap) { if (((pixmap= ximageToPixmap(disp, ImageWindow, ximageinfo)) == None) && verbose) fprintf(stderr, " Cannot create image in server, repaints will be ugly!\n"); } /* build window attributes for the image window */ wa_mask_img= 0; if (pixmap == None) { /* No pixmap. Must paint over the wire. Ask for BackingStore * to cut down on the painting. But, ask for Exposures so we can * paint both viewables and backingstore. */ swa_img.background_pixel= WhitePixel(disp,scrn); wa_mask_img |= CWBackPixel; swa_img.event_mask= ExposureMask; wa_mask_img |= CWEventMask; swa_img.backing_store= WhenMapped; wa_mask_img |= CWBackingStore; } else { /* we have a pixmap so tile the window. to move the image we only * have to move the window and the server should do the rest. */ swa_img.background_pixmap= pixmap; wa_mask_img |= CWBackPixmap; swa_img.event_mask= 0; /* no exposures please */ wa_mask_img |= CWEventMask; swa_img.backing_store= NotUseful; wa_mask_img |= CWBackingStore; } XChangeWindowAttributes(disp, ImageWindow, wa_mask_img, &swa_img); if (image->title) XStoreName(disp, ViewportWin, image->title); else XStoreName(disp, ViewportWin, "Unnamed"); XSetIconName(disp, ViewportWin, iconName(image->title)); sh.width= winwidth; sh.height= winheight; if (fullscreen) { sh.min_width= sh.max_width= winwidth; sh.min_height= sh.max_height= winheight; } else { sh.min_width= 1; sh.min_height= 1; sh.max_width= image->width; sh.max_height= image->height; } sh.width_inc= 1; sh.height_inc= 1; sh.flags= PMinSize | PMaxSize | PResizeInc; if (lastx || fullscreen) sh.flags |= USSize; else sh.flags |= PSize; if (fullscreen) { sh.x= sh.y= 0; sh.flags |= USPosition; } else if (winx || winy) { sh.x= winx; sh.y= winy; sh.flags |= USPosition; } XSetNormalHints(disp, ViewportWin, &sh); sh.min_width= sh.max_width; sh.min_height= sh.max_height; XSetNormalHints(disp, ImageWindow, &sh); /* Image doesn't shrink */ wmh.input= True; wmh.flags= InputHint; XSetWMHints(disp, ViewportWin, &wmh); setViewportColormap(disp, scrn, visual); /* map windows and clean up old window if there was one. */ XMapWindow(disp, ImageWindow); XMapWindow(disp, ViewportWin); if (oldimagewindow) { if (oldcmap && (oldcmap != DefaultColormap(disp, scrn))) XFreeColormap(disp, oldcmap); XDestroyWindow(disp, oldimagewindow); } /* start displaying image */ placeImage(disp, image->width, image->height, winwidth, winheight, &pixx, &pixy); if (paint) { if ((winwidth != old_width) || (winheight != old_height)) { XResizeWindow(disp, ViewportWin, winwidth, winheight); } XResizeWindow(disp, ImageWindow, image->width, image->height); /* Clear the image window. Ask for exposure if there is no tile. */ XClearArea(disp, ImageWindow, 0, 0, 0, 0, (pixmap == None)); } old_width= winwidth; old_height= winheight; /* flush output. this is so that -delay will be close to what was * asked for (i.e., do the flushing of output outside of the loop). */ XSync(disp,False); setCursor(disp, ViewportWin, image->width, image->height, winwidth, winheight, &(swa_view.cursor)); lastx= lasty= -1; if (delay) { /* reset alarm to -delay seconds after every event */ AlarmWentOff = 0; signal(SIGALRM, delayAlarmHandler); alarm(delay); } for (;;) { if (delay) { if (!getNextEventWithTimeout(disp, &event.event)) { Cursor cursor= swa_view.cursor; /* timeout expired. clean up and exit. */ swa_view.cursor= XCreateFontCursor(disp, XC_watch); XChangeWindowAttributes(disp, ImageWindow, CWCursor, &swa_view); XFreeCursor(disp, cursor); XFlush(disp); cleanUpImage(disp, scrn, swa_view.cursor, pixmap, image, ximageinfo); return('n'); } } else XNextEvent(disp, &event.event); switch (event.any.type) { case ButtonPress: if (event.button.button == 1) { lastx= event.button.x; lasty= event.button.y; break; } break; case KeyPress: { char buf[128]; KeySym ks; XComposeStatus status; char ret; Cursor cursor; if (XLookupString(&event.key,buf,128,&ks,&status) != 1) break; ret= buf[0]; if (isupper(ret)) ret= tolower(ret); switch (ret) { case ' ': case 'n': case 'p': if (delay) alarm(0); cursor= swa_view.cursor; swa_view.cursor= XCreateFontCursor(disp, XC_watch); XChangeWindowAttributes(disp, ViewportWin, CWCursor, &swa_view); XFreeCursor(disp, cursor); XFlush(disp); cleanUpImage(disp, scrn, swa_view.cursor, pixmap, image, ximageinfo); return(ret); case '\003': /* ^C */ case 'q': if (delay) alarm(0); cleanUpImage(disp, scrn, swa_view.cursor, pixmap, image, ximageinfo); return(ret); } break; } case MotionNotify: if ((image->width <= winwidth) && (image->height <= winheight)) break; /* we're AT&T */ mousex= event.button.x; mousey= event.button.y; /*XSync(disp, False); */ while (XCheckTypedEvent(disp, MotionNotify, (XEvent *) &event) == True) { mousex= event.button.x; mousey= event.button.y; } pixx -= (lastx - mousex); pixy -= (lasty - mousey); lastx= mousex; lasty= mousey; placeImage(disp, image->width, image->height, winwidth, winheight, &pixx, &pixy); break; case ConfigureNotify: winwidth= old_width= event.configure.width; winheight= old_height= event.configure.height; placeImage(disp, image->width, image->height, winwidth, winheight, &pixx, &pixy); /* configure the cursor to indicate which directions we can drag */ setCursor(disp, ViewportWin, image->width, image->height, winwidth, winheight, &(swa_view.cursor)); break; case DestroyNotify: cleanUpImage(disp, scrn, swa_view.cursor, pixmap, image, ximageinfo); return('\0'); case Expose: blitImage(ximageinfo, image->width, image->height, event.expose.x, event.expose.y, event.expose.width, event.expose.height); break; case EnterNotify: if (install) XInstallColormap(disp, ximageinfo->cmap); break; case LeaveNotify: if (install) XUninstallColormap(disp, ximageinfo->cmap); break; case ClientMessage: /* if we get a client message for the viewport window which has the * value of the delete atom, it means the window manager wants us to * die. */ if ((event.message.window == ViewportWin) && (event.message.data.l[0] == delete_atom)) { cleanUpImage(disp, scrn, swa_view.cursor, pixmap, image, ximageinfo); return('q'); } break; } } } kit/image/xbitmap.c010064400237450000000000000126370664163777700141000ustar nishidawheel/* xbitmap.c: * * at one time this was XRdBitF.c. it bears very little resemblence to it * now. that was ugly code. this is cleaner, faster, and more reliable * in most cases. * * jim frost 10.06.89 * * Copyright, 1987, Massachusetts Institute of Technology * * Copyright 1989 Jim Frost. See included file "copyright.h" for complete * copyright information. */ #include "mit.cpyrght" #include "copyright.h" #include "image.h" #include /* SUPPRESS 560 */ #if defined(SYSV) || defined(VMS) || 1 #include #define rindex strrchr #else char *rindex(); #endif #define MAX_SIZE 255 static short HexTable[256]; /* conversion value */ static unsigned int Initialized= 0; /* easier to fill in at run time */ #define b0000 0 /* things make more sense if you see them by bit */ #define b0001 1 #define b0010 2 #define b0011 3 #define b0100 4 #define b0101 5 #define b0110 6 #define b0111 7 #define b1000 8 #define b1001 9 #define b1010 10 #define b1011 11 #define b1100 12 #define b1101 13 #define b1110 14 #define b1111 15 #define HEXSTART -1 #define HEXDELIM -2 #define HEXBAD -3 /* build a hex digit value table with the bits inverted */ static void initHexTable() { int a; for (a= 0; a < 256; a++) HexTable[a]= HEXBAD; HexTable['0']= b0000; HexTable['1']= b1000; HexTable['2']= b0100; HexTable['3']= b1100; HexTable['4']= b0010; HexTable['5']= b1010; HexTable['6']= b0110; HexTable['7']= b1110; HexTable['8']= b0001; HexTable['9']= b1001; HexTable['A']= b0101; HexTable['a']= HexTable['A']; HexTable['B']= b1101; HexTable['b']= HexTable['B']; HexTable['C']= b0011; HexTable['c']= HexTable['C']; HexTable['D']= b1011; HexTable['d']= HexTable['D']; HexTable['E']= b0111; HexTable['e']= HexTable['E']; HexTable['F']= b1111; HexTable['f']= HexTable['F']; HexTable['x']= HEXSTART; HexTable['\r']= HEXDELIM; HexTable['\n']= HEXDELIM; HexTable['\t']= HEXDELIM; HexTable[' ']= HEXDELIM; HexTable[',']= HEXDELIM; HexTable['}']= HEXDELIM; Initialized = 1; } /* read a hex value and return its value */ static int nextInt(zf) ZFILE *zf; { int c; int value= 0; int shift= 0; for (;;) { c= zgetc(zf); if (c == EOF) return(-1); else { c= HexTable[c & 0xff]; switch(c) { case HEXSTART: shift= 0; /* reset shift counter */ break; case HEXDELIM: if (shift) return(value); break; case HEXBAD: return(-1); default: value += (c << shift); shift += 4; } } } } static void badFile(name) char *name; { fprintf(stderr, "%s: bad X bitmap file\n", name); cleanup(-1); } Image *xbitmapLoad(fullname, name, verbose) char *fullname, *name; unsigned int verbose; { ZFILE *zf; Image *image; char line[MAX_SIZE]; char name_and_type[MAX_SIZE]; char *type; int value; int v10p=0; unsigned int linelen, dlinelen; unsigned int x, y; unsigned int w = 0, h = 0; byte *dataptr; if (!Initialized) initHexTable(); if (! (zf= zopen(fullname))) return(NULL); /* get width/height values */ while (zgets((byte *)line, MAX_SIZE, zf)) { if (strlen(line) == MAX_SIZE-1) { zclose(zf); return(NULL); } /* width/height/hot_x/hot_y scanning */ if (sscanf(line,"#define %s %d", name_and_type, &value) == 2) { if (!(type = rindex(name_and_type, '_'))) type = name_and_type; else type++; if (!strcmp("width", type)) w= (unsigned int)value; if (!strcmp("height", type)) h= (unsigned int)value; } /* if start of data, determine if it's X10 or X11 data and break */ if (sscanf(line, "static short %s = {", name_and_type) == 1) { v10p = 1; break; } if ((sscanf(line,"static unsigned char %s = {", name_and_type) == 1) || (sscanf(line, "static char %s = {", name_and_type) == 1)) { v10p = 0; break; } } if (!w || !h) { zclose(zf); return(NULL); } image= newBitImage(w, h); /* get title of bitmap if any */ if ((type = rindex(name_and_type, '_')) && !strcmp("bits[]", type + 1)) { *type= '\0'; image->title= dupString(name_and_type); } /* read bitmap data */ linelen= (w / 8) + (w % 8 ? 1 : 0); /* internal line length */ if (v10p) { dlinelen= (w / 8) + (w % 16 ? 2 : 0); dataptr= image->data; for (y= 0; y < h; y++) { for (x= 0; x < dlinelen; x++) { if ((value= nextInt(zf)) < 0) { freeImage(image); zclose(zf); return(NULL); } *(dataptr++)= value >> 8; if (++x < linelen) *(dataptr++)= value & 0xff; } } } else { dataptr= image->data; for (y= 0; y < h; y++) for (x= 0; x < linelen; x++) { if ((value= nextInt(zf)) < 0) badFile(name); *(dataptr++)= value; } } if (verbose) { fprintf(stderr, "%s is a %dx%d X", name, image->width, image->height); if (v10p) fprintf(stderr, "10"); else fprintf(stderr, "11"); if (image->title) fprintf(stderr, " bitmap file titled '%s'", image->title); fprintf(stderr, "\n"); } zclose(zf); return(image); } /* this is the easiest way to do this. it's not likely we'll have mondo * x bitmaps anyway given their size */ int xbitmapIdent(fullname, name) char *fullname, *name; { Image *image; if ((image = xbitmapLoad(fullname, name, (unsigned int)1))) { freeImage(image); return(1); } return(0); } kit/image/xloadimage.h010064400237450000000000000055511114577676700145460ustar nishidawheel/* xloadimage.h: * * jim frost 06.21.89 * * Copyright 1989 Jim Frost. See included file "copyright.h" for complete * copyright information. */ #include "copyright.h" #include #include #include #include #include "image.h" #include "options.h" #ifdef USE_IMLIB #include #endif /* image name and option structure used when processing arguments */ typedef struct { char *name; /* name of image */ int atx, aty; /* location to load image at */ unsigned int bright; /* brightness multiplier */ unsigned int center; /* true if image is to be centered */ unsigned int clipx, clipy; /* area of image to be used */ unsigned int clipw, cliph; unsigned int colors; /* max # of colors to use for this image */ unsigned int delay; /* # of seconds delay before auto pic advance */ unsigned int dither; /* true if image is to be dithered */ float gamma; /* display gamma */ char *go_to; /* label to goto */ unsigned int gray; /* true if image is to be grayed */ unsigned int merge; /* true if we should merge onto previous */ unsigned int normalize; /* true if image is to be normalized */ int rotate; /* # degrees to rotate image */ unsigned int smooth; /* true if image is to be smoothed */ unsigned int xzoom, yzoom; /* zoom percentages */ char *fg, *bg; /* foreground/background colors if mono image */ } ImageOptions; /* This struct holds the X-client side bits for a rendered image. */ typedef struct { Display *disp; /* destination display */ int scrn; /* destination screen */ int depth; /* depth of drawable we want/have */ Drawable drawable; /* drawable to send image to */ Pixel foreground; /* foreground and background pixels for mono images */ Pixel background; Colormap cmap; /* colormap used for image */ GC gc; /* cached gc for sending image */ XImage *ximage; /* ximage structure */ } XImageInfo; #ifndef MAXIMAGES #define MAXIMAGES BUFSIZ /* max # of images we'll try to load at once */ #endif /* function declarations */ void supportedImageTypes(); /* imagetypes.c */ char *tail(); /* misc.c */ void memoryExhausted(); void internalError(); void version(); void usage(); void goodImage(); Image *processImage(); int errorHandler(); char *expandPath(); /* path.c */ int findImage(); void listImages(); void loadPathsAndExts(); void showPath(); void imageOnRoot(); /* root.c */ void sendXImage(); /* send.c */ XImageInfo *imageToXImage(); Pixmap ximageToPixmap(); void freeXImage(); Visual *getBestVisual(); /* visual.c */ int visualClassFromName(); /* window.c */ char *nameOfVisualClass(); void cleanUpWindow(); char imageInWindow(); kit/image/xpixmap.c010064400237450000000000000136430664164000000140650ustar nishidawheel/* xpixmap.c: * * XPixMap format file read and identify routines. these can handle any * "format 1" XPixmap file with up to BUFSIZ - 1 chars per pixel. it's * not nearly as picky as it might be. * * unlike most image loading routines, this is X specific since it * requires X color name parsing. to handle this we have global X * variables for display and screen. it's ugly but it keeps the rest * of the image routines clean. * * Copyright 1989 Jim Frost. See included file "copyright.h" for complete * copyright information. */ #include "copyright.h" #include "xloadimage.h" /* SUPPRESS 530 */ /* SUPPRESS 560 */ #if defined(SYSV) || defined(VMS) || 1 #include #define rindex strrchr #else char *rindex(); #endif extern Display *display; /* X display, null if in "identify" mode */ extern int screen; /* X screen number */ #define XPM_FORMAT 1 static void corrupted(fullname, zf) char *fullname; ZFILE *zf; { zclose(zf); fprintf(stderr, "%s: X Pixmap file is corrupted\n", fullname); cleanup(-1); } Image *xpixmapLoad(fullname, name, verbose) char *fullname, *name; unsigned int verbose; { ZFILE *zf; char buf[BUFSIZ]; char what[BUFSIZ]; char *p; char *imagetitle; unsigned int value; unsigned int format; /* image format */ unsigned int w, h; /* image dimensions */ unsigned int cpp=0; /* chars per pixel */ unsigned int ncolors; /* number of colors */ unsigned int depth; /* depth of image */ char **ctable; /* color table */ Image *image; XColor xcolor; unsigned int a, b, x, y; int c; byte *dptr; if (! (zf= zopen(fullname))) return(NULL); /* read #defines until we have all that are necessary or until we * get an error */ format= w= h= ncolors= 0; for (;;) { if (! zgets((byte *)buf, BUFSIZ - 1, zf)) { zclose(zf); return(NULL); } if (!strncmp(buf, "#define", 7)) { if (sscanf(buf, "#define %s %d", what, &value) != 2) { zclose(zf); return(NULL); } if (! (p= rindex(what, '_'))) p= what; else p++; if (!strcmp(p, "format")) format= value; else if (!strcmp(p, "width")) w= value; else if (!strcmp(p, "height")) h= value; else if (!strcmp(p, "ncolors")) ncolors= value; /* this one is ugly */ else if (!strcmp(p, "pixel")) { /* this isn't pretty but it works */ if (p == what) continue; *(--p)= '\0'; if (!(p= rindex(what, '_')) || (p == what) || strcmp(++p, "per")) continue; *(--p)= '\0'; if (!(p= rindex(what, '_'))) p= what; if (strcmp(++p, "chars")) continue; cpp= value; } } else if ((sscanf(buf, "static char * %s", what) == 1) && (p= rindex(what, '_')) && !strcmp(++p, "colors[]")) break; } if ((format != XPM_FORMAT) || !w || !h || !ncolors || !cpp) { zclose(zf); return(NULL); } if ((p = rindex(what, '_'))) { /* get the name in the image if there is */ *p= '\0'; /* one */ imagetitle= dupString(what); } else { p= what; imagetitle= dupString(name); } if (verbose) fprintf(stderr, "%s is a %dx%d X Pixmap image with %d colors titled '%s'\n", name, w, h, ncolors, imagetitle); for (depth= 1, value= 2; value < ncolors; value <<= 1, depth++) ; image= newRGBImage(w, h, depth); image->rgb.used= ncolors; image->title= dupString(imagetitle); /* read the colors array and build the image colormap */ ctable= (char **)lmalloc(sizeof(char *) * ncolors); xcolor.flags= DoRed | DoGreen | DoBlue; for (a= 0; a < ncolors; a++) { /* read pixel value */ *(ctable + a)= (char *)lmalloc(cpp); while (((c= zgetc(zf)) != EOF) && (c != '"')) ; if (c == EOF) corrupted(fullname, zf); for (b= 0; b < cpp; b++) { if ((c= zgetc(zf)) == '\\') c= zgetc(zf); if (c == EOF) corrupted(fullname, zf); *(*(ctable + a) + b)= (char)c; } if (((c= zgetc(zf)) == EOF) || (c != '"')) corrupted(fullname, zf); /* read color definition and parse it */ while (((c= zgetc(zf)) != EOF) && (c != '"')) ; if (c == EOF) corrupted(fullname, zf); for (b= 0; ((c= zgetc(zf)) != EOF) && (c != '"'); b++) { if (c == '\\') c= zgetc(zf); if (c == EOF) corrupted(fullname, zf); buf[b]= (char)c; } buf[b]= '\0'; if (display) { if (! XParseColor(display, DefaultColormap(display, screen), buf, &xcolor)) { fprintf(stderr, "%s: %s: Bad color name\n", fullname, buf); cleanup(-1); } *(image->rgb.red + a)= xcolor.red; *(image->rgb.green + a)= xcolor.green; *(image->rgb.blue + a)= xcolor.blue; } } for (;;) { if (! zgets((byte *)buf, BUFSIZ - 1, zf)) corrupted(fullname, zf); if (sscanf(buf, "static char * %s", what) == 1) break; } if ((p = rindex(what, '_'))) p++; else p= what; if (strcmp(p, "pixels[]")) corrupted(fullname, zf); /* read in image data */ dptr= image->data; for (y= 0; y < h; y++) { while (((c= zgetc(zf)) != EOF) && (c != '"')) ; for (x= 0; x < w; x++) { for (a= 0; a < cpp; a++) { if ((c= zgetc(zf)) == '\\') c= zgetc(zf); if (c == EOF) corrupted(fullname, zf); buf[a]= (char)c; } for (a= 0; a < ncolors; a++) if (!strncmp(*(ctable + a), buf, cpp)) break; if (a == ncolors) { /* major uncool */ zclose(zf); fprintf(stderr, "%s: Pixel data doesn't match color data\n", fullname); cleanup(-1); } valToMem((unsigned long)a, dptr, image->pixlen); dptr += image->pixlen; } if ((c= zgetc(zf)) != '"') corrupted(fullname, zf); } zclose(zf); return(image); } int xpixmapIdent(fullname, name) char *fullname, *name; { Image *image; if ((image = xpixmapLoad(fullname, name, (unsigned int)1))) { freeImage(image); return(1); } return(0); } kit/image/xwd.h010064400237450000000000000067700642466042700132270ustar nishidawheel/* xwd.h: * * portable-ized xwd file information. they could have made this easier. * * jim frost 07.24.90 * * Copyright 1989 Jim Frost. See included file "copyright.h" for complete * copyright information. */ #define XWD_VERSION 7 /* XWD version we support */ typedef struct { byte header_size[4]; /* Size of the entire file header (bytes). */ byte file_version[4]; /* XWD_FILE_VERSION */ byte pixmap_format[4]; /* Pixmap format */ byte pixmap_depth[4]; /* Pixmap depth */ byte pixmap_width[4]; /* Pixmap width */ byte pixmap_height[4]; /* Pixmap height */ byte xoffset[4]; /* Bitmap x offset */ byte byte_order[4]; /* MSBFirst, LSBFirst */ byte bitmap_unit[4]; /* Bitmap unit */ byte bitmap_bit_order[4]; /* MSBFirst, LSBFirst */ byte bitmap_pad[4]; /* Bitmap scanline pad */ byte bits_per_pixel[4]; /* Bits per pixel */ byte bytes_per_line[4]; /* Bytes per scanline */ byte visual_class[4]; /* Class of colormap */ byte red_mask[4]; /* Z red mask */ byte green_mask[4]; /* Z green mask */ byte blue_mask[4]; /* Z blue mask */ byte bits_per_rgb[4]; /* Log2 of distinct color values */ byte colormap_entries[4]; /* Number of entries in colormap */ byte ncolors[4]; /* Number of Color structures */ byte window_width[4]; /* Window width */ byte window_height[4]; /* Window height */ byte window_x[4]; /* Window upper left X coordinate */ byte window_y[4]; /* Window upper left Y coordinate */ byte window_bdrwidth[4]; /* Window border width */ } GenericXWDHeader; typedef struct { unsigned int header_size; /* Size of the entire file header (bytes). */ unsigned int file_version; /* XWD_FILE_VERSION */ unsigned int pixmap_format; /* Pixmap format */ unsigned int pixmap_depth; /* Pixmap depth */ unsigned int pixmap_width; /* Pixmap width */ unsigned int pixmap_height; /* Pixmap height */ unsigned int xoffset; /* Bitmap x offset */ unsigned int byte_order; /* MSBFirst, LSBFirst */ unsigned int bitmap_unit; /* Bitmap unit */ unsigned int bitmap_bit_order; /* MSBFirst, LSBFirst */ unsigned int bitmap_pad; /* Bitmap scanline pad */ unsigned int bits_per_pixel; /* Bits per pixel */ unsigned int bytes_per_line; /* Bytes per scanline */ unsigned int visual_class; /* Class of colormap */ /*unsigned int red_mask;*/ /* Z red mask */ /*unsigned int green_mask;*/ /* Z green mask */ /*unsigned int blue_mask;*/ /* Z blue mask */ /*unsigned int bits_per_rgb;*/ /* Log2 of distinct color values */ unsigned int colormap_entries; /* Number of entries in colormap */ unsigned int ncolors; /* Number of Color structures */ /*unsigned int window_width;*/ /* Window width */ /*unsigned int window_height;*/ /* Window height */ /*unsigned int window_x;*/ /* Window upper left X coordinate */ /*unsigned int window_y;*/ /* Window upper left Y coordinate */ /*unsigned int window_bdrwidth;*//* Window border width */ } XWDHeader; typedef struct { byte pixel[4]; /* pixel value for this color */ byte red[2]; /* red intensity */ byte green[2]; /* green intensity */ byte blue[2]; /* blue intensity */ byte flags; /* XColor flags (ignored) */ byte pad; } XWDColor; #define NOT_XWD 0 /* definitely not an XWD file */ #define XWD_MSB 1 /* looks like XWD file created on MSBFirst machine */ #define XWD_LSB 2 /* looks like XWD file created on LSBFirst machine */ kit/image/zio.c010064400237450000000000000141511010174522300131720ustar nishidawheel/* zio.c: * * this properly opens and reads from an image file, compressed or otherwise. * * jim frost 10.03.89 * * this was hacked on 09.12.90 to cache reads and to use stdin. * * Copyright 1989, 1990 Jim Frost. See included file "copyright.h" for * complete copyright information. */ #include "copyright.h" #include "image.h" #ifdef VMS #define NO_UNCOMPRESS /* VMS doesn't have uncompress */ #endif #define MAX_ZFILES 32 static ZFILE ZFileTable[MAX_ZFILES]; /* read some info through the read cache */ static int doRead(zf, buf, len) ZFILE *zf; byte *buf; int len; { int bread, readlen; /* loop through the read */ for (bread= 0; bread < len; bread += readlen, zf->bufptr += readlen) { /* read new or move to next data block if necessary */ if (!zf->dataptr || (zf->bufptr == zf->dataptr->len)) { if (zf->dataptr && zf->dataptr->next) zf->dataptr= zf->dataptr->next; else { if (!zf->dataptr) { /* if the reader told us to stop caching, just do the read. */ if (zf->nocache) return(fread(zf->dataptr->buf, 1, BUFSIZ, zf->stream)); zf->data= zf->dataptr= (struct cache *)lmalloc(sizeof(struct cache)); } else { zf->dataptr->next= (struct cache *)lmalloc(sizeof(struct cache)); zf->dataptr= zf->dataptr->next; } zf->dataptr->next= NULL; zf->dataptr->len= fread(zf->dataptr->buf, 1, BUFSIZ, zf->stream); if (zf->dataptr->len < 0) { perror("fread"); cleanup(-1); } } zf->bufptr= 0; } /* calculate length we can get out of read buffer */ readlen= (len - bread > zf->dataptr->len - zf->bufptr ? zf->dataptr->len - zf->bufptr : len - bread); if (!readlen) /* we're at EOF */ return(bread); memcpy(buf + bread, zf->dataptr->buf + zf->bufptr, readlen); } return(bread); } /* reset a read cache */ void zreset(filename) char *filename; { int a; struct cache *old; /* if NULL filename, reset the entire table */ if (!filename) { for (a= 0; a < MAX_ZFILES; a++) if (ZFileTable[a].filename) zreset(ZFileTable[a].filename); return; } for (a= 0; a < MAX_ZFILES; a++) if (ZFileTable[a].filename && !strcmp(filename, ZFileTable[a].filename)) break; if (a == MAX_ZFILES) /* no go joe */ return; if (ZFileTable[a].dataptr != ZFileTable[a].data) fprintf(stderr, "zreset: warning: ZFILE for %s was not closed properly\n", ZFileTable[a].filename); while (ZFileTable[a].data) { old= ZFileTable[a].data; ZFileTable[a].data= ZFileTable[a].data->next; lfree(old); } lfree((byte *)ZFileTable[a].filename); ZFileTable[a].filename= NULL; ZFileTable[a].dataptr= NULL; ZFileTable[a].bufptr= 0; ZFileTable[a].nocache= 0; switch(ZFileTable[a].type) { case ZSTANDARD: fclose(ZFileTable[a].stream); break; #ifndef NO_UNCOMPRESS case ZPIPE: pclose(ZFileTable[a].stream); break; #endif /* NO_UNCOMPRESS */ case ZSTDIN: break; default: fprintf(stderr, "zreset: bad ZFILE structure\n"); cleanup(-1); } } #ifdef __APPLE__ ZFILE *zzopen(name) #else ZFILE *zopen(name) #endif char *name; { int a; ZFILE *zf; char buf[BUFSIZ]; /* look for filename in open file table */ for (a= 0; a < MAX_ZFILES; a++) if (ZFileTable[a].filename && !strcmp(name, ZFileTable[a].filename)) { /* if we try to reopen a file whose caching was disabled, warn the user * and try to recover. we cannot recover if it was stdin. */ if (ZFileTable[a].nocache) { if (ZFileTable[a].type == ZSTDIN) { fprintf(stderr, "zopen: caching was disabled by previous caller; can't reopen stdin\n"); return(NULL); } fprintf(stderr, "zopen: warning: caching was disabled by previous caller\n"); zreset(ZFileTable[a].filename); break; } if (ZFileTable[a].dataptr != ZFileTable[a].data) fprintf(stderr, "zopen: warning: file doubly opened\n"); ZFileTable[a].dataptr= ZFileTable[a].data; ZFileTable[a].bufptr= 0; return(ZFileTable + a); } /* find open ZFileTable entry */ for (a= 0; (a < MAX_ZFILES) && ZFileTable[a].filename; a++) /* EMPTY */ ; if (a == MAX_ZFILES) { fprintf(stderr, "zopen: no more files available\n"); cleanup(-1); } zf= ZFileTable + a; zf->filename= dupString(name); zf->dataptr= NULL; zf->bufptr= 0; zf->nocache= 0; /* file filename is `stdin' then use stdin */ if (!strcmp(name, "stdin")) { zf->type= ZSTDIN; zf->stream= stdin; return(zf); } #ifndef NO_UNCOMPRESS /* if filename ends in `.Z' then open pipe to uncompress. if your * system doesn't have uncompress you can define NO_UNCOMPRESS and * it just won't check for this. */ if ((strlen(name) > 2) && !strcmp(".Z", name + (strlen(name) - 2))) { zf->type= ZPIPE; sprintf(buf, "uncompress -c %s", name); if (! (zf->stream= popen(buf, "r"))) { lfree(zf->filename); zf->filename= NULL; return(NULL); } return(zf); } #endif /* default to normal stream */ zf->type= ZSTANDARD; if (! #ifdef VMS (zf->stream= fopen(name, "r", "ctx=bin", "ctx=stm", "rfm=stmlf")) #else (zf->stream= fopen(name, "r")) #endif ) { lfree(zf->filename); zf->filename= NULL; return(NULL); } return(zf); } int zread(zf, buf, len) ZFILE *zf; byte *buf; unsigned int len; { return(doRead(zf, buf, len)); } int zgetc(zf) ZFILE *zf; { unsigned char c; if (doRead(zf, &c, 1) > 0) return(c); else return(EOF); } char *zgets(buf, size, zf) byte *buf; unsigned int size; ZFILE *zf; { int p= 0; while (doRead(zf, buf + p, 1) > 0) { if (p == size) return((char *)buf); if (*(buf + p) == '\n') { *(buf + p + 1)= '\0'; return((char *)buf); } p++; } return(NULL); } /* this turns off caching when an image has been identified and we will not * need to re-open it */ void znocache(zf) ZFILE *zf; { zf->nocache= 1; } /* reset cache pointers in a ZFILE. nothing is actually reset until a * zreset() is called with the filename. */ void zclose(zf) ZFILE *zf; { zf->dataptr= zf->data; zf->bufptr= 0; } kit/image/zoom.c010064400237450000000000000111700772160402100133570ustar nishidawheel/* zoom.c: * * zoom an image * * jim frost 10.11.89 * * Copyright 1989 Jim Frost. See included file "copyright.h" for complete * copyright information. */ #include "copyright.h" #include "image.h" static unsigned int *buildIndex(width, zoom, rwidth) unsigned int width; float zoom; unsigned int *rwidth; { float fzoom; unsigned int *index; unsigned int a; if (!zoom) { fzoom= 100.0; *rwidth= width; } else { fzoom= (float)zoom / 100.0; *rwidth= fzoom * width; } index= (unsigned int *)lmalloc(sizeof(unsigned int) * *rwidth); for (a= 0; a < *rwidth; a++) if (zoom) *(index + a)= (float)a / fzoom; else *(index + a)= a; return(index); } Image *zoom(oimage, xzoom, yzoom, verbose) Image *oimage; float xzoom, yzoom; { char buf[BUFSIZ]; Image *image=NULL; unsigned int *xindex, *yindex; unsigned int xwidth, ywidth; unsigned int x, y, xsrc, ysrc; unsigned int pixlen; unsigned int srclinelen; unsigned int destlinelen; byte *srcline, *srcptr; byte *destline, *destptr; byte srcmask, destmask, bit; Pixel value; goodImage(oimage, "zoom"); if ((xzoom == 0.0) && (yzoom == 0.0)) /* stupid user */ return(NULL); if (xzoom == 0.0) { if (verbose) fprintf(stderr, " Zooming image Y axis by %0.2f%%...", yzoom); if (oimage->title) sprintf(buf, "%s (Y zoom %0.2f%%)", oimage->title, yzoom); } else if (yzoom == 0.0) { if (verbose) fprintf(stderr, " Zooming image X axis by %0.2f%%...", xzoom); if (oimage->title) sprintf(buf, "%s (X zoom %0.2f%%)", oimage->title, xzoom); } else if (xzoom == yzoom) { if (verbose) fprintf(stderr, " Zooming image by %0.2f%%...", xzoom); if (oimage->title) sprintf(buf, "%s (%d%% zoom)", oimage->title, xzoom); } else { if (verbose) fprintf(stderr, " Zooming image X axis by %0.2f%% and Y axis by %0.2f%%...", xzoom, yzoom); if (oimage->title) sprintf(buf, "%s (X zoom %0.2f%% Y zoom %0.2f%%)", oimage->title, xzoom, yzoom); } if (verbose) fflush(stderr); xindex= buildIndex(oimage->width, xzoom, &xwidth); yindex= buildIndex(oimage->height, yzoom, &ywidth); switch (oimage->type) { case IBITMAP: image= newBitImage(xwidth, ywidth); for (x= 0; x < oimage->rgb.used; x++) { *(image->rgb.red + x)= *(oimage->rgb.red + x); *(image->rgb.green + x)= *(oimage->rgb.green + x); *(image->rgb.blue + x)= *(oimage->rgb.blue + x); } image->rgb.used= oimage->rgb.used; destline= image->data; destlinelen= (xwidth / 8) + (xwidth % 8 ? 1 : 0); srcline= oimage->data; srclinelen= (oimage->width / 8) + (oimage->width % 8 ? 1 : 0); for (y= 0, ysrc= *(yindex + y); y < ywidth; y++) { while (ysrc != *(yindex + y)) { ysrc++; srcline += srclinelen; } srcptr= srcline; destptr= destline; srcmask= 0x80; destmask= 0x80; bit= srcmask & *srcptr; for (x= 0, xsrc= *(xindex + x); x < xwidth; x++) { if (xsrc != *(xindex + x)) { do { xsrc++; if (!(srcmask >>= 1)) { srcmask= 0x80; srcptr++; } } while (xsrc != *(xindex + x)); bit= srcmask & *srcptr; } if (bit) *destptr |= destmask; if (!(destmask >>= 1)) { destmask= 0x80; destptr++; } } destline += destlinelen; } break; case IRGB: image= newRGBImage(xwidth, ywidth, oimage->depth); for (x= 0; x < oimage->rgb.used; x++) { *(image->rgb.red + x)= *(oimage->rgb.red + x); *(image->rgb.green + x)= *(oimage->rgb.green + x); *(image->rgb.blue + x)= *(oimage->rgb.blue + x); } image->rgb.used= oimage->rgb.used; /* FALLTHRU */ case ITRUE: if (!RGBP(oimage)) image= newTrueImage(xwidth, ywidth); pixlen= oimage->pixlen; destptr= image->data; srcline= oimage->data; srclinelen= oimage->width * pixlen; for (y= 0, ysrc= *(yindex + y); y < ywidth; y++) { while (ysrc != *(yindex + y)) { ysrc++; srcline += srclinelen; } srcptr= srcline; value= memToVal(srcptr, pixlen); for (x= 0, xsrc= *(xindex + x); x < xwidth; x++) { if (xsrc != *(xindex + x)) { do { xsrc++; srcptr += image->pixlen; } while (xsrc != *(xindex + x)); value= memToVal(srcptr, pixlen); } valToMem(value, destptr, pixlen); destptr += pixlen; } } break; } if (image) { image->title= dupString(buf); image->trans = oimage->trans; } lfree((byte *)xindex); lfree((byte *)yindex); if (verbose) fprintf(stderr, "done\n"); return(image); } kit/missing004075500237450000000000000000001114712475300125505ustar nishidawheelkit/missing/memcmp.c010064400237450000000000000035400657071655200142600ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: memcmp.c,v 1.3 1998/08/26 05:30:18 itojun Exp $ */ #include int memcmp(b1, b2, len) const void *b1; const void *b2; size_t len; { const u_char *p1; const u_char *p2; p1 = (u_char *)b1; p2 = (u_char *)b2; while (len--) { if (*p1 != *p2) return *p1 - *p2; p1++; p2++; } return 0; } kit/missing/mkstemp.c010064400237450000000000000037630657071655200144710ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: mkstemp.c,v 1.2 1998/08/26 05:30:18 itojun Exp $ */ #include #include int mkstemp(template) char *template; { char *s; int fd; pid_t pid; pid = getpid(); for (s = template; *s; s++) ; while (*--s == 'X') { *s = '0' + (pid % 10); pid /= 10; } s++; while ((fd = open(template, O_CREAT|O_EXCL|O_RDWR, 0600)) < 0) { if (errno != EEXIST || *s == 'z') return fd; if (*s < 'a') *s = 'a'; else ++*s; } return fd; } kit/missing/snprintf.c010064400237450000000000000045220657466043000146430ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: snprintf.c,v 1.3 1998/09/07 04:29:12 onoe Exp $ */ #include #include extern int _doprnt(); extern FILE *_findiop(); int vsnprintf(char *string, int n, const char *fmt, va_list ap) { int ret; FILE *fp; if (n < 1) return EOF; fp = _findiop(); fp->_file = -1; fp->_cnt = n; fp->_base = fp->_ptr = (unsigned char *)string; #ifdef HAVE__SETBUFEND _setbufend(fp, string + n); #else fp->_bufsiz = n; #endif fp->_flag = _IOWRT; ret = _doprnt(fmt, ap, fp); if (fp->_flag & _IOERR) { string[n - 1] = '\0'; return n; } *fp->_ptr = '\0'; fp->_base = fp->_ptr = 0; fp->_cnt = 0; fp->_flag = 0; return ret; } int snprintf(char *string, int n, const char *fmt, ...) { int ret; va_list ap; va_start(ap, fmt); ret = vsnprintf(string, n, fmt, ap); va_end(ap); return ret; } kit/missing/strdup.c010064400237450000000000000034270657071655300143300ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: strdup.c,v 1.3 1998/08/26 05:30:19 itojun Exp $ */ #include #include #include char * strdup(str) const char *str; { char *p; p = (char *)malloc(strlen(str) + 1); if (p) strcpy(p, str); return p; } kit/missing/strlcat.c010064400237450000000000000035231001773050700144420ustar nishidawheel/* $OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $ */ /* * Copyright (c) 1998 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #if defined(LIBC_SCCS) && !defined(lint) static char *rcsid = "$OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $"; #endif /* LIBC_SCCS and not lint */ #include #include /* * Appends src to string dst of size siz (unlike strncat, siz is the * full size of dst, not space left). At most siz-1 characters * will be copied. Always NUL terminates (unless siz <= strlen(dst)). * Returns strlen(src) + MIN(siz, strlen(initial dst)). * If retval >= siz, truncation occurred. */ size_t strlcat(char *dst, const char *src, size_t siz) { register char *d = dst; register const char *s = src; register size_t n = siz; size_t dlen; /* Find the end of dst and adjust bytes left but don't go past end */ while (n-- != 0 && *d != '\0') d++; dlen = d - dst; n = siz - dlen; if (n == 0) return(dlen + strlen(s)); while (*s != '\0') { if (n != 1) { *d++ = *s; n--; } s++; } *d = '\0'; return(dlen + (s - src)); /* count does not include NUL */ } kit/missing/strlcpy.c010064400237450000000000000033421001773050700144650ustar nishidawheel/* $OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $ */ /* * Copyright (c) 1998 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #if defined(LIBC_SCCS) && !defined(lint) static char *rcsid = "$OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $"; #endif /* LIBC_SCCS and not lint */ #include #include /* * Copy src to string dst of size siz. At most siz-1 characters * will be copied. Always NUL terminates (unless siz == 0). * Returns strlen(src); if retval >= siz, truncation occurred. */ size_t strlcpy(char *dst, const char *src, size_t siz) { register char *d = dst; register const char *s = src; register size_t n = siz; /* Copy as many bytes as will fit */ if (n != 0 && --n != 0) { do { if ((*d++ = *s++) == 0) break; } while (--n != 0); } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (siz != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return(s - src - 1); /* count does not include NUL */ } kit/missing/strsep.c010064400237450000000000000040070657071655300143220ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: strsep.c,v 1.3 1998/08/26 05:30:19 itojun Exp $ */ #include #include #include char * strsep(stringp, delim) char **stringp; register const char *delim; { register char *s = *stringp; register const char *dl; char c, d; char *ret; if (s == NULL) return s; for (ret = s; c = *s; s++) { for (dl = delim; d = *dl; dl++) { if (c == d) { *s = '\0'; *stringp = s + 1; return ret; } } } *stringp = NULL; return ret; } kit/missing/usleep.c010064400237450000000000000040120657071655400142740ustar nishidawheel/* * Copyright (C) 1997 and 1998 WIDE Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * $Id: usleep.c,v 1.3 1998/08/26 05:30:20 itojun Exp $ */ #include #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif void usleep(usec) u_int usec; { #ifdef HAVE_POLL (void)poll(NULL, 0, usec/1000); #else /* HAVE_POLL */ struct timeval tv; tv.tv_sec = usec / 1000000; tv.tv_usec = usec % 1000000; (void)select(0, NULL, NULL, NULL, &tv); #endif /* HAVE_POLL */ }